mirror of https://gitee.com/openkylin/linux.git
[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:
parent
3c39740073
commit
08b95a12cd
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue