From: Christoph Hellwig <hch@lst.de>
Date: Sat, 4 Apr 2020 10:16:03 +0200
Subject: [PATCH] nvme: clean up nvme_scan_work
Git-commit: 25dcaa9292afc0689749099a5ba56fdb264eda7a
Patch-mainline: v5.8-rc1
References: bsc#1159058
Move the check for the supported CNS value into nvme_scan_ns_list, and
limit the life time of the identify controller allocation.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Acked-by: Hannes Reinecke <hare@suse.com>
---
drivers/nvme/host/core.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index a9af83918afe..025a8a6d81c7 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3738,6 +3738,9 @@ static int nvme_scan_ns_list(struct nvme_ctrl *ctrl, unsigned nn)
unsigned num_lists = DIV_ROUND_UP_ULL((u64)nn, 1024);
int ret = 0;
+ if (nvme_ctrl_limited_cns(ctrl))
+ return -EOPNOTSUPP;
+
ns_list = kzalloc(NVME_IDENTIFY_DATA_SIZE, GFP_KERNEL);
if (!ns_list)
return -ENOMEM;
@@ -3824,17 +3827,14 @@ static void nvme_scan_work(struct work_struct *work)
if (nvme_identify_ctrl(ctrl, &id))
return;
+ nn = le32_to_cpu(id->nn);
+ kfree(id);
mutex_lock(&ctrl->scan_lock);
- nn = le32_to_cpu(id->nn);
- if (!nvme_ctrl_limited_cns(ctrl)) {
- if (!nvme_scan_ns_list(ctrl, nn))
- goto out_free_id;
- }
- nvme_scan_ns_sequential(ctrl, nn);
-out_free_id:
+ if (nvme_scan_ns_list(ctrl, nn) != 0)
+ nvme_scan_ns_sequential(ctrl, nn);
mutex_unlock(&ctrl->scan_lock);
- kfree(id);
+
down_write(&ctrl->namespaces_rwsem);
list_sort(NULL, &ctrl->namespaces, ns_cmp);
up_write(&ctrl->namespaces_rwsem);
--
2.16.4