]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/scsi/qla2xxx/qla_target.c
scsi: qla2xxx: Fix stuck login session using prli_pend_timer
[mirror_ubuntu-hirsute-kernel.git] / drivers / scsi / qla2xxx / qla_target.c
index 51b275a575a52b37ecd0659c88e763bfaf0de2c9..0ef76743a26df5f0a54646f4468bf160fc4d94b0 100644 (file)
@@ -596,7 +596,8 @@ static void qla2x00_async_nack_sp_done(srb_t *sp, int res)
                        spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
                } else {
                        sp->fcport->login_retry = 0;
-                       sp->fcport->disc_state = DSC_LOGIN_COMPLETE;
+                       qla2x00_set_fcport_disc_state(sp->fcport,
+                           DSC_LOGIN_COMPLETE);
                        sp->fcport->deleted = 0;
                        sp->fcport->logout_on_delete = 1;
                }
@@ -966,7 +967,7 @@ void qlt_free_session_done(struct work_struct *work)
                sess->send_els_logo);
 
        if (!IS_SW_RESV_ADDR(sess->d_id)) {
-               qla2x00_mark_device_lost(vha, sess, 0, 0);
+               qla2x00_mark_device_lost(vha, sess, 0);
 
                if (sess->send_els_logo) {
                        qlt_port_logo_t logo;
@@ -1052,7 +1053,7 @@ void qlt_free_session_done(struct work_struct *work)
                        tgt->sess_count--;
        }
 
-       sess->disc_state = DSC_DELETED;
+       qla2x00_set_fcport_disc_state(sess, DSC_DELETED);
        sess->fw_login_state = DSC_LS_PORT_UNAVAIL;
        sess->deleted = QLA_SESS_DELETED;
 
@@ -1104,6 +1105,7 @@ void qlt_free_session_done(struct work_struct *work)
                }
        }
 
+       sess->explicit_logout = 0;
        spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
        sess->free_pending = 0;
 
@@ -1156,11 +1158,10 @@ void qlt_unreg_sess(struct fc_port *sess)
                vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess);
 
        sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
-       sess->disc_state = DSC_DELETE_PEND;
+       qla2x00_set_fcport_disc_state(sess, DSC_DELETE_PEND);
        sess->last_rscn_gen = sess->rscn_gen;
        sess->last_login_gen = sess->login_gen;
 
-       INIT_WORK(&sess->free_work, qlt_free_session_done);
        queue_work(sess->vha->hw->wq, &sess->free_work);
 }
 EXPORT_SYMBOL(qlt_unreg_sess);
@@ -1257,7 +1258,8 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
        sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
        spin_unlock_irqrestore(&sess->vha->work_lock, flags);
 
-       sess->disc_state = DSC_DELETE_PEND;
+       sess->prli_pend_timer = 0;
+       qla2x00_set_fcport_disc_state(sess, DSC_DELETE_PEND);
 
        qla24xx_chk_fcp_state(sess);
 
@@ -1265,7 +1267,6 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
            "Scheduling sess %p for deletion %8phC\n",
            sess, sess->port_name);
 
-       INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn);
        WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work));
 }
 
@@ -4804,6 +4805,7 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
 
        switch (sess->disc_state) {
        case DSC_DELETED:
+       case DSC_LOGIN_PEND:
                qlt_plogi_ack_unref(vha, pla);
                break;
 
@@ -6053,7 +6055,7 @@ static fc_port_t *qlt_get_port_database(struct scsi_qla_host *vha,
                if (!IS_SW_RESV_ADDR(fcport->d_id))
                   vha->fcport_count++;
                fcport->login_gen++;
-               fcport->disc_state = DSC_LOGIN_COMPLETE;
+               qla2x00_set_fcport_disc_state(fcport, DSC_LOGIN_COMPLETE);
                fcport->login_succ = 1;
                newfcport = 1;
        }