Commit ee546b6e authored by Anirban Chakraborty's avatar Anirban Chakraborty Committed by James Bottomley

[SCSI] qla2xxx: Correct vport delete bug.

Signed-off-by: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 605aa2bc
...@@ -2614,6 +2614,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, ...@@ -2614,6 +2614,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
port_id_t wrap, nxt_d_id; port_id_t wrap, nxt_d_id;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev); struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev);
struct scsi_qla_host *tvp;
rval = QLA_SUCCESS; rval = QLA_SUCCESS;
...@@ -2713,7 +2714,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, ...@@ -2713,7 +2714,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
/* Bypass virtual ports of the same host. */ /* Bypass virtual ports of the same host. */
found = 0; found = 0;
if (ha->num_vhosts) { if (ha->num_vhosts) {
list_for_each_entry(vp, &ha->vp_list, list) { list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
if (new_fcport->d_id.b24 == vp->d_id.b24) { if (new_fcport->d_id.b24 == vp->d_id.b24) {
found = 1; found = 1;
break; break;
...@@ -2836,6 +2837,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) ...@@ -2836,6 +2837,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
uint16_t first_loop_id; uint16_t first_loop_id;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct scsi_qla_host *vp; struct scsi_qla_host *vp;
struct scsi_qla_host *tvp;
rval = QLA_SUCCESS; rval = QLA_SUCCESS;
...@@ -2860,7 +2862,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) ...@@ -2860,7 +2862,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
/* Check for loop ID being already in use. */ /* Check for loop ID being already in use. */
found = 0; found = 0;
fcport = NULL; fcport = NULL;
list_for_each_entry(vp, &ha->vp_list, list) { list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
list_for_each_entry(fcport, &vp->vp_fcports, list) { list_for_each_entry(fcport, &vp->vp_fcports, list) {
if (fcport->loop_id == dev->loop_id && if (fcport->loop_id == dev->loop_id &&
fcport != dev) { fcport != dev) {
...@@ -3295,6 +3297,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) ...@@ -3295,6 +3297,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
uint8_t status = 0; uint8_t status = 0;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct scsi_qla_host *vp; struct scsi_qla_host *vp;
struct scsi_qla_host *tvp;
struct req_que *req = ha->req_q_map[0]; struct req_que *req = ha->req_q_map[0];
if (vha->flags.online) { if (vha->flags.online) {
...@@ -3310,7 +3313,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) ...@@ -3310,7 +3313,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
if (atomic_read(&vha->loop_state) != LOOP_DOWN) { if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
atomic_set(&vha->loop_state, LOOP_DOWN); atomic_set(&vha->loop_state, LOOP_DOWN);
qla2x00_mark_all_devices_lost(vha, 0); qla2x00_mark_all_devices_lost(vha, 0);
list_for_each_entry(vp, &ha->vp_list, list) list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
qla2x00_mark_all_devices_lost(vp, 0); qla2x00_mark_all_devices_lost(vp, 0);
} else { } else {
if (!atomic_read(&vha->loop_down_timer)) if (!atomic_read(&vha->loop_down_timer))
...@@ -3407,7 +3410,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) ...@@ -3407,7 +3410,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
DEBUG(printk(KERN_INFO DEBUG(printk(KERN_INFO
"qla2x00_abort_isp(%ld): succeeded.\n", "qla2x00_abort_isp(%ld): succeeded.\n",
vha->host_no)); vha->host_no));
list_for_each_entry(vp, &ha->vp_list, list) { list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
if (vp->vp_idx) if (vp->vp_idx)
qla2x00_vp_abort_isp(vp); qla2x00_vp_abort_isp(vp);
} }
......
...@@ -2685,6 +2685,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, ...@@ -2685,6 +2685,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
uint16_t stat = le16_to_cpu(rptid_entry->vp_idx); uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
scsi_qla_host_t *vp; scsi_qla_host_t *vp;
scsi_qla_host_t *tvp;
if (rptid_entry->entry_status != 0) if (rptid_entry->entry_status != 0)
return; return;
...@@ -2710,7 +2711,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, ...@@ -2710,7 +2711,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
if (MSB(stat) == 1) if (MSB(stat) == 1)
return; return;
list_for_each_entry(vp, &ha->vp_list, list) list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
if (vp_idx == vp->vp_idx) if (vp_idx == vp->vp_idx)
break; break;
if (!vp) if (!vp)
......
...@@ -69,9 +69,10 @@ static scsi_qla_host_t * ...@@ -69,9 +69,10 @@ static scsi_qla_host_t *
qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name) qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name)
{ {
scsi_qla_host_t *vha; scsi_qla_host_t *vha;
struct scsi_qla_host *tvha;
/* Locate matching device in database. */ /* Locate matching device in database. */
list_for_each_entry(vha, &ha->vp_list, list) { list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
if (!memcmp(port_name, vha->port_name, WWN_SIZE)) if (!memcmp(port_name, vha->port_name, WWN_SIZE))
return vha; return vha;
} }
...@@ -194,11 +195,11 @@ qla24xx_configure_vp(scsi_qla_host_t *vha) ...@@ -194,11 +195,11 @@ qla24xx_configure_vp(scsi_qla_host_t *vha)
void void
qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb) qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
{ {
scsi_qla_host_t *vha; scsi_qla_host_t *vha, *tvha;
struct qla_hw_data *ha = rsp->hw; struct qla_hw_data *ha = rsp->hw;
int i = 0; int i = 0;
list_for_each_entry(vha, &ha->vp_list, list) { list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
if (vha->vp_idx) { if (vha->vp_idx) {
switch (mb[0]) { switch (mb[0]) {
case MBA_LIP_OCCURRED: case MBA_LIP_OCCURRED:
...@@ -300,6 +301,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha) ...@@ -300,6 +301,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha)
int ret; int ret;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
scsi_qla_host_t *vp; scsi_qla_host_t *vp;
struct scsi_qla_host *tvp;
if (vha->vp_idx) if (vha->vp_idx)
return; return;
...@@ -308,7 +310,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha) ...@@ -308,7 +310,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha)
clear_bit(VP_DPC_NEEDED, &vha->dpc_flags); clear_bit(VP_DPC_NEEDED, &vha->dpc_flags);
list_for_each_entry(vp, &ha->vp_list, list) { list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
if (vp->vp_idx) if (vp->vp_idx)
ret = qla2x00_do_dpc_vp(vp); ret = qla2x00_do_dpc_vp(vp);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment