[SCSI] zfcp: Hold queue lock when checking port/unit handle for task management cmd
We need to hold the queue-lock when checking whether we still have a valid unit/port handle for the task management 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>
This commit is contained in:
parent
ba1724202a
commit
fdf234527a
1 changed files with 9 additions and 17 deletions
|
@ -3774,6 +3774,10 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
|
||||
&unit->status)))
|
||||
goto unit_blocked;
|
||||
|
||||
/*
|
||||
* Used to decide on proper handler in the return path,
|
||||
* could be either zfcp_fsf_send_fcp_command_task_handler or
|
||||
|
@ -3807,25 +3811,13 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter,
|
|||
|
||||
zfcp_fsf_start_timer(fsf_req, ZFCP_SCSI_ER_TIMEOUT);
|
||||
retval = zfcp_fsf_req_send(fsf_req);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Could not send an FCP-command (task "
|
||||
"management) on adapter %s, port 0x%016Lx for "
|
||||
"unit LUN 0x%016Lx\n",
|
||||
zfcp_get_busid_by_adapter(adapter),
|
||||
unit->port->wwpn,
|
||||
unit->fcp_lun);
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
fsf_req = NULL;
|
||||
if (!retval)
|
||||
goto out;
|
||||
}
|
||||
|
||||
ZFCP_LOG_TRACE("Send FCP Command (task management function) initiated "
|
||||
"(adapter %s, port 0x%016Lx, unit 0x%016Lx, "
|
||||
"tm_flags=0x%x)\n",
|
||||
zfcp_get_busid_by_adapter(adapter),
|
||||
unit->port->wwpn,
|
||||
unit->fcp_lun,
|
||||
tm_flags);
|
||||
unit_blocked:
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
fsf_req = NULL;
|
||||
|
||||
out:
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
|
||||
return fsf_req;
|
||||
|
|
Loading…
Reference in a new issue