mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 23:29:46 +00:00
[SCSI] qla2xxx: Fix hang during driver unload when vport is active.
Bumping ref count during fc_vport_terminate() was the cause. vport delete would wait for ref count to drop to zero and that would never happen. Cc: stable@kernel.org Signed-off-by: Arun Easi <arun.easi@qlogic.com> Signed-off-by: Madhuranath Iyengar <Madhu.Iyengar@qlogic.com> Signed-off-by: James Bottomley <jbottomley@parallels.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
fa96d92736
commit
43ebf16d76
@ -2368,21 +2368,26 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
||||
base_vha = pci_get_drvdata(pdev);
|
||||
ha = base_vha->hw;
|
||||
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
list_for_each_entry(vha, &ha->vp_list, list) {
|
||||
atomic_inc(&vha->vref_count);
|
||||
mutex_lock(&ha->vport_lock);
|
||||
while (ha->cur_vport_count) {
|
||||
struct Scsi_Host *scsi_host;
|
||||
|
||||
if (vha->fc_vport) {
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
|
||||
fc_vport_terminate(vha->fc_vport);
|
||||
BUG_ON(base_vha->list.next == &ha->vp_list);
|
||||
/* This assumes first entry in ha->vp_list is always base vha */
|
||||
vha = list_first_entry(&base_vha->list, scsi_qla_host_t, list);
|
||||
scsi_host = scsi_host_get(vha->host);
|
||||
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
mutex_unlock(&ha->vport_lock);
|
||||
|
||||
atomic_dec(&vha->vref_count);
|
||||
fc_vport_terminate(vha->fc_vport);
|
||||
scsi_host_put(vha->host);
|
||||
|
||||
mutex_lock(&ha->vport_lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
mutex_unlock(&ha->vport_lock);
|
||||
|
||||
set_bit(UNLOADING, &base_vha->dpc_flags);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user