void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, struct event_arg *ea)
 {
        struct fc_port *fcport = ea->fcport;
+       unsigned long flags;
 
        ql_dbg(ql_dbg_disc, vha, 0x20d2,
            "%s %8phC DS %d LS %d rc %d login %d|%d rscn %d|%d lid %d\n",
                ql_dbg(ql_dbg_disc, vha, 0x2066,
                    "%s %8phC: adisc fail: post delete\n",
                    __func__, ea->fcport->port_name);
+
+               spin_lock_irqsave(&vha->work_lock, flags);
                /* deleted = 0 & logout_on_delete = force fw cleanup */
-               fcport->deleted = 0;
+               if (fcport->deleted == QLA_SESS_DELETED)
+                       fcport->deleted = 0;
+
                fcport->logout_on_delete = 1;
+               spin_unlock_irqrestore(&vha->work_lock, flags);
+
                qlt_schedule_sess_for_deletion(ea->fcport);
                return;
        }
 
        spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
        ea->fcport->login_gen++;
-       ea->fcport->deleted = 0;
        ea->fcport->logout_on_delete = 1;
 
        if (!ea->fcport->login_succ && !IS_SW_RESV_ADDR(ea->fcport->d_id)) {
 void
 qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
 {
+       unsigned long flags;
+
        if (IS_SW_RESV_ADDR(fcport->d_id))
                return;
 
        qla2x00_set_fcport_disc_state(fcport, DSC_UPD_FCPORT);
        fcport->login_retry = vha->hw->login_retry_count;
        fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
+
+       spin_lock_irqsave(&vha->work_lock, flags);
        fcport->deleted = 0;
+       spin_unlock_irqrestore(&vha->work_lock, flags);
+
        if (vha->hw->current_topology == ISP_CFG_NL)
                fcport->logout_on_delete = 0;
        else
 
                        (struct imm_ntfy_from_isp *)sess->iocb, SRB_NACK_LOGO);
        }
 
-       spin_lock_irqsave(&vha->work_lock, flags);
-       sess->flags &= ~FCF_ASYNC_SENT;
-       spin_unlock_irqrestore(&vha->work_lock, flags);
-
        spin_lock_irqsave(&ha->tgt.sess_lock, flags);
        if (sess->se_sess) {
                sess->se_sess = NULL;
 
        qla2x00_set_fcport_disc_state(sess, DSC_DELETED);
        sess->fw_login_state = DSC_LS_PORT_UNAVAIL;
-       sess->deleted = QLA_SESS_DELETED;
 
        if (sess->login_succ && !IS_SW_RESV_ADDR(sess->d_id)) {
                vha->fcport_count--;
 
        sess->explicit_logout = 0;
        spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
-       sess->free_pending = 0;
 
        qla2x00_dfs_remove_rport(vha, sess);
 
+       spin_lock_irqsave(&vha->work_lock, flags);
+       sess->flags &= ~FCF_ASYNC_SENT;
+       sess->deleted = QLA_SESS_DELETED;
+       sess->free_pending = 0;
+       spin_unlock_irqrestore(&vha->work_lock, flags);
+
        ql_dbg(ql_dbg_disc, vha, 0xf001,
            "Unregistration of sess %p %8phC finished fcp_cnt %d\n",
                sess, sess->port_name, vha->fcport_count);
         * management from being sent.
         */
        sess->flags |= FCF_ASYNC_SENT;
+       sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
        spin_unlock_irqrestore(&sess->vha->work_lock, flags);
 
        if (sess->se_sess)
                vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess);
 
-       sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
        qla2x00_set_fcport_disc_state(sess, DSC_DELETE_PEND);
        sess->last_rscn_gen = sess->rscn_gen;
        sess->last_login_gen = sess->login_gen;