Skip to contentSkip to conversation

zfcp: Locking for req_no and req_seq_no

PATCH In review Swen Schillig 1 participant 1 message May 8, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/5 zfcp: Locking for req_no and req_seq_no

From: Christof Schmitt <[email protected]>

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.

---
 drivers/s390/scsi/zfcp_fsf.c |   17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/s390/scsi/zfcp_fsf.c +8 -9
@@ -4645,23 +4645,22 @@
 	fsf_req->adapter = adapter;
 	fsf_req->fsf_command = fsf_cmd;
 	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);
-	zfcp_fsf_req_qtcb_init(fsf_req);
 
 	/* initialize waitqueue which may be used to wait on 
 	   this request completion */
 	init_waitqueue_head(&fsf_req->completion_wq);
 
         ret = zfcp_fsf_req_sbal_get(adapter, req_flags, lock_flags);
-        if(ret < 0) {
+        if (ret < 0)
                 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

-------------------------------------------------------