[SCSI] libiscsi: use bh locking instead of irq with session lock
authorMike Christie <michaelc@cs.wisc.edu>
Fri, 31 Dec 2010 08:22:22 +0000 (02:22 -0600)
committerJames Bottomley <James.Bottomley@suse.de>
Fri, 31 Dec 2010 15:53:09 +0000 (09:53 -0600)
The session lock is taken in threads, timers, and bottom halves
like softirqs and tasklets. All the code but
iscsi_conn/session_failure take the session lock with the spin_lock_bh
call. This was done because I thought some offload drivers
would be calling these functions from a irq. They never did,
so this patch has iscsi_conn/session_failure use the bh
locking.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/libiscsi.c

index 1def8e1012498165d28a829b6bcb085c4f30c3f0..da8b61543ee4cbbfbf98fe7acc9990fbcafe8198 100644 (file)
@@ -1338,17 +1338,16 @@ void iscsi_session_failure(struct iscsi_session *session,
 {
        struct iscsi_conn *conn;
        struct device *dev;
-       unsigned long flags;
 
-       spin_lock_irqsave(&session->lock, flags);
+       spin_lock_bh(&session->lock);
        conn = session->leadconn;
        if (session->state == ISCSI_STATE_TERMINATE || !conn) {
-               spin_unlock_irqrestore(&session->lock, flags);
+               spin_unlock_bh(&session->lock);
                return;
        }
 
        dev = get_device(&conn->cls_conn->dev);
-       spin_unlock_irqrestore(&session->lock, flags);
+       spin_unlock_bh(&session->lock);
        if (!dev)
                return;
        /*
@@ -1367,17 +1366,16 @@ EXPORT_SYMBOL_GPL(iscsi_session_failure);
 void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
 {
        struct iscsi_session *session = conn->session;
-       unsigned long flags;
 
-       spin_lock_irqsave(&session->lock, flags);
+       spin_lock_bh(&session->lock);
        if (session->state == ISCSI_STATE_FAILED) {
-               spin_unlock_irqrestore(&session->lock, flags);
+               spin_unlock_bh(&session->lock);
                return;
        }
 
        if (conn->stop_stage == 0)
                session->state = ISCSI_STATE_FAILED;
-       spin_unlock_irqrestore(&session->lock, flags);
+       spin_unlock_bh(&session->lock);
 
        set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
        set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);