[stgt] [PATCH 1/2] Fix buffer_offset set to 0 in the last Data-IN carrying status

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sat Jun 1 15:59:36 CEST 2013


Thanks so much for working on this bug!

On Fri, 31 May 2013 01:19:45 +0300
nezhinsky at gmail.com wrote:

> From: Alexander Nezhinsky <nezhinsky at gmail.com>
> 
> The same function was called both for setting residual counts
> in data_in with status and scsi_response pdus. Bi-directional
> status, being set to 0 for scsi_response when data_in is actually
> passed, resets buffer_offset field inadvertently.
> 
> This precluded formatting LUNs exported thru iSCSI to a Windows
> initiator.
> 
> The fix is to separate these cases and to call a specialized
> function for reseidual count carried in data_in with status.
> ---
>  usr/iscsi/iscsid.c |   18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
> index b10be1d..e1180fb 100644
> --- a/usr/iscsi/iscsid.c
> +++ b/usr/iscsi/iscsid.c
> @@ -1012,6 +1012,21 @@ static void cmnd_finish(struct iscsi_connection *conn)
>  	}
>  }
>  
> +void iscsi_set_data_rsp_residual(struct iscsi_data_rsp *data_in, struct scsi_cmd *scmd)
> +{
> +	int32_t resid = scsi_get_in_resid(scmd);
> +
> +	if (likely(!resid))
> +		data_in->residual_count = 0;
> +	else if (resid > 0) {
> +		data_in->flags |= ISCSI_FLAG_CMD_UNDERFLOW;
> +		data_in->residual_count = cpu_to_be32((uint32_t)resid);
> +	} else {
> +		data_in->flags |= ISCSI_FLAG_CMD_OVERFLOW;
> +		data_in->residual_count = cpu_to_be32((uint32_t)-resid);
> +	}
> +}
> +
>  static inline void iscsi_rsp_set_resid(struct iscsi_cmd_rsp *rsp,
>  				       int32_t resid)
>  {
> @@ -1128,8 +1143,7 @@ static int iscsi_data_rsp_build(struct iscsi_task *task)
>  			rsp->flags |= ISCSI_FLAG_DATA_STATUS;
>  			rsp->cmd_status = result;
>  			rsp->statsn = cpu_to_be32(conn->stat_sn++);
> -			iscsi_rsp_set_residual((struct iscsi_cmd_rsp *) rsp,
> -					       &task->scmd);
> +			iscsi_set_data_rsp_residual(rsp, &task->scmd);

Hmm, currently, iscsi_rsp_set_residual() leads to:

iscsi_rsp_set_resid(rsp, scsi_get_in_resid(scmd))

Looks like it does the same thing with this patch.



>  		}
>  	} else
>  		datalen = maxdatalen;
> -- 
> 1.7.9.6
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list