Linux block layer
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Jens Axboe <axboe@kernel.dk>, linux-block@vger.kernel.org
Cc: Josef Bacik <josef@toxicpanda.com>,
	Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
	Chaitanya Kulkarni <kch@nvidia.com>
Subject: Re: [PATCH 69/98] nvmet: confine fatal errors of unauthenticated queues
Date: Thu, 29 Oct 2026 11:23:17 +0100	[thread overview]
Message-ID: <cb7fe8ed-6cbe-4cff-b35f-b688eeecd577@suse.de> (raw)
In-Reply-To: <20261028164415.1262013-70-axboe@kernel.dk>

On 10/28/26 5:42 PM, Jens Axboe wrote:
> From: Josef Bacik <josef@toxicpanda.com>
> 
> The Connect of an I/O queue names its controller by NQNs and cntlid and
> needs no secret, DH-HMAC-CHAP comes after it. But a fatal error on any
> queue, a failed authentication or a transport error like an unknown PDU
> type, takes the whole controller down. So anyone who can reach the port
> and knows the NQNs can attach a queue to an authenticated host's
> controller and kick that host out, repeatedly.
> 
> Add a ->disconnect_queue() transport op and, for an I/O queue that
> hasn't passed the authentication asked of it, disconnect just that
> queue. Transports without the op (fc, loop) take the controller down as
> before. A queue that had authenticated and fails to do so again is the
> host's own, there the controller goes down as before too.
> 
> [axboe: resolved against the per-queue auth_lock and expiry work that
>   is upstream now]
> 
> Fixes: db1312dd9548 ("nvmet: implement basic In-Band Authentication")
> Cc: Hannes Reinecke <hare@suse.de>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: Sagi Grimberg <sagi@grimberg.me>
> Cc: Chaitanya Kulkarni <kch@nvidia.com>
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> ---
>   drivers/nvme/target/auth.c             |  9 ++++++---
>   drivers/nvme/target/core.c             | 16 ++++++++++++++++
>   drivers/nvme/target/fabrics-cmd-auth.c | 20 ++++++++++++++++----
>   drivers/nvme/target/nvmet.h            |  7 +++++++
>   drivers/nvme/target/rdma.c             |  9 ++++++++-
>   drivers/nvme/target/tcp.c              | 11 ++++++++++-
>   6 files changed, 63 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/nvme/target/auth.c b/drivers/nvme/target/auth.c
> index 5809ce32a2e4..335cf8f3f79e 100644
> --- a/drivers/nvme/target/auth.c
> +++ b/drivers/nvme/target/auth.c
> @@ -261,10 +261,8 @@ void nvmet_destroy_auth(struct nvmet_ctrl *ctrl)
>   #endif
>   }
>   
> -bool nvmet_check_auth_status(struct nvmet_req *req)
> +bool nvmet_sq_auth_status(struct nvmet_sq *sq)
>   {
> -	struct nvmet_sq *sq = req->sq;
> -
>   	if (!sq->ctrl->host_key || sq->authenticated)
>   		return true;
>   
> @@ -272,6 +270,11 @@ bool nvmet_check_auth_status(struct nvmet_req *req)
>   	return sq->qid && nvmet_queue_tls_keyid(sq);
>   }
>   
> +bool nvmet_check_auth_status(struct nvmet_req *req)
> +{
> +	return nvmet_sq_auth_status(req->sq);
> +}
> +
>   int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
>   			 unsigned int shash_len)
>   {
> diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
> index d01f8abed66c..eea67fba6f92 100644
> --- a/drivers/nvme/target/core.c
> +++ b/drivers/nvme/target/core.c
> @@ -1828,6 +1828,22 @@ void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
>   }
>   EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error);
>   
> +/*
> + * A fatal error on one queue.  The Connect command of an I/O queue needs no
> + * secret, so until the queue has authenticated it may be anybody's: do not
> + * let it take down the controller of the host whose NQN it has named.
> + */
> +void nvmet_sq_fatal_error(struct nvmet_sq *sq)
> +{
> +	struct nvmet_ctrl *ctrl = sq->ctrl;
> +
> +	if (sq->qid && ctrl->ops->disconnect_queue && !nvmet_sq_auth_status(sq))
> +		ctrl->ops->disconnect_queue(sq);
> +	else
> +		nvmet_ctrl_fatal_error(ctrl);
> +}
> +EXPORT_SYMBOL_GPL(nvmet_sq_fatal_error);
> +
>   ssize_t nvmet_ctrl_host_traddr(struct nvmet_ctrl *ctrl,
>   		char *traddr, size_t traddr_len)
>   {
> diff --git a/drivers/nvme/target/fabrics-cmd-auth.c b/drivers/nvme/target/fabrics-cmd-auth.c
> index 8c48140eb542..cb6be285b3c4 100644
> --- a/drivers/nvme/target/fabrics-cmd-auth.c
> +++ b/drivers/nvme/target/fabrics-cmd-auth.c
> @@ -33,6 +33,14 @@ static void nvmet_auth_expired_work(struct work_struct *work)
>   	mutex_unlock(&sq->auth_lock);
>   }
>   
> +static void nvmet_auth_fatal_error(struct nvmet_sq *sq, bool passed)
> +{
> +	if (passed)
> +		nvmet_ctrl_fatal_error(sq->ctrl);
> +	else
> +		nvmet_sq_fatal_error(sq);
> +}
> +
>   void nvmet_auth_sq_init(struct nvmet_sq *sq)
>   {
>   	/* Initialize in-band authentication */
> @@ -253,11 +261,13 @@ void nvmet_execute_auth_send(struct nvmet_req *req)
>   	void *d;
>   	u32 tl;
>   	u16 status = 0;
> +	bool passed;
>   	u8 dhchap_status;
>   
>   	mutex_lock(&req->sq->auth_lock);
>   	mutex_lock(&ctrl->auth_lock);
> -
> +	/* A queue that fails to authenticate again is no stranger's. */
> +	passed = nvmet_sq_auth_status(req->sq);
>   	if (req->cmd->auth_send.secp != NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER) {
>   		status = NVME_SC_INVALID_FIELD | NVME_STATUS_DNR;
>   		req->error_loc =
> @@ -430,7 +440,7 @@ void nvmet_execute_auth_send(struct nvmet_req *req)
>   	/* Final states, clear up variables */
>   	nvmet_auth_sq_free(req->sq);
>   	if (req->sq->dhchap_step == NVME_AUTH_DHCHAP_MESSAGE_FAILURE2)
> -		nvmet_ctrl_fatal_error(ctrl);
> +		nvmet_auth_fatal_error(req->sq, passed);
>   
>   complete:
>   	mutex_unlock(&ctrl->auth_lock);
> @@ -551,10 +561,12 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)
>   	void *d;
>   	u32 al;
>   	u16 status = 0;
> +	bool passed;
>   
>   	mutex_lock(&req->sq->auth_lock);
>   	mutex_lock(&ctrl->auth_lock);
> -
> +	/* A queue that fails to authenticate again is no stranger's. */
> +	passed = nvmet_sq_auth_status(req->sq);
>   	if (req->cmd->auth_receive.secp != NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER) {
>   		status = NVME_SC_INVALID_FIELD | NVME_STATUS_DNR;
>   		req->error_loc =
> @@ -641,7 +653,7 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)
>   		nvmet_auth_sq_free(req->sq);
>   	else if (req->sq->dhchap_step == NVME_AUTH_DHCHAP_MESSAGE_FAILURE1) {
>   		nvmet_auth_sq_free(req->sq);
> -		nvmet_ctrl_fatal_error(ctrl);
> +		nvmet_auth_fatal_error(req->sq, passed);
>   	}
>   	mutex_unlock(&ctrl->auth_lock);
>   	mutex_unlock(&req->sq->auth_lock);
> diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
> index cc7fface77de..e354a71514ae 100644
> --- a/drivers/nvme/target/nvmet.h
> +++ b/drivers/nvme/target/nvmet.h
> @@ -441,6 +441,7 @@ struct nvmet_fabrics_ops {
>   	int (*add_port)(struct nvmet_port *port);
>   	void (*remove_port)(struct nvmet_port *port);
>   	void (*delete_ctrl)(struct nvmet_ctrl *ctrl);
> +	void (*disconnect_queue)(struct nvmet_sq *sq);
>   	void (*disc_traddr)(struct nvmet_req *req,
>   			struct nvmet_port *port, char *traddr);
>   	ssize_t (*host_traddr)(struct nvmet_ctrl *ctrl,
> @@ -622,6 +623,7 @@ void nvmet_sq_destroy(struct nvmet_sq *sq);
>   int nvmet_sq_init(struct nvmet_sq *sq, struct nvmet_cq *cq);
>   
>   void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl);
> +void nvmet_sq_fatal_error(struct nvmet_sq *sq);
>   
>   void nvmet_update_cc(struct nvmet_ctrl *ctrl, u32 new);
>   
> @@ -989,6 +991,7 @@ void nvmet_destroy_auth(struct nvmet_ctrl *ctrl);
>   void nvmet_auth_sq_free(struct nvmet_sq *sq);
>   void nvmet_auth_sq_destroy(struct nvmet_sq *sq);
>   int nvmet_setup_dhgroup(struct nvmet_ctrl *ctrl, u8 dhgroup_id);
> +bool nvmet_sq_auth_status(struct nvmet_sq *sq);
>   bool nvmet_check_auth_status(struct nvmet_req *req);
>   int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
>   			 unsigned int hash_len);
> @@ -1015,6 +1018,10 @@ static inline void nvmet_auth_sq_init(struct nvmet_sq *sq)
>   static inline void nvmet_destroy_auth(struct nvmet_ctrl *ctrl) {};
>   static inline void nvmet_auth_sq_free(struct nvmet_sq *sq) {};
>   static inline void nvmet_auth_sq_destroy(struct nvmet_sq *sq) {};
> +static inline bool nvmet_sq_auth_status(struct nvmet_sq *sq)
> +{
> +	return true;
> +}
>   static inline bool nvmet_check_auth_status(struct nvmet_req *req)
>   {
>   	return true;
> diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
> index ffa1e172c259..c4b848f84465 100644
> --- a/drivers/nvme/target/rdma.c
> +++ b/drivers/nvme/target/rdma.c
> @@ -687,7 +687,7 @@ static void nvmet_rdma_release_rsp(struct nvmet_rdma_rsp *rsp)
>   static void nvmet_rdma_error_comp(struct nvmet_rdma_queue *queue)
>   {
>   	if (queue->nvme_sq.ctrl) {
> -		nvmet_ctrl_fatal_error(queue->nvme_sq.ctrl);
> +		nvmet_sq_fatal_error(&queue->nvme_sq);
>   	} else {
>   		/*
>   		 * we didn't setup the controller yet in case
> @@ -1848,6 +1848,12 @@ static int nvmet_rdma_cm_handler(struct rdma_cm_id *cm_id,
>   	return ret;
>   }
>   
> +static void nvmet_rdma_disconnect_queue(struct nvmet_sq *sq)
> +{
> +	nvmet_rdma_queue_disconnect(container_of(sq, struct nvmet_rdma_queue,
> +						 nvme_sq));
> +}
> +
>   static void nvmet_rdma_delete_ctrl(struct nvmet_ctrl *ctrl)
>   {
>   	struct nvmet_rdma_queue *queue, *n;
> @@ -2078,6 +2084,7 @@ static const struct nvmet_fabrics_ops nvmet_rdma_ops = {
>   	.remove_port		= nvmet_rdma_remove_port,
>   	.queue_response		= nvmet_rdma_queue_response,
>   	.delete_ctrl		= nvmet_rdma_delete_ctrl,
> +	.disconnect_queue	= nvmet_rdma_disconnect_queue,
>   	.disc_traddr		= nvmet_rdma_disc_port_addr,
>   	.host_traddr		= nvmet_rdma_host_port_addr,
>   	.get_mdts		= nvmet_rdma_get_mdts,
> diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
> index a2a5f39d2bb7..c8f0c52a1b95 100644
> --- a/drivers/nvme/target/tcp.c
> +++ b/drivers/nvme/target/tcp.c
> @@ -412,7 +412,7 @@ static void nvmet_tcp_socket_error(struct nvmet_tcp_queue *queue, int status)
>   	if (status == -EPIPE || status == -ECONNRESET || !queue->nvme_sq.ctrl)
>   		kernel_sock_shutdown(queue->sock, SHUT_RDWR);
>   	else
> -		nvmet_ctrl_fatal_error(queue->nvme_sq.ctrl);
> +		nvmet_sq_fatal_error(&queue->nvme_sq);
>   }
>   
>   static int nvmet_tcp_map_data(struct nvmet_tcp_cmd *cmd)
> @@ -2223,6 +2223,14 @@ static void nvmet_tcp_remove_port(struct nvmet_port *nport)
>   	kfree(port);
>   }
>   
> +static void nvmet_tcp_disconnect_queue(struct nvmet_sq *sq)
> +{
> +	struct nvmet_tcp_queue *queue =
> +		container_of(sq, struct nvmet_tcp_queue, nvme_sq);
> +
> +	kernel_sock_shutdown(queue->sock, SHUT_RDWR);
> +}
> +
>   static void nvmet_tcp_delete_ctrl(struct nvmet_ctrl *ctrl)
>   {
>   	struct nvmet_tcp_queue *queue;
> @@ -2300,6 +2308,7 @@ static const struct nvmet_fabrics_ops nvmet_tcp_ops = {
>   	.remove_port		= nvmet_tcp_remove_port,
>   	.queue_response		= nvmet_tcp_queue_response,
>   	.delete_ctrl		= nvmet_tcp_delete_ctrl,
> +	.disconnect_queue	= nvmet_tcp_disconnect_queue,
>   	.install_queue		= nvmet_tcp_install_queue,
>   	.disc_traddr		= nvmet_tcp_disc_port_addr,
>   	.host_traddr		= nvmet_tcp_host_port_addr,

No reason why we shouldn't to this for FC.
I'll update the patch.

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

  reply	other threads:[~2026-10-29 10:23 UTC|newest]

Thread overview: 198+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-28 16:41 [PATCHSET 0/98] Various block related fixes Jens Axboe
2026-10-28 16:41 ` [PATCH 01/98] blk-cgroup: keep the old blkg while reassociating a bio Jens Axboe
2026-10-28 19:52   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 02/98] blk-iocost: free struct ioc after a grace period Jens Axboe
2026-10-28 20:00   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 03/98] blk-throttle: don't truncate the cgroup v1 iops limits Jens Axboe
2026-10-28 20:00   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 04/98] block: fix use-after-free of the disk in sync_bdevs() Jens Axboe
2026-10-29 12:31   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 05/98] block: don't lose the status of a failed flush request Jens Axboe
2026-10-29 12:32   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 06/98] blk-mq: don't batch allocate tags from an inactive hctx Jens Axboe
2026-10-29 12:35   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 07/98] block: keep zone write plugs with plugged BIOs alive Jens Axboe
2026-10-29 12:44   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 08/98] block: keep the zone write plug of a failed write Jens Axboe
2026-10-29 12:47   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 09/98] blk-mq: end the request if getting a keyslot fails Jens Axboe
2026-10-29 12:51   ` Christoph Hellwig
2026-10-29 18:30     ` Eric Biggers
2026-10-29 19:08       ` Jens Axboe
2026-10-28 16:41 ` [PATCH 10/98] block: don't unplug a zone under a failed write Jens Axboe
2026-10-28 16:41 ` [PATCH 11/98] block: check dma alignment of bvec iters in async dio Jens Axboe
2026-10-29 12:53   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 12/98] drbd: stop the start_resync timer of a dying device Jens Axboe
2026-10-28 16:41 ` [PATCH 13/98] blk-cgroup: fix root io.stat byte counts on 32-bit Jens Axboe
2026-10-28 19:52   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 14/98] drbd: take req_lock to skip the initial sync as peer Jens Axboe
2026-10-28 16:41 ` [PATCH 15/98] zloop: refuse zone files without read/write_iter Jens Axboe
2026-10-29  7:09   ` Johannes Thumshirn
2026-10-29 12:55   ` Christoph Hellwig
2026-10-29 13:11     ` Jens Axboe
2026-10-28 16:41 ` [PATCH 16/98] block/rnbd-srv: don't free the device on a sysfs error Jens Axboe
2026-10-28 16:41 ` [PATCH 17/98] block/rnbd-srv: drop the sess_dev kobject unlocked Jens Axboe
2026-10-28 16:41 ` [PATCH 18/98] aoe: don't free a device with its work queued Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-29 13:03     ` Jens Axboe
2026-10-29 16:05       ` Bart Van Assche
2026-10-29 16:12         ` Jens Axboe
2026-10-28 16:41 ` [PATCH 19/98] blk-cgroup: don't free a blkg with its punt " Jens Axboe
2026-10-28 19:52   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 20/98] mtip32xx: don't mark the disk dead in the irq handler Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-29 12:56   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 21/98] mtip32xx: abort timed out commands of a removed device Jens Axboe
2026-10-28 16:41 ` [PATCH 22/98] mtip32xx: abort commands in flight on surprise removal Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:41 ` [PATCH 23/98] blk-iolatency: flush enable_work after going offline Jens Axboe
2026-10-28 19:52   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 24/98] zram: accept lz4 dictionaries of more than 64 KiB Jens Axboe
2026-10-29  1:20   ` Sergey Senozhatsky
2026-10-29  1:54     ` Jens Axboe
2026-10-29  1:55       ` Sergey Senozhatsky
2026-10-29  2:03         ` Jens Axboe
2026-10-28 16:41 ` [PATCH 25/98] blk-throttle: pass the I/O counts of a dead group on Jens Axboe
2026-10-28 20:00   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 26/98] blk-throttle: make blkio.reset_stats reset I/O counts Jens Axboe
2026-10-28 19:52   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 27/98] blk-mq: don't trust the cookie in blk_mq_poll() Jens Axboe
2026-10-29 12:57   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 28/98] blk-iocost: check again that the disk is alive Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:41 ` [PATCH 29/98] blk-mq: keep sharing tags fairly after a queue update Jens Axboe
2026-10-29 12:57   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 30/98] blk-mq: don't bring back flags of a completed request Jens Axboe
2026-10-29 12:58   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 31/98] blk-mq: don't forget a timer the driver has restarted Jens Axboe
2026-10-29 12:59   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 32/98] blk-mq-dma: initialize the dma state for P2P, too Jens Axboe
2026-10-29 13:03   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 33/98] blk-mq-dma: map the metadata a passthrough request has Jens Axboe
2026-10-29 13:07   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 34/98] block: don't enter reclaim under rq_qos_mutex Jens Axboe
2026-10-28 20:00   ` Tejun Heo
2026-10-28 16:41 ` [PATCH 35/98] blktrace: remove the debugfs files before the channel Jens Axboe
2026-10-28 16:41 ` [PATCH 36/98] blk-mq: quiesce a queue that joins a quiesced tag set Jens Axboe
2026-10-29 13:08   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 37/98] blk-mq: exit the hctxs of a queue under tag_list_lock Jens Axboe
2026-10-29 13:10   ` Christoph Hellwig
2026-10-29 16:51     ` Nilay Shroff
2026-10-28 16:41 ` [PATCH 38/98] blk-mq: set up " Jens Axboe
2026-10-29 13:11   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 39/98] rnbd-srv: fix use-after-free on two CLOSE messages Jens Axboe
2026-10-28 16:41 ` [PATCH 40/98] rnbd-srv: publish the sess_dev at the end of OPEN Jens Axboe
2026-10-28 16:41 ` [PATCH 41/98] zram: check a bio's range against the device size Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:41 ` [PATCH 42/98] block: partitions/mac: compute the sectors in 64 bits Jens Axboe
2026-10-29 13:11   ` Christoph Hellwig
2026-10-29 13:14     ` Jens Axboe
2026-10-28 16:41 ` [PATCH 43/98] blk-mq: free the bitmaps of tags in the SRCU callback Jens Axboe
2026-10-29  7:24   ` Hannes Reinecke
2026-10-29 13:12   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 44/98] block: apply the segment size to the integrity buffer Jens Axboe
2026-10-29 13:13   ` Christoph Hellwig
2026-10-28 16:41 ` [PATCH 45/98] nvmet: don't truncate the length of big discards Jens Axboe
2026-10-29  7:25   ` Hannes Reinecke
2026-10-28 16:41 ` [PATCH 46/98] nvme-loop: delete the controller if a reset fails Jens Axboe
2026-10-28 16:41 ` [PATCH 47/98] nvme: refuse metadata sizes above 255 bytes Jens Axboe
2026-10-28 17:40   ` Keith Busch
2026-10-28 16:41 ` [PATCH 48/98] nvmet-tcp: rewind the iterator after non-data records Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-29  8:58     ` Hannes Reinecke
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:41 ` [PATCH 49/98] nvmet-tcp: ask for the TLS record type on every receive Jens Axboe
2026-10-29  7:38   ` Hannes Reinecke
2026-10-28 16:41 ` [PATCH 50/98] nvme-tcp: wait for an in-flight TLS handshake callback Jens Axboe
2026-10-29  7:40   ` Hannes Reinecke
2026-10-28 16:41 ` [PATCH 51/98] nvmet-tcp: look again after a short read with TLS Jens Axboe
2026-10-28 16:41 ` [PATCH 52/98] nvme-tcp: keep the socket while the queue is polled Jens Axboe
2026-10-28 16:41 ` [PATCH 53/98] nvme-tcp: don't get stuck on a TLS control record Jens Axboe
2026-10-29  7:44   ` Hannes Reinecke
2026-10-28 16:41 ` [PATCH 54/98] nvme-tcp: start error recovery after a TLS KeyUpdate Jens Axboe
2026-10-29  7:49   ` Hannes Reinecke
2026-10-28 16:41 ` [PATCH 55/98] nvme-tcp: don't act on PDUs for a command being sent Jens Axboe
2026-10-28 16:41 ` [PATCH 56/98] nvme-tcp: don't queue the AER while it is " Jens Axboe
2026-10-28 16:42 ` [PATCH 57/98] nvme-tcp: don't send SIGPIPE to whoever submits I/O Jens Axboe
2026-10-28 16:42 ` [PATCH 58/98] nvme-fabrics: reconnect if the association is gone Jens Axboe
2026-10-28 16:42 ` [PATCH 59/98] nvmet-auth: serialize the commands of a controller Jens Axboe
2026-10-29  9:33   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 60/98] nvmet-auth: keep the negotiated hash per queue Jens Axboe
2026-10-29  9:43   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 61/98] nvmet-auth: authenticate the I/O queues again Jens Axboe
2026-10-28 16:42 ` [PATCH 62/98] nvmet: don't mix queues with and without TLS Jens Axboe
2026-10-29  9:52   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 63/98] nvmet-auth: refuse a reply without a DH value Jens Axboe
2026-10-29  9:45   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 64/98] nvmet-auth: keep the old keys if the new ones fail Jens Axboe
2026-10-29  9:53   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 65/98] nvmet-auth: take only AUTH_Negotiate for a negotiation Jens Axboe
2026-10-29  9:55   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 66/98] nvmet-auth: free the old data on a new AUTH_Negotiate Jens Axboe
2026-10-29  9:56   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 67/98] nvmet-auth: fix the check of the offered DH groups Jens Axboe
2026-10-29  9:57   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 68/98] nvmet: accept I/O queues on the controller's port only Jens Axboe
2026-10-29  9:58   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 69/98] nvmet: confine fatal errors of unauthenticated queues Jens Axboe
2026-10-29 10:23   ` Hannes Reinecke [this message]
2026-10-28 16:42 ` [PATCH 70/98] nvmet-tcp: don't wait for the host in the accept work Jens Axboe
2026-10-28 16:42 ` [PATCH 71/98] nvmet: check the host NQN against the TLS PSK identity Jens Axboe
2026-10-28 16:42 ` [PATCH 72/98] nvmet: fix NULL dereference of PCI endpoint targets Jens Axboe
2026-10-28 16:42 ` [PATCH 73/98] nvmet-tcp: stop listening when a port is removed Jens Axboe
2026-10-29 10:02   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 74/98] nvme-tcp: keep the page frag cache with the controller Jens Axboe
2026-10-28 16:42 ` [PATCH 75/98] nvmet-tcp: hold the queue while the TLS timer is armed Jens Axboe
2026-10-28 16:42 ` [PATCH 76/98] nvmet: fix NULL dereference in debugfs host_traddr Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:42 ` [PATCH 77/98] nvmet-tcp: let the accept work come to an end Jens Axboe
2026-10-29 10:06   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 78/98] nvmet-tcp: don't read a removed port at Connect time Jens Axboe
2026-10-28 16:42 ` [PATCH 79/98] nvme-tcp: start error recovery when a send fails Jens Axboe
2026-10-29 10:08   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 80/98] nvme-loop: don't BUG() if a scan runs beside a reset Jens Axboe
2026-10-29 10:08   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 81/98] nvmet: fix pc_ref use-after-free in preempt and abort Jens Axboe
2026-10-28 16:42 ` [PATCH 82/98] nvmet: move preempt and abort work off nvmet-wq Jens Axboe
2026-10-28 16:42 ` [PATCH 83/98] nvmet-rdma: treat a failed connect as a disconnect Jens Axboe
2026-10-28 16:42 ` [PATCH 84/98] nvmet-rdma: disconnect only established queues Jens Axboe
2026-10-28 16:42 ` [PATCH 85/98] nvmet-rdma: take a device off the list last Jens Axboe
2026-10-28 16:42 ` [PATCH 86/98] nvmet-rdma: queue the release work under the mutex Jens Axboe
2026-10-28 16:42 ` [PATCH 87/98] nvmet-rdma: disconnect a queue on device removal Jens Axboe
2026-10-28 16:42 ` [PATCH 88/98] nvmet-rdma: flush nvmet-wq on module exit Jens Axboe
2026-10-28 16:42 ` [PATCH 89/98] nvmet-rdma: reject queues larger than max_cqe Jens Axboe
2026-10-28 16:42 ` [PATCH 90/98] nvmet-rdma: disable interrupts under rsp_wr_wait_lock Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:42 ` [PATCH 91/98] nvmet-rdma: don't run the wait list recursively Jens Axboe
2026-10-28 16:42 ` [PATCH 92/98] nvmet-rdma: fix a lost run of the wait list Jens Axboe
2026-10-28 16:42 ` [PATCH 93/98] nvmet-fc: only send read data for successful commands Jens Axboe
2026-10-29 10:11   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 94/98] nvmet: wait only for executing I/O in preempt and abort Jens Axboe
2026-10-28 16:42 ` [PATCH 95/98] nvmet-rdma: fix double puts after a failed RDMA WRITE Jens Axboe
2026-10-28 16:42 ` [PATCH 96/98] nvmet: take sq->ref in nvmet_sq_fatal_error() Jens Axboe
2026-10-29 10:11   ` Hannes Reinecke
2026-10-28 16:42 ` [PATCH 97/98] nvmet-rdma: hold sq->ref to post a T10-PI Read's SEND Jens Axboe
2026-10-28 19:57   ` Bart Van Assche
2026-10-28 23:49   ` Bart Van Assche
2026-10-28 16:42 ` [PATCH 98/98] nvmet: don't clear sq->ctrl for a Connect with sqsize 0 Jens Axboe
2026-10-29 10:13   ` Hannes Reinecke
2026-10-28 17:11 ` [PATCHSET 0/98] Various block related fixes Keith Busch
2026-10-28 17:13   ` Jens Axboe
2026-10-28 19:12 ` Keith Busch
2026-10-28 19:22 ` Bart Van Assche
2026-10-28 19:29   ` Jens Axboe
2026-10-28 19:47     ` Bart Van Assche
2026-10-28 21:06       ` Jens Axboe
2026-10-28 23:51         ` Bart Van Assche
2026-10-29 13:19           ` Jens Axboe
2026-10-28 19:52   ` Keith Busch
2026-10-28 21:41 ` (subset) " Jens Axboe
2026-10-29 13:22 ` Jens Axboe
2026-10-29 13:25 ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cb7fe8ed-6cbe-4cff-b35f-b688eeecd577@suse.de \
    --to=hare@suse.de \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=josef@toxicpanda.com \
    --cc=kch@nvidia.com \
    --cc=linux-block@vger.kernel.org \
    --cc=sagi@grimberg.me \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox