Re: [PATCH] RDMA/srpt: Report the SCSI residual to the initiator

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 05, 2019 at 01:46:32PM -0800, Bart Van Assche wrote:
> The code added by this patch is similar to the code that already exists
> in ibmvscsis_determine_resid(). This patch has been tested by running
> the following command:
> 
> strace sg_raw -r 1k /dev/sdb 12 00 00 00 60 00 -o inquiry.bin |&
>     grep resid=
> 
> Cc: Honggang LI <honli@xxxxxxxxxx>
> Cc: Laurence Oberman <loberman@xxxxxxxxxx>
> Fixes: a42d985bd5b2 ("ib_srpt: Initial SRP Target merge for v3.3-rc1")
> Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx>
> ---
>  drivers/infiniband/ulp/srpt/ib_srpt.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
> index 653de1583cf9..23c782e3d49a 100644
> --- a/drivers/infiniband/ulp/srpt/ib_srpt.c
> +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
> @@ -1362,9 +1362,11 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch,
>  			      struct srpt_send_ioctx *ioctx, u64 tag,
>  			      int status)
>  {
> +	struct se_cmd *cmd = &ioctx->cmd;
>  	struct srp_rsp *srp_rsp;
>  	const u8 *sense_data;
>  	int sense_data_len, max_sense_len;
> +	u32 resid = cmd->residual_count;
>  
>  	/*
>  	 * The lowest bit of all SAM-3 status codes is zero (see also
> @@ -1386,6 +1388,28 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch,
>  	srp_rsp->tag = tag;
>  	srp_rsp->status = status;
>  
> +	if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) {
> +		if (cmd->data_direction == DMA_TO_DEVICE) {
> +			/* residual data from an underflow write */
> +			srp_rsp->flags = SRP_RSP_FLAG_DOUNDER;
> +			srp_rsp->data_out_res_cnt = cpu_to_be32(resid);
> +		} else if (cmd->data_direction == DMA_FROM_DEVICE) {
> +			/* residual data from an underflow read */
> +			srp_rsp->flags = SRP_RSP_FLAG_DIUNDER;
> +			srp_rsp->data_in_res_cnt = cpu_to_be32(resid);
> +		}
> +	} else if (cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
> +		if (cmd->data_direction == DMA_TO_DEVICE) {
> +			/* residual data from an overflow write */
> +			srp_rsp->flags = SRP_RSP_FLAG_DOOVER;
> +			srp_rsp->data_out_res_cnt = cpu_to_be32(resid);
> +		} else if (cmd->data_direction == DMA_FROM_DEVICE) {
> +			/* residual data from an overflow read */
> +			srp_rsp->flags = SRP_RSP_FLAG_DIOVER;
> +			srp_rsp->data_in_res_cnt = cpu_to_be32(resid);
> +		}
> +	}
> +
>  	if (sense_data_len) {
>  		BUILD_BUG_ON(MIN_MAX_RSP_SIZE <= sizeof(*srp_rsp));
>  		max_sense_len = ch->max_ti_iu_len - sizeof(*srp_rsp);

Acked-by: Honggang Li <honli@xxxxxxxxxx>





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux