Commit 3f0ca62add34010241db682e63bb68ba765bf4a9
Committed by
James Bottomley
1 parent
951f746fec
Exists in
master
and in
7 other branches
[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>
Showing 2 changed files with 8 additions and 1 deletions Side-by-side Diff
drivers/s390/scsi/zfcp_erp.c
... | ... | @@ -456,7 +456,7 @@ |
456 | 456 | |
457 | 457 | zfcp_port_get(port); |
458 | 458 | retval = zfcp_erp_adisc(port); |
459 | - if (retval != 0) { | |
459 | + if (retval != 0 && retval != -EBUSY) { | |
460 | 460 | zfcp_port_put(port); |
461 | 461 | ZFCP_LOG_NORMAL("reopen needed for port 0x%016Lx " |
462 | 462 | "on adapter %s\n ", port->wwpn, |
drivers/s390/scsi/zfcp_fsf.c
... | ... | @@ -1668,6 +1668,12 @@ |
1668 | 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 | 1677 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); |
1672 | 1678 | if (zfcp_use_one_sbal(els->req, els->req_count, |
1673 | 1679 | els->resp, els->resp_count)){ |
... | ... | @@ -1749,6 +1755,7 @@ |
1749 | 1755 | "0x%06x)\n", zfcp_get_busid_by_adapter(adapter), d_id); |
1750 | 1756 | goto out; |
1751 | 1757 | |
1758 | + port_blocked: | |
1752 | 1759 | failed_send: |
1753 | 1760 | zfcp_fsf_req_free(fsf_req); |
1754 | 1761 |