From: Alistair Francis Allow userspace to trigger a KeyUpdate via debugfs. This patch exposes a key_update file that can be written to with the queue number to trigger a KeyUpdate on that queue. Signed-off-by: Alistair Francis --- v3: - New patch drivers/nvme/host/tcp.c | 72 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 4f27319f0078..8c6d18727e90 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -1432,6 +1433,75 @@ static void update_tls_keys(struct nvme_tcp_queue *queue) } } +#ifdef CONFIG_NVME_TCP_TLS +#define NVME_DEBUGFS_RW_ATTR(field) \ + static int field##_open(struct inode *inode, struct file *file) \ + { return single_open(file, field##_show, inode->i_private); } \ + \ + static const struct file_operations field##_fops = { \ + .open = field##_open, \ + .read = seq_read, \ + .write = field##_write, \ + .release = single_release, \ + } + +static int nvme_ctrl_key_update_show(struct seq_file *m, void *p) +{ + seq_printf(m, "0\n"); + + return 0; +} + +static ssize_t nvme_ctrl_key_update_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct seq_file *m = file->private_data; + struct nvme_ctrl *nctrl = m->private; + struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl); + char kbuf[16] = {0}; + int queue_nr, rc; + struct nvme_tcp_queue *queue; + + if (count > sizeof(kbuf) - 1) + return -EINVAL; + if (copy_from_user(kbuf, buf, count)) + return -EFAULT; + kbuf[count] = 0; + + rc = kstrtouint(kbuf, 10, &queue_nr); + if (rc) + return rc; + + if (queue_nr >= nctrl->queue_count) + return -EINVAL; + + queue = &ctrl->queues[queue_nr]; + + update_tls_keys(queue); + + return count; +} +NVME_DEBUGFS_RW_ATTR(nvme_ctrl_key_update); +#endif + +static void nvme_tcp_debugfs_init(struct nvme_ctrl *ctrl, + const char *dev_name) +{ + struct dentry *parent; + + /* create debugfs directory and attribute */ + parent = debugfs_create_dir(dev_name, NULL); + if (IS_ERR(parent)) { + pr_warn("%s: failed to create debugfs directory\n", dev_name); + return; + } + +#ifdef CONFIG_NVME_TCP_TLS + debugfs_create_file("key_update", S_IWUSR, parent, ctrl, + &nvme_ctrl_key_update_fops); +#endif +} + static void nvme_tcp_io_work(struct work_struct *w) { struct nvme_tcp_queue *queue = @@ -3065,6 +3135,8 @@ static struct nvme_ctrl *nvme_tcp_create_ctrl(struct device *dev, list_add_tail(&ctrl->list, &nvme_tcp_ctrl_list); mutex_unlock(&nvme_tcp_ctrl_mutex); + nvme_tcp_debugfs_init(&ctrl->ctrl, dev_name(dev)); + return &ctrl->ctrl; out_uninit_ctrl: -- 2.51.0