diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2007-12-20 06:30:24 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-11 19:29:03 -0500 |
commit | 951f746fece2e24a26853b3872d16e9013b6fe0b (patch) | |
tree | c63d1a0a262cb642bd2861b774b647de8f048b18 /drivers/s390/scsi | |
parent | 8627533c115c546649693d68fed6a74762c47d51 (diff) |
[SCSI] zfcp: Hold queue lock when checking port/unit handle for abort command
We need to hold the queue-lock when checking whether we still have a valid
unit/port handle for the abort 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')
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index e697b1cb6d27..665fcb6ec5d5 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -1116,6 +1116,10 @@ zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
1116 | goto out; | 1116 | goto out; |
1117 | } | 1117 | } |
1118 | 1118 | ||
1119 | if (unlikely(!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, | ||
1120 | &unit->status))) | ||
1121 | goto unit_blocked; | ||
1122 | |||
1119 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); | 1123 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); |
1120 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | 1124 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; |
1121 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | 1125 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; |
@@ -1131,22 +1135,13 @@ zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
1131 | 1135 | ||
1132 | zfcp_fsf_start_timer(fsf_req, ZFCP_SCSI_ER_TIMEOUT); | 1136 | zfcp_fsf_start_timer(fsf_req, ZFCP_SCSI_ER_TIMEOUT); |
1133 | retval = zfcp_fsf_req_send(fsf_req); | 1137 | retval = zfcp_fsf_req_send(fsf_req); |
1134 | if (retval) { | 1138 | if (!retval) |
1135 | ZFCP_LOG_INFO("error: Failed to send abort command request " | 1139 | goto out; |
1136 | "on adapter %s, port 0x%016Lx, unit 0x%016Lx\n", | 1140 | |
1137 | zfcp_get_busid_by_adapter(adapter), | 1141 | unit_blocked: |
1138 | unit->port->wwpn, unit->fcp_lun); | ||
1139 | zfcp_fsf_req_free(fsf_req); | 1142 | zfcp_fsf_req_free(fsf_req); |
1140 | fsf_req = NULL; | 1143 | fsf_req = NULL; |
1141 | goto out; | ||
1142 | } | ||
1143 | 1144 | ||
1144 | ZFCP_LOG_DEBUG("Abort FCP Command request initiated " | ||
1145 | "(adapter%s, port d_id=0x%06x, " | ||
1146 | "unit x%016Lx, old_req_id=0x%lx)\n", | ||
1147 | zfcp_get_busid_by_adapter(adapter), | ||
1148 | unit->port->d_id, | ||
1149 | unit->fcp_lun, old_req_id); | ||
1150 | out: | 1145 | out: |
1151 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); | 1146 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); |
1152 | return fsf_req; | 1147 | return fsf_req; |