nvme: clean up nvme_scan_work
authorChristoph Hellwig <hch@lst.de>
Sat, 4 Apr 2020 08:16:03 +0000 (10:16 +0200)
committerJens Axboe <axboe@kernel.dk>
Sat, 9 May 2020 22:18:35 +0000 (16:18 -0600)
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>
drivers/nvme/host/core.c

index a9af83918afe6d6c7ee53856ab6d878a8940ab45..025a8a6d81c70d0ed55285f08fab640b6d1f6eb3 100644 (file)
@@ -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);