diff options
author | Christoph Hellwig | 2020-04-04 10:16:03 +0200 |
---|---|---|
committer | Jens Axboe | 2020-05-09 16:18:35 -0600 |
commit | 25dcaa9292afc0689749099a5ba56fdb264eda7a (patch) | |
tree | 764556b72ea68ce4d928eba8a768e31a82b387bc | |
parent | b9a5c3d4c34d8bd9fd75f7f28d18a57cb68da237 (diff) |
nvme: clean up nvme_scan_work
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>
-rw-r--r-- | drivers/nvme/host/core.c | 16 |
1 files 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); |