OSDN Git Service

nvme: lift the file open code from nvme_ctrl_get_by_path
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Thu, 17 Sep 2020 01:11:02 +0000 (18:11 -0700)
committerChristoph Hellwig <hch@lst.de>
Sun, 27 Sep 2020 07:14:18 +0000 (09:14 +0200)
Lift opening the file open/close code from nvme_ctrl_get_by_path into
the caller, just keeping a simple nvme_ctrl_from_file() helper.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
[hch: refactored a bit, split the bug fixes into a separate prep patch]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h
drivers/nvme/target/passthru.c

index 64f4bf8..35cd177 100644 (file)
@@ -4668,28 +4668,13 @@ void nvme_sync_queues(struct nvme_ctrl *ctrl)
 }
 EXPORT_SYMBOL_GPL(nvme_sync_queues);
 
-struct nvme_ctrl *nvme_ctrl_get_by_path(const char *path)
+struct nvme_ctrl *nvme_ctrl_from_file(struct file *file)
 {
-       struct nvme_ctrl *ctrl;
-       struct file *f;
-
-       f = filp_open(path, O_RDWR, 0);
-       if (IS_ERR(f))
-               return ERR_CAST(f);
-
-       if (f->f_op != &nvme_dev_fops) {
-               ctrl = ERR_PTR(-EINVAL);
-               goto out_close;
-       }
-
-       ctrl = f->private_data;
-       nvme_get_ctrl(ctrl);
-
-out_close:
-       filp_close(f, NULL);
-       return ctrl;
+       if (file->f_op != &nvme_dev_fops)
+               return NULL;
+       return file->private_data;
 }
-EXPORT_SYMBOL_NS_GPL(nvme_ctrl_get_by_path, NVME_TARGET_PASSTHRU);
+EXPORT_SYMBOL_NS_GPL(nvme_ctrl_from_file, NVME_TARGET_PASSTHRU);
 
 /*
  * Check we didn't inadvertently grow the command structure sizes:
index 398394b..4749baa 100644 (file)
@@ -822,7 +822,7 @@ static inline void nvme_hwmon_init(struct nvme_ctrl *ctrl) { }
 u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
                         u8 opcode);
 void nvme_execute_passthru_rq(struct request *rq);
-struct nvme_ctrl *nvme_ctrl_get_by_path(const char *path);
+struct nvme_ctrl *nvme_ctrl_from_file(struct file *file);
 struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid);
 void nvme_put_ns(struct nvme_ns *ns);
 
index dacfa74..e3a5f84 100644 (file)
@@ -474,6 +474,7 @@ u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req)
 int nvmet_passthru_ctrl_enable(struct nvmet_subsys *subsys)
 {
        struct nvme_ctrl *ctrl;
+       struct file *file;
        int ret = -EINVAL;
        void *old;
 
@@ -488,24 +489,29 @@ int nvmet_passthru_ctrl_enable(struct nvmet_subsys *subsys)
                goto out_unlock;
        }
 
-       ctrl = nvme_ctrl_get_by_path(subsys->passthru_ctrl_path);
-       if (IS_ERR(ctrl)) {
-               ret = PTR_ERR(ctrl);
+       file = filp_open(subsys->passthru_ctrl_path, O_RDWR, 0);
+       if (IS_ERR(file)) {
+               ret = PTR_ERR(file);
+               goto out_unlock;
+       }
+
+       ctrl = nvme_ctrl_from_file(file);
+       if (!ctrl) {
                pr_err("failed to open nvme controller %s\n",
                       subsys->passthru_ctrl_path);
 
-               goto out_unlock;
+               goto out_put_file;
        }
 
        old = xa_cmpxchg(&passthru_subsystems, ctrl->cntlid, NULL,
                         subsys, GFP_KERNEL);
        if (xa_is_err(old)) {
                ret = xa_err(old);
-               goto out_put_ctrl;
+               goto out_put_file;
        }
 
        if (old)
-               goto out_put_ctrl;
+               goto out_put_file;
 
        subsys->passthru_ctrl = ctrl;
        subsys->ver = ctrl->vs;
@@ -516,13 +522,12 @@ int nvmet_passthru_ctrl_enable(struct nvmet_subsys *subsys)
                        NVME_TERTIARY(subsys->ver));
                subsys->ver = NVME_VS(1, 2, 1);
        }
-
+       nvme_get_ctrl(ctrl);
        __module_get(subsys->passthru_ctrl->ops->module);
-       mutex_unlock(&subsys->lock);
-       return 0;
+       ret = 0;
 
-out_put_ctrl:
-       nvme_put_ctrl(ctrl);
+out_put_file:
+       filp_close(file, NULL);
 out_unlock:
        mutex_unlock(&subsys->lock);
        return ret;