lkml.org 
[lkml]   [2020]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v11 5/9] nvme-core: Introduce nvme_ctrl_get_by_path()
    nvme_ctrl_get_by_path() is analagous to blkdev_get_by_path() except it
    gets a struct nvme_ctrl from the path to its char dev (/dev/nvme0).
    It makes use of filp_open() to open the file and uses the private
    data to obtain a pointer to the struct nvme_ctrl. If the fops of the
    file do not match, -EINVAL is returned.

    The purpose of this function is to support NVMe-OF target passthru.

    Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
    Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    ---
    drivers/nvme/host/core.c | 31 +++++++++++++++++++++++++++++++
    drivers/nvme/host/nvme.h | 9 +++++++++
    2 files changed, 40 insertions(+)

    diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
    index 219e24304b4e..756f8ee201d9 100644
    --- a/drivers/nvme/host/core.c
    +++ b/drivers/nvme/host/core.c
    @@ -4227,6 +4227,37 @@ void nvme_sync_queues(struct nvme_ctrl *ctrl)
    }
    EXPORT_SYMBOL_GPL(nvme_sync_queues);

    +#ifdef CONFIG_NVME_TARGET_PASSTHRU
    +/*
    + * The exports that follow within this ifdef are only for
    + * use by the nvmet-passthru and should not be used for
    + * other things.
    + */
    +
    +struct nvme_ctrl *nvme_ctrl_get_by_path(const char *path)
    +{
    + 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;
    +}
    +EXPORT_SYMBOL_GPL(nvme_ctrl_get_by_path);
    +#endif /* CONFIG_NVME_TARGET_PASSTHRU */
    +
    /*
    * Check we didn't inadvertently grow the command structure sizes:
    */
    diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
    index 1024fec7914c..196a0d38e19c 100644
    --- a/drivers/nvme/host/nvme.h
    +++ b/drivers/nvme/host/nvme.h
    @@ -687,4 +687,13 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl);
    static inline void nvme_hwmon_init(struct nvme_ctrl *ctrl) { }
    #endif

    +#ifdef CONFIG_NVME_TARGET_PASSTHRU
    +/*
    + * The exports that follow within this ifdef are only for
    + * use by the nvmet-passthru and should not be used for
    + * other things.
    + */
    +struct nvme_ctrl *nvme_ctrl_get_by_path(const char *path);
    +#endif /* CONFIG_NVME_TARGET_PASSTHRU */
    +
    #endif /* _NVME_H */
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-20 21:38    [W:2.413 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site