Message ID | 5368DBC5.6070609@acm.org (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On 5/6/2014 3:55 PM, Bart Van Assche wrote: > Only request the SCSI mid-layer to retry a SCSI command after a > temporary mapping failure (-ENOMEM) but not after a permanent > mapping failure. This patch avoids that SCSI commands are retried > indefinitely if a permanent memory mapping failure occurs. > > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > Cc: Roland Dreier <roland@purestorage.com> > Cc: David Dillow <dave@thedillows.org> > Cc: Sagi Grimberg <sagig@mellanox.com> > Cc: Vu Pham <vu@mellanox.com> > Cc: Sebastian Parschauer <sebastian.riemer@profitbricks.com> > --- > drivers/infiniband/ulp/srp/ib_srp.c | 19 ++++++++++++------- > 1 file changed, 12 insertions(+), 7 deletions(-) > > diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c > index 1c4b0d3..af94381 100644 > --- a/drivers/infiniband/ulp/srp/ib_srp.c > +++ b/drivers/infiniband/ulp/srp/ib_srp.c > @@ -1564,7 +1564,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) > struct srp_cmd *cmd; > struct ib_device *dev; > unsigned long flags; > - int len, result; > + int len, result, ret = SCSI_MLQUEUE_HOST_BUSY; > const bool in_scsi_eh = !in_interrupt() && current == shost->ehandler; > > /* > @@ -1580,6 +1580,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) > if (unlikely(result)) { > scmnd->result = result; > scmnd->scsi_done(scmnd); > + ret = 0; > goto unlock_rport; > } > > @@ -1613,7 +1614,12 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) > len = srp_map_data(scmnd, target, req); > if (len < 0) { > shost_printk(KERN_ERR, target->scsi_host, > - PFX "Failed to map data\n"); > + PFX "Failed to map data (%d)\n", len); > + if (len != -ENOMEM) { > + scmnd->result = DID_ERROR << 16; > + scmnd->scsi_done(scmnd); > + ret = 0; > + } > goto err_iu; > } > > @@ -1625,11 +1631,13 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) > goto err_unmap; > } > > + ret = 0; > + > unlock_rport: > if (in_scsi_eh) > mutex_unlock(&rport->mutex); > > - return 0; > + return ret; > > err_unmap: > srp_unmap_data(scmnd, target, req); > @@ -1643,10 +1651,7 @@ err_iu: > err_unlock: > spin_unlock_irqrestore(&target->lock, flags); > > - if (in_scsi_eh) > - mutex_unlock(&rport->mutex); > - > - return SCSI_MLQUEUE_HOST_BUSY; > + goto unlock_rport; > } > > /* Looks good. Reviewed-by: Sagi Grimberg <sagig@mellanox.com> -- 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 1c4b0d3..af94381 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -1564,7 +1564,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) struct srp_cmd *cmd; struct ib_device *dev; unsigned long flags; - int len, result; + int len, result, ret = SCSI_MLQUEUE_HOST_BUSY; const bool in_scsi_eh = !in_interrupt() && current == shost->ehandler; /* @@ -1580,6 +1580,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) if (unlikely(result)) { scmnd->result = result; scmnd->scsi_done(scmnd); + ret = 0; goto unlock_rport; } @@ -1613,7 +1614,12 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) len = srp_map_data(scmnd, target, req); if (len < 0) { shost_printk(KERN_ERR, target->scsi_host, - PFX "Failed to map data\n"); + PFX "Failed to map data (%d)\n", len); + if (len != -ENOMEM) { + scmnd->result = DID_ERROR << 16; + scmnd->scsi_done(scmnd); + ret = 0; + } goto err_iu; } @@ -1625,11 +1631,13 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) goto err_unmap; } + ret = 0; + unlock_rport: if (in_scsi_eh) mutex_unlock(&rport->mutex); - return 0; + return ret; err_unmap: srp_unmap_data(scmnd, target, req); @@ -1643,10 +1651,7 @@ err_iu: err_unlock: spin_unlock_irqrestore(&target->lock, flags); - if (in_scsi_eh) - mutex_unlock(&rport->mutex); - - return SCSI_MLQUEUE_HOST_BUSY; + goto unlock_rport; } /*
Only request the SCSI mid-layer to retry a SCSI command after a temporary mapping failure (-ENOMEM) but not after a permanent mapping failure. This patch avoids that SCSI commands are retried indefinitely if a permanent memory mapping failure occurs. Signed-off-by: Bart Van Assche <bvanassche@acm.org> Cc: Roland Dreier <roland@purestorage.com> Cc: David Dillow <dave@thedillows.org> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Vu Pham <vu@mellanox.com> Cc: Sebastian Parschauer <sebastian.riemer@profitbricks.com> --- drivers/infiniband/ulp/srp/ib_srp.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)