lkml.org 
[lkml]   [2011]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[011/165] [SCSI] qla2xxx: Fix hang during driver unload when vport is active.
    2.6.39-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    Content-Length: 1865
    Lines: 58

    From: Arun Easi <arun.easi@qlogic.com>

    commit 43ebf16d762b082663976b679b813e1b546548d1 upstream.

    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.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/scsi/qla2xxx/qla_os.c | 25 +++++++++++++++----------
    1 file changed, 15 insertions(+), 10 deletions(-)

    --- a/drivers/scsi/qla2xxx/qla_os.c
    +++ b/drivers/scsi/qla2xxx/qla_os.c
    @@ -2360,21 +2360,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);




    \
     
     \ /
      Last update: 2011-06-01 11:11    [W:4.055 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site