qla2xxx: Allow vref count to timeout on vport delete.
commit c4a9b538ab2a109c5f9798bea1f8f4bf93aadfb9 upstream. Signed-off-by: Joe Carnuccio <joe.carnuccio@cavium.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5ed56ca86f
commit
c1716f0c35
@ -2153,8 +2153,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);
|
||||
|
@ -3742,6 +3742,7 @@ typedef struct scsi_qla_host {
|
||||
struct qla8044_reset_template reset_tmplt;
|
||||
struct qla_tgt_counters tgt_counters;
|
||||
uint16_t bbcr;
|
||||
wait_queue_head_t vref_waitq;
|
||||
} scsi_qla_host_t;
|
||||
|
||||
struct qla27xx_image_status {
|
||||
@ -3780,6 +3781,7 @@ struct qla_tgt_vp_map {
|
||||
mb(); \
|
||||
if (__vha->flags.delete_progress) { \
|
||||
atomic_dec(&__vha->vref_count); \
|
||||
wake_up(&__vha->vref_waitq); \
|
||||
__bail = 1; \
|
||||
} else { \
|
||||
__bail = 0; \
|
||||
@ -3788,6 +3790,7 @@ struct qla_tgt_vp_map {
|
||||
|
||||
#define QLA_VHA_MARK_NOT_BUSY(__vha) do { \
|
||||
atomic_dec(&__vha->vref_count); \
|
||||
wake_up(&__vha->vref_waitq); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
@ -4356,6 +4356,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);
|
||||
}
|
||||
|
@ -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)
|
||||
*/
|
||||
wait_event_timeout(vha->vref_waitq, atomic_read(&vha->vref_count),
|
||||
10*HZ);
|
||||
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
while (atomic_read(&vha->vref_count)) {
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
|
||||
msleep(500);
|
||||
|
||||
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++;
|
||||
}
|
||||
|
@ -4045,6 +4045,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->vref_waitq);
|
||||
|
||||
sprintf(vha->host_str, "%s_%ld", QLA2XXX_DRIVER_NAME, vha->host_no);
|
||||
ql_dbg(ql_dbg_init, vha, 0x0041,
|
||||
|
Loading…
x
Reference in New Issue
Block a user