| From b42157c2ac9eecac485b6384fca6a65c5f536bb6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 16 Apr 2021 10:45:21 +0800 |
| Subject: nvmet: avoid queuing keep-alive timer if it is disabled |
| |
| From: Hou Pu <houpu.main@gmail.com> |
| |
| [ Upstream commit 8f864c595bed20ef85fef3e7314212b73800d51d ] |
| |
| Issue following command: |
| nvme set-feature -f 0xf -v 0 /dev/nvme1n1 # disable keep-alive timer |
| nvme admin-passthru -o 0x18 /dev/nvme1n1 # send keep-alive command |
| will make keep-alive timer fired and thus delete the controller like |
| below: |
| |
| [247459.907635] nvmet: ctrl 1 keep-alive timer (0 seconds) expired! |
| [247459.930294] nvmet: ctrl 1 fatal error occurred! |
| |
| Avoid this by not queuing delayed keep-alive if it is disabled when |
| keep-alive command is received from the admin queue. |
| |
| Signed-off-by: Hou Pu <houpu.main@gmail.com> |
| Tested-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/target/admin-cmd.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c |
| index fe6b8aa90b53..81224447605b 100644 |
| --- a/drivers/nvme/target/admin-cmd.c |
| +++ b/drivers/nvme/target/admin-cmd.c |
| @@ -919,15 +919,21 @@ void nvmet_execute_async_event(struct nvmet_req *req) |
| void nvmet_execute_keep_alive(struct nvmet_req *req) |
| { |
| struct nvmet_ctrl *ctrl = req->sq->ctrl; |
| + u16 status = 0; |
| |
| if (!nvmet_check_transfer_len(req, 0)) |
| return; |
| |
| + if (!ctrl->kato) { |
| + status = NVME_SC_KA_TIMEOUT_INVALID; |
| + goto out; |
| + } |
| + |
| pr_debug("ctrl %d update keep-alive timer for %d secs\n", |
| ctrl->cntlid, ctrl->kato); |
| - |
| mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); |
| - nvmet_req_complete(req, 0); |
| +out: |
| + nvmet_req_complete(req, status); |
| } |
| |
| u16 nvmet_parse_admin_cmd(struct nvmet_req *req) |
| -- |
| 2.30.2 |
| |