OSDN Git Service

nvme: split init identify into helper
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Mon, 1 Mar 2021 02:06:05 +0000 (18:06 -0800)
committerChristoph Hellwig <hch@lst.de>
Fri, 2 Apr 2021 16:48:26 +0000 (18:48 +0200)
The function nvme_init_ctrl_finish() (formerly nvme_init_identify()) has
grown over the period of time about ~200 lines given the size of nvme id
ctrl data structure.

Move the nvme_id_ctrl data structure related initilzation into helper
nvme_init_identify() and call it from nvme_init_ctrl_finish().

When we move the code into nvme_init_identify() change the local
variable i from int to unsigned int and remove the duplicate kfree()
after nvme_mpath_init() and jump to the label out_free if
nvme_mpath_ini() fails.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c

index 703f6ce..ce16d24 100644 (file)
@@ -3061,28 +3061,14 @@ out:
        return 0;
 }
 
-/*
- * Initialize the cached copies of the Identify data and various controller
- * register in our nvme_ctrl structure.  This should be called as soon as
- * the admin queue is fully up and running.
- */
-int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
+static int nvme_init_identify(struct nvme_ctrl *ctrl)
 {
        struct nvme_id_ctrl *id;
        int ret, page_shift;
        u32 max_hw_sectors;
        bool prev_apst_enabled;
 
-       ret = ctrl->ops->reg_read32(ctrl, NVME_REG_VS, &ctrl->vs);
-       if (ret) {
-               dev_err(ctrl->device, "Reading VS failed (%d)\n", ret);
-               return ret;
-       }
        page_shift = NVME_CAP_MPSMIN(ctrl->cap) + 12;
-       ctrl->sqsize = min_t(u16, NVME_CAP_MQES(ctrl->cap), ctrl->sqsize);
-
-       if (ctrl->vs >= NVME_VS(1, 1, 0))
-               ctrl->subsystem = NVME_CAP_NSSRC(ctrl->cap);
 
        ret = nvme_identify_ctrl(ctrl, &id);
        if (ret) {
@@ -3100,7 +3086,7 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
                ctrl->cntlid = le16_to_cpu(id->cntlid);
 
        if (!ctrl->identified) {
-               int i;
+               unsigned int i;
 
                ret = nvme_init_subsystem(ctrl, id);
                if (ret)
@@ -3213,16 +3199,43 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
        }
 
        ret = nvme_mpath_init(ctrl, id);
-       kfree(id);
-
        if (ret < 0)
-               return ret;
+               goto out_free;
 
        if (ctrl->apst_enabled && !prev_apst_enabled)
                dev_pm_qos_expose_latency_tolerance(ctrl->device);
        else if (!ctrl->apst_enabled && prev_apst_enabled)
                dev_pm_qos_hide_latency_tolerance(ctrl->device);
 
+out_free:
+       kfree(id);
+       return ret;
+}
+
+/*
+ * Initialize the cached copies of the Identify data and various controller
+ * register in our nvme_ctrl structure.  This should be called as soon as
+ * the admin queue is fully up and running.
+ */
+int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
+{
+       int ret;
+
+       ret = ctrl->ops->reg_read32(ctrl, NVME_REG_VS, &ctrl->vs);
+       if (ret) {
+               dev_err(ctrl->device, "Reading VS failed (%d)\n", ret);
+               return ret;
+       }
+
+       ctrl->sqsize = min_t(u16, NVME_CAP_MQES(ctrl->cap), ctrl->sqsize);
+
+       if (ctrl->vs >= NVME_VS(1, 1, 0))
+               ctrl->subsystem = NVME_CAP_NSSRC(ctrl->cap);
+
+       ret = nvme_init_identify(ctrl);
+       if (ret)
+               return ret;
+
        ret = nvme_configure_apst(ctrl);
        if (ret < 0)
                return ret;
@@ -3248,10 +3261,6 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
        ctrl->identified = true;
 
        return 0;
-
-out_free:
-       kfree(id);
-       return ret;
 }
 EXPORT_SYMBOL_GPL(nvme_init_ctrl_finish);