| From 50b7daa89e1eb13767b3e90284702ac79ea34c2c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 2 May 2025 10:58:00 +0200 |
| Subject: nvme: unblock ctrl state transition for firmware update |
| |
| From: Daniel Wagner <wagi@kernel.org> |
| |
| [ Upstream commit 650415fca0a97472fdd79725e35152614d1aad76 ] |
| |
| The original nvme subsystem design didn't have a CONNECTING state; the |
| state machine allowed transitions from RESETTING to LIVE directly. |
| |
| With the introduction of nvme fabrics the CONNECTING state was |
| introduce. Over time the nvme-pci started to use the CONNECTING state as |
| well. |
| |
| Eventually, a bug fix for the nvme-fc started to depend that the only |
| valid transition to LIVE was from CONNECTING. Though this change didn't |
| update the firmware update handler which was still depending on |
| RESETTING to LIVE transition. |
| |
| The simplest way to address it for the time being is to switch into |
| CONNECTING state before going to LIVE state. |
| |
| Fixes: d2fe192348f9 ("nvme: only allow entering LIVE from CONNECTING state") |
| Reported-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Daniel Wagner <wagi@kernel.org> |
| Closes: https://lore.kernel.org/all/0134ea15-8d5f-41f7-9e9a-d7e6d82accaa@roeck-us.net |
| Reviewed-by: Keith Busch <kbusch@kernel.org> |
| Reviewed-by: Sagi Grimberg <sagi@grimberg.me> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/host/core.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
| index 150de63b26b2c..a27149e37a988 100644 |
| --- a/drivers/nvme/host/core.c |
| +++ b/drivers/nvme/host/core.c |
| @@ -4492,7 +4492,8 @@ static void nvme_fw_act_work(struct work_struct *work) |
| msleep(100); |
| } |
| |
| - if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE)) |
| + if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_CONNECTING) || |
| + !nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE)) |
| return; |
| |
| nvme_unquiesce_io_queues(ctrl); |
| -- |
| 2.39.5 |
| |