nvmet: add 'host_traddr' callback for debugfs
authorHannes Reinecke <hare@kernel.org>
Mon, 27 May 2024 05:15:20 +0000 (07:15 +0200)
committerKeith Busch <kbusch@kernel.org>
Mon, 24 Jun 2024 19:53:43 +0000 (12:53 -0700)
We want to display the transport address of the connected host
in debugfs, but this is a property of the transport.
So add a callback 'host_traddr' to allow the transport drivers
to fill in the data.

Signed-off-by: Hannes Reinecke <hare@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/core.c
drivers/nvme/target/debugfs.c
drivers/nvme/target/nvmet.h

index d1b438f..650371c 100644 (file)
@@ -1542,6 +1542,14 @@ void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
 }
 EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error);
 
+ssize_t nvmet_ctrl_host_traddr(struct nvmet_ctrl *ctrl,
+               char *traddr, size_t traddr_len)
+{
+       if (!ctrl->ops->host_traddr)
+               return -EOPNOTSUPP;
+       return ctrl->ops->host_traddr(ctrl, traddr, traddr_len);
+}
+
 static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port,
                const char *subsysnqn)
 {
index d60778b..cb2befc 100644 (file)
@@ -115,6 +115,23 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
 }
 NVMET_DEBUGFS_RW_ATTR(nvmet_ctrl_state);
 
+static int nvmet_ctrl_host_traddr_show(struct seq_file *m, void *p)
+{
+       struct nvmet_ctrl *ctrl = m->private;
+       ssize_t size;
+       char buf[NVMF_TRADDR_SIZE + 1];
+
+       size = nvmet_ctrl_host_traddr(ctrl, buf, NVMF_TRADDR_SIZE);
+       if (size < 0) {
+               buf[0] = '\0';
+               size = 0;
+       }
+       buf[size] = '\0';
+       seq_printf(m, "%s\n", buf);
+       return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_ctrl_host_traddr);
+
 int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
 {
        char name[32];
@@ -138,6 +155,8 @@ int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
                            &nvmet_ctrl_kato_fops);
        debugfs_create_file("state", S_IRUSR | S_IWUSR, ctrl->debugfs_dir, ctrl,
                            &nvmet_ctrl_state_fops);
+       debugfs_create_file("host_traddr", S_IRUSR, ctrl->debugfs_dir, ctrl,
+                           &nvmet_ctrl_host_traddr_fops);
        return 0;
 }
 
index 1bd26df..190f55e 100644 (file)
@@ -354,6 +354,8 @@ struct nvmet_fabrics_ops {
        void (*delete_ctrl)(struct nvmet_ctrl *ctrl);
        void (*disc_traddr)(struct nvmet_req *req,
                        struct nvmet_port *port, char *traddr);
+       ssize_t (*host_traddr)(struct nvmet_ctrl *ctrl,
+                       char *traddr, size_t traddr_len);
        u16 (*install_queue)(struct nvmet_sq *nvme_sq);
        void (*discovery_chg)(struct nvmet_port *port);
        u8 (*get_mdts)(const struct nvmet_ctrl *ctrl);
@@ -502,6 +504,8 @@ struct nvmet_ctrl *nvmet_ctrl_find_get(const char *subsysnqn,
                                       struct nvmet_req *req);
 void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
 u16 nvmet_check_ctrl_status(struct nvmet_req *req);
+ssize_t nvmet_ctrl_host_traddr(struct nvmet_ctrl *ctrl,
+               char *traddr, size_t traddr_len);
 
 struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
                enum nvme_subsys_type type);