aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_fsf.c
diff options
context:
space:
mode:
authorChristof Schmitt <christof.schmitt@de.ibm.com>2007-12-20 06:30:25 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:29:05 -0500
commit3f0ca62add34010241db682e63bb68ba765bf4a9 (patch)
tree941218ee69ebe014cbd913e3ac33861b976415f9 /drivers/s390/scsi/zfcp_fsf.c
parent951f746fece2e24a26853b3872d16e9013b6fe0b (diff)
[SCSI] zfcp: Hold queue lock when checking port handle for ELS command
We need to hold the queue-lock when checking whether we still have a valid port handle for the ELS command, i.e whether we can issue this request for this port. If the error recovery is about to close this port, then it competes for the queue-lock. If the close request issued by the error recovery wins, then it is guaranteed that this port has been blocked for other requests. Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: Martin Peschke <mp3@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/s390/scsi/zfcp_fsf.c')
-rw-r--r--drivers/s390/scsi/zfcp_fsf.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
index 665fcb6ec5d5..908e8b2107c1 100644
--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -1668,6 +1668,12 @@ zfcp_fsf_send_els(struct zfcp_send_els *els)
1668 goto failed_req; 1668 goto failed_req;
1669 } 1669 }
1670 1670
1671 if (unlikely(!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
1672 &els->port->status))) {
1673 ret = -EBUSY;
1674 goto port_blocked;
1675 }
1676
1671 sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); 1677 sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
1672 if (zfcp_use_one_sbal(els->req, els->req_count, 1678 if (zfcp_use_one_sbal(els->req, els->req_count,
1673 els->resp, els->resp_count)){ 1679 els->resp, els->resp_count)){
@@ -1749,6 +1755,7 @@ zfcp_fsf_send_els(struct zfcp_send_els *els)
1749 "0x%06x)\n", zfcp_get_busid_by_adapter(adapter), d_id); 1755 "0x%06x)\n", zfcp_get_busid_by_adapter(adapter), d_id);
1750 goto out; 1756 goto out;
1751 1757
1758 port_blocked:
1752 failed_send: 1759 failed_send:
1753 zfcp_fsf_req_free(fsf_req); 1760 zfcp_fsf_req_free(fsf_req);
1754 1761