[SCSI] iscsi: fix 4k stack iscsi setups
authorMike Christie <michaelc@cs.wisc.edu>
Sat, 14 Jan 2006 00:05:53 +0000 (18:05 -0600)
committerJames Bottomley <jejb@mulgrave.(none)>
Sat, 14 Jan 2006 16:55:21 +0000 (10:55 -0600)
When we run the xmit code from queuecomand the stack trace
gets too deep. The patch runs the xmit code from the scsi_host
work queue. This fixes 4k stack and xfs support and should
fix the st and sg stack usage bugs.

Signed-off-by: Alex Aizman <itn780@yahoo.com>
Signed-off-by: Dmitry Yusupov <dmitry_yus@yahoo.com>
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/iscsi_tcp.c
drivers/scsi/scsi_transport_iscsi.c

index e31d350e6b67b559ec6bc630479244920625228c..4e4b1061a5e92d589cd207a5cf67429ecef4da89 100644 (file)
@@ -525,7 +525,7 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        __kfifo_put(ctask->r2tqueue, (void*)&r2t, sizeof(void*));
        __kfifo_put(conn->writequeue, (void*)&ctask, sizeof(void*));
 
-       schedule_work(&conn->xmitwork);
+       scsi_queue_work(session->host, &conn->xmitwork);
        conn->r2t_pdus_cnt++;
        spin_unlock(&session->lock);
 
@@ -1267,7 +1267,7 @@ iscsi_write_space(struct sock *sk)
        conn->old_write_space(sk);
        debug_tcp("iscsi_write_space: cid %d\n", conn->id);
        clear_bit(SUSPEND_BIT, &conn->suspend_tx);
-       schedule_work(&conn->xmitwork);
+       scsi_queue_work(conn->session->host, &conn->xmitwork);
 }
 
 static void
@@ -2275,7 +2275,7 @@ iscsi_xmitworker(void *data)
         */
        mutex_lock(&conn->xmitmutex);
        if (iscsi_data_xmit(conn))
-               schedule_work(&conn->xmitwork);
+               scsi_queue_work(conn->session->host, &conn->xmitwork);
        mutex_unlock(&conn->xmitmutex);
 }
 
@@ -2340,15 +2340,7 @@ iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1);
        spin_unlock(&session->lock);
 
-        if (!in_interrupt() && mutex_trylock(&conn->xmitmutex)) {
-               spin_unlock_irq(host->host_lock);
-               if (iscsi_data_xmit(conn))
-                       schedule_work(&conn->xmitwork);
-               mutex_unlock(&conn->xmitmutex);
-               spin_lock_irq(host->host_lock);
-       } else
-               schedule_work(&conn->xmitwork);
-
+       scsi_queue_work(host, &conn->xmitwork);
        return 0;
 
 reject:
@@ -2942,8 +2934,7 @@ iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
        else
                __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*));
 
-       schedule_work(&conn->xmitwork);
-
+       scsi_queue_work(session->host, &conn->xmitwork);
        return 0;
 }
 
index 45e31635a5954d51fe1d042a64aa38d231142f36..59a1c9d9d3bdc174eabed3553db658367288da44 100644 (file)
@@ -379,6 +379,7 @@ iscsi_transport_create_session(struct scsi_transport_template *scsit,
        shost->max_lun = transport->max_lun;
        shost->max_cmd_len = transport->max_cmd_len;
        shost->transportt = scsit;
+       shost->transportt->create_work_queue = 1;
 
        if (scsi_add_host(shost, NULL))
                goto free_host;