static void
 nvme_fc_ctrl_connectivity_loss(struct nvme_fc_ctrl *ctrl)
 {
+       enum nvme_ctrl_state state;
+       unsigned long flags;
+
        dev_info(ctrl->ctrl.device,
                "NVME-FC{%d}: controller connectivity lost. Awaiting "
                "Reconnect", ctrl->cnum);
 
-       switch (nvme_ctrl_state(&ctrl->ctrl)) {
+       spin_lock_irqsave(&ctrl->lock, flags);
+       set_bit(ASSOC_FAILED, &ctrl->flags);
+       state = nvme_ctrl_state(&ctrl->ctrl);
+       spin_unlock_irqrestore(&ctrl->lock, flags);
+
+       switch (state) {
        case NVME_CTRL_NEW:
        case NVME_CTRL_LIVE:
                /*
         */
        if (ctrl->ctrl.state == NVME_CTRL_CONNECTING) {
                __nvme_fc_abort_outstanding_ios(ctrl, true);
-               set_bit(ASSOC_FAILED, &ctrl->flags);
                dev_warn(ctrl->ctrl.device,
                        "NVME-FC{%d}: transport error during (re)connect\n",
                        ctrl->cnum);
                else
                        ret = nvme_fc_recreate_io_queues(ctrl);
        }
-       if (!ret && test_bit(ASSOC_FAILED, &ctrl->flags))
-               ret = -EIO;
        if (ret)
                goto out_term_aen_ops;
 
-       changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_LIVE);
+       spin_lock_irqsave(&ctrl->lock, flags);
+       if (!test_bit(ASSOC_FAILED, &ctrl->flags))
+               changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_LIVE);
+       else
+               ret = -EIO;
+       spin_unlock_irqrestore(&ctrl->lock, flags);
+
+       if (ret)
+               goto out_term_aen_ops;
 
        ctrl->ctrl.nr_reconnects = 0;