FAILED: patch "[PATCH] qla2xxx: Allow vref count to timeout on vport delete." failed to apply to 4.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
c4a9b538ab2a109c5f9798bea1f8f4bf93aadfb9Mon Sep 17 00:00:00 2001
From: Joe Carnuccio <[email protected]>
Date: Wed, 15 Mar 2017 09:48:43 -0700
Subject: [PATCH] qla2xxx: Allow vref count to timeout on vport delete.
Cc <[email protected]>
Signed-off-by Joe Carnuccio <[email protected]>
Signed-off-by Himanshu Madhani <[email protected]>
Signed-off-by Nicholas Bellinger <[email protected]>
drivers/scsi/qla2xxx/qla_attr.c +1 -3
@@ -2154,8 +2154,6 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) "Timer for the VP[%d] has stopped\n", vha->vp_idx); } -BUG_ON (atomic_read (&vha->vref_count)); -qla2x00_free_fcports (vha);mutex_lock (&ha->vport_lock);
@@ -2166,7 +2164,7 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)dma_free_coherent (&ha->pdev->dev, vha->gnl.size, vha->gnl.l, vha->gnl.ldma); -if (vha->qpair->vp_idx == vha->vp_idx) { +if (vha->qpair && vha->qpair->vp_idx == vha->vp_idx) {if (qla2xxx_delete_qpair (vha, vha->qpair) !=QLA_SUCCESS )ql_log (ql_log_warn, vha,0x7087 ,"Queue Pair delete failed.\n" );
drivers/scsi/qla2xxx/qla_def.h +5 -1
@@ -4076,6 +4076,7 @@ typedef struct scsi_qla_host {/* Count of active session/fcport */ int fcport_count;wait_queue_head_t fcport_waitQ; +wait_queue_head_t vref_waitq; } scsi_qla_host_t;struct qla27xx_image_status {
@@ -4131,14 +4132,17 @@ struct qla2_sgx {mb (); \if (__vha->flags.delete_progress) { \atomic_dec (&__vha->vref_count); \ +wake_up (&__vha->vref_waitq); \ __bail =1 ; \ }else { \ __bail =0 ; \ } \ } while (0) -#define QLA_VHA_MARK_NOT_BUSY (__vha) \ +#define QLA_VHA_MARK_NOT_BUSY (__vha) do { \ atomic_dec(&__vha->vref_count); \ + wake_up(&__vha->vref_waitq); \ +} while (0) \#define QLA_QPAIR_MARK_BUSY (__qpair, __bail) do { \ atomic_inc(&__qpair->ref_count); \
drivers/scsi/qla2xxx/qla_init.c +1 -0
@@ -5148,6 +5148,7 @@ qla2x00_update_fcports(scsi_qla_host_t *base_vha) } }atomic_dec (&vha->vref_count); +wake_up (&vha->vref_waitq); }spin_unlock_irqrestore (&ha->vport_slock, flags); }
drivers/scsi/qla2xxx/qla_mid.c +8 -6
@@ -74,13 +74,14 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)* ensures no active vp_list traversal while the vport is removed * from the queue) */ -spin_lock_irqsave (&ha->vport_slock, flags); -while (atomic_read (&vha->vref_count)) { -spin_unlock_irqrestore (&ha->vport_slock, flags); - -msleep (500 ); +wait_event_timeout (vha->vref_waitq,atomic_read (&vha->vref_count), +10 *HZ ); -spin_lock_irqsave (&ha->vport_slock, flags); +spin_lock_irqsave (&ha->vport_slock, flags); +if (atomic_read (&vha->vref_count)) { +ql_dbg (ql_dbg_vport, vha,0xfffa , +"vha->vref_count=%u timeout\n" , vha->vref_count.counter); + vha->vref_count = (atomic_t )ATOMIC_INIT (0 ); }list_del (&vha->list);qlt_update_vp_map (vha,RESET_VP_IDX );
@@ -269,6 +270,7 @@ qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)spin_lock_irqsave (&ha->vport_slock, flags);atomic_dec (&vha->vref_count); +wake_up (&vha->vref_waitq); } i++; }
drivers/scsi/qla2xxx/qla_os.c +1 -0
@@ -4268,6 +4268,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,spin_lock_init (&vha->work_lock);spin_lock_init (&vha->cmd_list_lock);init_waitqueue_head (&vha->fcport_waitQ); +init_waitqueue_head (&vha->vref_waitq); vha->gnl.size =sizeof (struct get_name_list_extended ) * (ha->max_loop_id +1 );