Message ID | 53B55EE0.1050403@acm.org (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Thu, 2014-07-03 at 15:47 +0200, Bart Van Assche wrote: > - 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 (rsp->flags & SRP_RSP_FLAG_DIUNDER) > scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt)); > + else if (rsp->flags & SRP_RSP_FLAG_DIOVER) > + scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_in_res_cnt)); > + else if (rsp->flags & SRP_RSP_FLAG_DOUNDER) > + scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt)); > + else if (rsp->flags & SRP_RSP_FLAG_DOOVER) > + scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_out_res_cnt)); LGTM. I wonder if we're getting to a point we should hide all the flag checking behind a if (unlikely(rsp->flags)) { ... -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 7670008..6abfff4 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -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 (rsp->flags & SRP_RSP_FLAG_DIUNDER) scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt)); + else if (rsp->flags & SRP_RSP_FLAG_DIOVER) + scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_in_res_cnt)); + else if (rsp->flags & SRP_RSP_FLAG_DOUNDER) + scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt)); + else if (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));
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> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Sebastian Parschauer <sebastian.riemer@profitbricks.com> Cc: David Dillow <dave@thedillows.org> --- drivers/infiniband/ulp/srp/ib_srp.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)