aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi/scsi_transport_iscsi.h
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2007-05-30 13:57:18 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-06-02 15:34:14 -0400
commit77a23c21aaa723f6b0ffc4a701be8c8e5a32346d (patch)
tree5b51b8299a8deede4c91dffde032899ab76e331a /include/scsi/scsi_transport_iscsi.h
parent218432c68085d6c2b04df57daaf105d2ffa2aa61 (diff)
[SCSI] libiscsi: fix iscsi cmdsn allocation
The cmdsn allocation and pdu transmit code can race, and we can end up sending a pdu with cmdsn 10 before a pdu with 5. The target will then fail the connection/session. This patch fixes the problem by delaying the cmdsn allocation until we are about to send the pdu. This also removes the xmitmutex. We were using the connection xmitmutex during error handling to handle races with mtask and ctask cleanup and completion. For ctasks we now have nice refcounting and for the mtask, if we hit the case where the mtask timesout and it is floating around somewhere in the driver, we end up dropping the session. And to handle session level cleanup, we use the xmit suspend bit along with scsi_flush_queue and the session lock to make sure that the xmit thread is not possibly transmitting a task while we are trying to kill it. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Cc: Roland Dreier <rdreier@cisco.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'include/scsi/scsi_transport_iscsi.h')
-rw-r--r--include/scsi/scsi_transport_iscsi.h3
1 files changed, 1 insertions, 2 deletions
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index 1ac450b06909..abc4068621d8 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -117,8 +117,7 @@ struct iscsi_transport {
117 struct iscsi_stats *stats); 117 struct iscsi_stats *stats);
118 void (*init_cmd_task) (struct iscsi_cmd_task *ctask); 118 void (*init_cmd_task) (struct iscsi_cmd_task *ctask);
119 void (*init_mgmt_task) (struct iscsi_conn *conn, 119 void (*init_mgmt_task) (struct iscsi_conn *conn,
120 struct iscsi_mgmt_task *mtask, 120 struct iscsi_mgmt_task *mtask);
121 char *data, uint32_t data_size);
122 int (*xmit_cmd_task) (struct iscsi_conn *conn, 121 int (*xmit_cmd_task) (struct iscsi_conn *conn,
123 struct iscsi_cmd_task *ctask); 122 struct iscsi_cmd_task *ctask);
124 void (*cleanup_cmd_task) (struct iscsi_conn *conn, 123 void (*cleanup_cmd_task) (struct iscsi_conn *conn,