diff options
author | open-iscsi <open-iscsi@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2005-03-02 21:54:16 +0000 |
---|---|---|
committer | open-iscsi <open-iscsi@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2005-03-02 21:54:16 +0000 |
commit | a3d5c5644795b5b6adfa89c3d6e658b7ffe5cf5c (patch) | |
tree | fcf5d4878293f348bfdbbc500d21b9ab55fcc52e /kernel | |
parent | 5d330bdc589e95aa2cd7cc84b230ab10164f2a24 (diff) | |
download | open-iscsi-a3d5c5644795b5b6adfa89c3d6e658b7ffe5cf5c.tar.gz |
serialization between conn_destroy(), xmitworker() and data_recv()
git-svn-id: svn://svn.berlios.de/open-iscsi@153 d7303112-9cec-0310-bdd2-e83a94d6c2b6
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/iscsi_tcp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/iscsi_tcp.c b/kernel/iscsi_tcp.c index 7bdc84f..54443e8 100644 --- a/kernel/iscsi_tcp.c +++ b/kernel/iscsi_tcp.c @@ -1681,6 +1681,8 @@ iscsi_xmitworker(void *data) * serialize Xmit worker on a per-connection basis. */ down(&conn->xmitsema); + if (conn->suspend) + goto out; if (iscsi_data_xmit(conn)) { if (conn->c_stage == ISCSI_CNX_CLEANUP_WAIT || conn->c_stage == ISCSI_CNX_STOPPED || @@ -1981,7 +1983,9 @@ iscsi_conn_destroy(iscsi_cnx_h cnxh) * Block control plane caller (a thread coming from * a user space) until all the in-progress commands for this connection * time out or fail. + * We must serialize with xmitwork recv pathes. */ + down(&conn->xmitsema); conn->c_stage = ISCSI_CNX_CLEANUP_WAIT; while (1) { spin_lock_bh(&conn->lock); @@ -1992,6 +1996,7 @@ iscsi_conn_destroy(iscsi_cnx_h cnxh) spin_unlock_bh(&conn->lock); msleep_interruptible(500); } + up(&conn->xmitsema); /* now free crypto */ if (conn->hdrdgst_en || conn->datadgst_en) { @@ -2111,6 +2116,7 @@ iscsi_conn_stop(iscsi_cnx_h cnxh) spin_lock_bh(&session->lock); conn->c_stage = ISCSI_CNX_STOPPED; + conn->suspend = 1; session->conn_cnt--; if (session->conn_cnt == 0 || |