mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-17 18:51:27 +00:00
qla2x00t-32gbit: Fix Relogin to prevent modifying scan_state flag
Relogin fails to move forward due to scan_state flag indicating device is not there. Before relogin process, Session delete process accidently modified the scan_state flag. [ commit 8b5292bcfcacf15182a77a973a98d310e76fd58b upstream ] git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8529 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -298,8 +298,13 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
|
||||
struct srb_iocb *lio;
|
||||
int rval = QLA_FUNCTION_FAILED;
|
||||
|
||||
if (!vha->flags.online)
|
||||
goto done;
|
||||
if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) ||
|
||||
fcport->loop_id == FC_NO_LOOP_ID) {
|
||||
ql_log(ql_log_warn, vha, 0xffff,
|
||||
"%s: %8phC - not sending command.\n",
|
||||
__func__, fcport->port_name);
|
||||
return rval;
|
||||
}
|
||||
|
||||
sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
|
||||
if (!sp)
|
||||
@@ -1273,8 +1278,13 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt)
|
||||
struct port_database_24xx *pd;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
|
||||
if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) ||
|
||||
fcport->loop_id == FC_NO_LOOP_ID) {
|
||||
ql_log(ql_log_warn, vha, 0xffff,
|
||||
"%s: %8phC - not sending command.\n",
|
||||
__func__, fcport->port_name);
|
||||
return rval;
|
||||
}
|
||||
|
||||
fcport->disc_state = DSC_GPDB;
|
||||
|
||||
@@ -1961,8 +1971,11 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
|
||||
return;
|
||||
}
|
||||
|
||||
if (fcport->disc_state == DSC_DELETE_PEND)
|
||||
if ((fcport->disc_state == DSC_DELETE_PEND) ||
|
||||
(fcport->disc_state == DSC_DELETED)) {
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ea->sp->gen2 != fcport->login_gen) {
|
||||
/* target side must have changed it. */
|
||||
@@ -6706,8 +6719,10 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
||||
}
|
||||
|
||||
/* Clear all async request states across all VPs. */
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list)
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
|
||||
fcport->scan_state = 0;
|
||||
}
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
list_for_each_entry(vp, &ha->vp_list, list) {
|
||||
atomic_inc(&vp->vref_count);
|
||||
|
||||
@@ -5143,6 +5143,7 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
|
||||
if (fcport) {
|
||||
fcport->id_changed = 1;
|
||||
fcport->scan_state = QLA_FCPORT_FOUND;
|
||||
fcport->chip_reset = vha->hw->base_qpair->chip_reset;
|
||||
memcpy(fcport->node_name, e->u.new_sess.node_name, WWN_SIZE);
|
||||
|
||||
if (pla) {
|
||||
|
||||
@@ -1224,7 +1224,6 @@ static void qla24xx_chk_fcp_state(struct fc_port *sess)
|
||||
sess->logout_on_delete = 0;
|
||||
sess->logo_ack_needed = 0;
|
||||
sess->fw_login_state = DSC_LS_PORT_UNAVAIL;
|
||||
sess->scan_state = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user