aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Van Assche <bvanassche@acm.org>2013-06-12 09:23:04 -0400
committerRoland Dreier <roland@purestorage.com>2013-06-27 19:44:39 -0400
commit086f44f58855ae18bab19fb794cce6c6d2c6143b (patch)
treee4cad038ce28f9d137f4534f10b456ebd60f51cc
parent1fe0cb848890a3f4dd965fdce8b4108feb03971f (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.c11
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
1761static int srp_reset_device(struct scsi_cmnd *scmnd) 1766static int srp_reset_device(struct scsi_cmnd *scmnd)