forked from Minki/linux
IB/srp: Fix residual handling
From Documentation/scsi/scsi_mid_low_api.txt: "resid - an LLD should set this signed integer to the requested transfer length (i.e. 'request_bufflen') less the number of bytes that are actually transferred." This means that resid > 0 in case of an underrun and also that resid < 0 in case of an overrun. Modify the SRP initiator code such that it matches this requirement. Signed-off-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: David Dillow <dave@thedillows.org> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
bcc0591035
commit
e714531a34
@ -1644,10 +1644,14 @@ static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
|
||||
SCSI_SENSE_BUFFERSIZE));
|
||||
}
|
||||
|
||||
if (rsp->flags & (SRP_RSP_FLAG_DOOVER | SRP_RSP_FLAG_DOUNDER))
|
||||
scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt));
|
||||
else if (rsp->flags & (SRP_RSP_FLAG_DIOVER | SRP_RSP_FLAG_DIUNDER))
|
||||
if (unlikely(rsp->flags & SRP_RSP_FLAG_DIUNDER))
|
||||
scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt));
|
||||
else if (unlikely(rsp->flags & SRP_RSP_FLAG_DIOVER))
|
||||
scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_in_res_cnt));
|
||||
else if (unlikely(rsp->flags & SRP_RSP_FLAG_DOUNDER))
|
||||
scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt));
|
||||
else if (unlikely(rsp->flags & SRP_RSP_FLAG_DOOVER))
|
||||
scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_out_res_cnt));
|
||||
|
||||
srp_free_req(target, req, scmnd,
|
||||
be32_to_cpu(rsp->req_lim_delta));
|
||||
|
Loading…
Reference in New Issue
Block a user