[SCSI] qla2xxx: Correct vport delete bug.
Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
605aa2bcd5
commit
ee546b6e04
3 changed files with 15 additions and 9 deletions
|
@ -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,
|
||||||
/* 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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
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 *
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue