[SCSI] qla2xxx: Correct handling of AENs postings for vports.
authorSeokmann Ju <seokmann.ju@qlogic.com>
Mon, 19 May 2008 21:25:40 +0000 (14:25 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 30 May 2008 17:20:57 +0000 (12:20 -0500)
Initialize all proper structure members in order to support
work-list vport processing.  This code also properly acquires the
correct (physical hardware_lock) lock during work submission.

Signed-off-by: Seokmann Ju <seokmann.ju@qlogic.com>
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_os.c

index fc55429dc91447bf5ea88b8f779ccb28f7488382..62a3ad6e8ecb0d1a0c457e3617019b39298344ba 100644 (file)
@@ -406,6 +406,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
        INIT_LIST_HEAD(&vha->list);
        INIT_LIST_HEAD(&vha->fcports);
        INIT_LIST_HEAD(&vha->vp_fcports);
+       INIT_LIST_HEAD(&vha->work_list);
 
        vha->dpc_flags = 0L;
        set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
index 817f62fbdd837828b22a2a9c33e9598caef3d41a..48eaa3bb5433892b2167f18215e6fe35e1cbe113 100644 (file)
@@ -2157,13 +2157,14 @@ static int
 qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked)
 {
        unsigned long flags;
+       scsi_qla_host_t *pha = to_qla_parent(ha);
 
        if (!locked)
-               spin_lock_irqsave(&ha->hardware_lock, flags);
+               spin_lock_irqsave(&pha->hardware_lock, flags);
        list_add_tail(&e->list, &ha->work_list);
        qla2xxx_wake_dpc(ha);
        if (!locked)
-               spin_unlock_irqrestore(&ha->hardware_lock, flags);
+               spin_unlock_irqrestore(&pha->hardware_lock, flags);
        return QLA_SUCCESS;
 }
 
@@ -2203,12 +2204,13 @@ static void
 qla2x00_do_work(struct scsi_qla_host *ha)
 {
        struct qla_work_evt *e;
+       scsi_qla_host_t *pha = to_qla_parent(ha);
 
-       spin_lock_irq(&ha->hardware_lock);
+       spin_lock_irq(&pha->hardware_lock);
        while (!list_empty(&ha->work_list)) {
                e = list_entry(ha->work_list.next, struct qla_work_evt, list);
                list_del_init(&e->list);
-               spin_unlock_irq(&ha->hardware_lock);
+               spin_unlock_irq(&pha->hardware_lock);
 
                switch (e->type) {
                case QLA_EVT_AEN:
@@ -2222,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha)
                }
                if (e->flags & QLA_EVT_FLAG_FREE)
                        kfree(e);
-               spin_lock_irq(&ha->hardware_lock);
+               spin_lock_irq(&pha->hardware_lock);
        }
-       spin_unlock_irq(&ha->hardware_lock);
+       spin_unlock_irq(&pha->hardware_lock);
 }
 
 /**************************************************************************