[SCSI] qla2xxx: Correct handling of AENs postings for vports.

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>
This commit is contained in:
Seokmann Ju 2008-05-19 14:25:40 -07:00 committed by James Bottomley
parent 3c39740073
commit 08b95a12cd
2 changed files with 9 additions and 6 deletions

View File

@ -406,6 +406,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
INIT_LIST_HEAD(&vha->list); INIT_LIST_HEAD(&vha->list);
INIT_LIST_HEAD(&vha->fcports); INIT_LIST_HEAD(&vha->fcports);
INIT_LIST_HEAD(&vha->vp_fcports); INIT_LIST_HEAD(&vha->vp_fcports);
INIT_LIST_HEAD(&vha->work_list);
vha->dpc_flags = 0L; vha->dpc_flags = 0L;
set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);

View File

@ -2157,13 +2157,14 @@ static int
qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked)
{ {
unsigned long flags; unsigned long flags;
scsi_qla_host_t *pha = to_qla_parent(ha);
if (!locked) if (!locked)
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&pha->hardware_lock, flags);
list_add_tail(&e->list, &ha->work_list); list_add_tail(&e->list, &ha->work_list);
qla2xxx_wake_dpc(ha); qla2xxx_wake_dpc(ha);
if (!locked) if (!locked)
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&pha->hardware_lock, flags);
return QLA_SUCCESS; return QLA_SUCCESS;
} }
@ -2203,12 +2204,13 @@ static void
qla2x00_do_work(struct scsi_qla_host *ha) qla2x00_do_work(struct scsi_qla_host *ha)
{ {
struct qla_work_evt *e; 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)) { while (!list_empty(&ha->work_list)) {
e = list_entry(ha->work_list.next, struct qla_work_evt, list); e = list_entry(ha->work_list.next, struct qla_work_evt, list);
list_del_init(&e->list); list_del_init(&e->list);
spin_unlock_irq(&ha->hardware_lock); spin_unlock_irq(&pha->hardware_lock);
switch (e->type) { switch (e->type) {
case QLA_EVT_AEN: case QLA_EVT_AEN:
@ -2222,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha)
} }
if (e->flags & QLA_EVT_FLAG_FREE) if (e->flags & QLA_EVT_FLAG_FREE)
kfree(e); 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);
} }
/************************************************************************** /**************************************************************************