Re: [PATCH v4 6/7] nvme-tcp: Allow userspace to trigger a KeyUpdate with debugfs
From: Hannes Reinecke <hare@suse.de>
Date: 2025-10-20 06:33:12
Also in:
linux-doc, linux-nfs, linux-nvme, lkml
On 10/17/25 06:23, alistair23@gmail.com wrote:
quoted hunk ↗ jump to hunk
From: Alistair Francis <redacted> 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 <redacted> --- v4: - No change 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 791e0cc91ad8..f5c7b646d002 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c@@ -11,6 +11,7 @@ #include <linux/crc32.h> #include <linux/nvme-tcp.h> #include <linux/nvme-keyring.h> +#include <linux/debugfs.h> #include <net/sock.h> #include <net/tcp.h> #include <net/tls.h>@@ -1429,6 +1430,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);
Are you sure this is correct? 'update_tls_keys' is issuing a handshake request with 'HANDSHAKE_KEY_UPDATE_TYPE_RECEIVED'. And the patch introducing it states: At this time we don't support initiating a KeyUpdate. So please move this to the patchset implementing support for initiating KeyUpdates. Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@suse.de +49 911 74053 688 SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich