|
@@ -1140,9 +1140,14 @@ static bool nvme_should_reset(struct nvme_dev *dev, u32 csts)
|
|
|
*/
|
|
|
bool nssro = dev->subsystem && (csts & NVME_CSTS_NSSRO);
|
|
|
|
|
|
- /* If there is a reset ongoing, we shouldn't reset again. */
|
|
|
- if (dev->ctrl.state == NVME_CTRL_RESETTING)
|
|
|
+ /* If there is a reset/reinit ongoing, we shouldn't reset again. */
|
|
|
+ switch (dev->ctrl.state) {
|
|
|
+ case NVME_CTRL_RESETTING:
|
|
|
+ case NVME_CTRL_RECONNECTING:
|
|
|
return false;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
/* We shouldn't reset unless the controller is on fatal error state
|
|
|
* _or_ if we lost the communication with it.
|
|
@@ -2284,6 +2289,16 @@ static void nvme_reset_work(struct work_struct *work)
|
|
|
if (dev->ctrl.ctrl_config & NVME_CC_ENABLE)
|
|
|
nvme_dev_disable(dev, false);
|
|
|
|
|
|
+ /*
|
|
|
+ * Introduce RECONNECTING state from nvme-fc/rdma transports to mark the
|
|
|
+ * initializing procedure here.
|
|
|
+ */
|
|
|
+ if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_RECONNECTING)) {
|
|
|
+ dev_warn(dev->ctrl.device,
|
|
|
+ "failed to mark controller RECONNECTING\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
result = nvme_pci_enable(dev);
|
|
|
if (result)
|
|
|
goto out;
|