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:26 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:29:06 -0500
commitba1724202aafed4bbc4a239ac6fb433f454fddea (patch)
tree5a39a935d50dcb555bbe06450443c428d03b82df /drivers/s390/scsi/zfcp_fsf.c
parent3f0ca62add34010241db682e63bb68ba765bf4a9 (diff)
[SCSI] zfcp: Hold queue lock when checking port/unit handle for FCP command
We need to hold the queue-lock when checking whether we still have a valid unit/port handle for the FCP command, i.e whether we can issue this request for this unit/port. If the error recovery is about to close this unit/port, then it competes for the queue-lock. If the close request issued by the error recovery wins, then it is guaranteed that this unit/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 908e8b2107c1..17c251cb10aa 100644
--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -3593,6 +3593,12 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
3593 goto failed_req_create; 3593 goto failed_req_create;
3594 } 3594 }
3595 3595
3596 if (unlikely(!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
3597 &unit->status))) {
3598 retval = -EBUSY;
3599 goto unit_blocked;
3600 }
3601
3596 zfcp_unit_get(unit); 3602 zfcp_unit_get(unit);
3597 fsf_req->unit = unit; 3603 fsf_req->unit = unit;
3598 3604
@@ -3733,6 +3739,7 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
3733 send_failed: 3739 send_failed:
3734 no_fit: 3740 no_fit:
3735 failed_scsi_cmnd: 3741 failed_scsi_cmnd:
3742 unit_blocked:
3736 zfcp_unit_put(unit); 3743 zfcp_unit_put(unit);
3737 zfcp_fsf_req_free(fsf_req); 3744 zfcp_fsf_req_free(fsf_req);
3738 fsf_req = NULL; 3745 fsf_req = NULL;