Commit fdf23452 authored by Christof Schmitt's avatar Christof Schmitt Committed by James Bottomley

[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: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarMartin Peschke <mp3@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent ba172420
...@@ -3774,6 +3774,10 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter, ...@@ -3774,6 +3774,10 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter,
goto out; 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, * Used to decide on proper handler in the return path,
* could be either zfcp_fsf_send_fcp_command_task_handler or * 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, ...@@ -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); zfcp_fsf_start_timer(fsf_req, ZFCP_SCSI_ER_TIMEOUT);
retval = zfcp_fsf_req_send(fsf_req); retval = zfcp_fsf_req_send(fsf_req);
if (retval) { 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;
goto out; goto out;
}
ZFCP_LOG_TRACE("Send FCP Command (task management function) initiated " unit_blocked:
"(adapter %s, port 0x%016Lx, unit 0x%016Lx, " zfcp_fsf_req_free(fsf_req);
"tm_flags=0x%x)\n", fsf_req = NULL;
zfcp_get_busid_by_adapter(adapter),
unit->port->wwpn,
unit->fcp_lun,
tm_flags);
out: out:
write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
return fsf_req; return fsf_req;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment