diff options
| author | Bart Van Assche <bvanassche@acm.org> | 2013-06-12 09:23:04 -0400 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2013-06-27 19:44:39 -0400 |
| commit | 086f44f58855ae18bab19fb794cce6c6d2c6143b (patch) | |
| tree | e4cad038ce28f9d137f4534f10b456ebd60f51cc | |
| parent | 1fe0cb848890a3f4dd965fdce8b4108feb03971f (diff) | |
IB/srp: Avoid skipping srp_reset_host() after a transport error
The SCSI error handler assumes that the transport layer is operational
if an eh_abort_handler() returns SUCCESS. Hence srp_abort() only
should return SUCCESS if sending the ABORT TASK task management
function succeeded. This patch avoids the SCSI error handler skipping
the srp_reset_host() call after a transport layer error.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Acked-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <roland@purestorage.com>
| -rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 368d1606e16f..759c55b9685f 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
| @@ -1744,18 +1744,23 @@ static int srp_abort(struct scsi_cmnd *scmnd) | |||
| 1744 | { | 1744 | { |
| 1745 | struct srp_target_port *target = host_to_target(scmnd->device->host); | 1745 | struct srp_target_port *target = host_to_target(scmnd->device->host); |
| 1746 | struct srp_request *req = (struct srp_request *) scmnd->host_scribble; | 1746 | struct srp_request *req = (struct srp_request *) scmnd->host_scribble; |
| 1747 | int ret; | ||
| 1747 | 1748 | ||
| 1748 | shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n"); | 1749 | shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n"); |
| 1749 | 1750 | ||
| 1750 | if (!req || !srp_claim_req(target, req, scmnd)) | 1751 | if (!req || !srp_claim_req(target, req, scmnd)) |
| 1751 | return FAILED; | 1752 | return FAILED; |
| 1752 | srp_send_tsk_mgmt(target, req->index, scmnd->device->lun, | 1753 | if (srp_send_tsk_mgmt(target, req->index, scmnd->device->lun, |
| 1753 | SRP_TSK_ABORT_TASK); | 1754 | SRP_TSK_ABORT_TASK) == 0 || |
| 1755 | target->transport_offline) | ||
| 1756 | ret = SUCCESS; | ||
| 1757 | else | ||
| 1758 | ret = FAILED; | ||
| 1754 | srp_free_req(target, req, scmnd, 0); | 1759 | srp_free_req(target, req, scmnd, 0); |
| 1755 | scmnd->result = DID_ABORT << 16; | 1760 | scmnd->result = DID_ABORT << 16; |
| 1756 | scmnd->scsi_done(scmnd); | 1761 | scmnd->scsi_done(scmnd); |
| 1757 | 1762 | ||
| 1758 | return SUCCESS; | 1763 | return ret; |
| 1759 | } | 1764 | } |
| 1760 | 1765 | ||
| 1761 | static int srp_reset_device(struct scsi_cmnd *scmnd) | 1766 | static int srp_reset_device(struct scsi_cmnd *scmnd) |
