Commit 801e0ced authored by Christof Schmitt's avatar Christof Schmitt Committed by James Bottomley

[SCSI] zfcp: Locking for req_no and req_seq_no

There is a possible race condition while generating the unique
request ids and sequence numbers. Both might be read at the
same time and have the same value. Fix this by serializing the
access through the queue lock of the adapter: First call
zfcp_fsf_req_sbal_get that acquires the lock, then read and
increment the unique ids.
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 1d589edf
...@@ -4645,23 +4645,22 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags, ...@@ -4645,23 +4645,22 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags,
fsf_req->adapter = adapter; fsf_req->adapter = adapter;
fsf_req->fsf_command = fsf_cmd; fsf_req->fsf_command = fsf_cmd;
INIT_LIST_HEAD(&fsf_req->list); INIT_LIST_HEAD(&fsf_req->list);
/* this is serialized (we are holding req_queue-lock of adapter */
if (adapter->req_no == 0)
adapter->req_no++;
fsf_req->req_id = adapter->req_no++;
init_timer(&fsf_req->timer); init_timer(&fsf_req->timer);
zfcp_fsf_req_qtcb_init(fsf_req);
/* initialize waitqueue which may be used to wait on /* initialize waitqueue which may be used to wait on
this request completion */ this request completion */
init_waitqueue_head(&fsf_req->completion_wq); init_waitqueue_head(&fsf_req->completion_wq);
ret = zfcp_fsf_req_sbal_get(adapter, req_flags, lock_flags); ret = zfcp_fsf_req_sbal_get(adapter, req_flags, lock_flags);
if(ret < 0) { if (ret < 0)
goto failed_sbals; goto failed_sbals;
}
/* this is serialized (we are holding req_queue-lock of adapter) */
if (adapter->req_no == 0)
adapter->req_no++;
fsf_req->req_id = adapter->req_no++;
zfcp_fsf_req_qtcb_init(fsf_req);
/* /*
* We hold queue_lock here. Check if QDIOUP is set and let request fail * We hold queue_lock here. Check if QDIOUP is set and let request fail
......
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