* [PATCH 0/5] nvme-fc: misc small improvents
@ 2025-10-28 15:26 Daniel Wagner
2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner
` (4 more replies)
0 siblings, 5 replies; 23+ messages in thread
From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw)
To: Justin Tee, Christoph Hellwig, Keith Busch
Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner
I've collected a bunch of patches from the last debugging session. I think it's
worth documenting which conditions are expected in the cleanup path by adding a
bunch of WARNs.
Also found a deadlock in the nvme-fc code, so this one should definitly go in.
Signed-off-by: Daniel Wagner <wagi@kernel.org>
---
Daniel Wagner (5):
nvme-fc: don't hold rport lock when putting ctrl
nvme-fc: check all request and response have been processed
nvmet-fcloop: check all request and response have been processed
nvmet-fcloop: remove unused lsdir member.
nvmet-fc: use pr_* print macros instead of dev_*
drivers/nvme/host/fc.c | 4 ++++
drivers/nvme/target/fc.c | 48 +++++++++++++++++++-------------------------
drivers/nvme/target/fcloop.c | 9 ++++++---
3 files changed, 31 insertions(+), 30 deletions(-)
---
base-commit: 77a4fe6a06e265bd94d2b3cdc87fb3cde877a05b
change-id: 20251028-nvmet-fcloop-fixes-4e57e82f1f15
Best regards,
--
Daniel Wagner <wagi@kernel.org>
^ permalink raw reply [flat|nested] 23+ messages in thread* [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner @ 2025-10-28 15:26 ` Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 2/5] nvme-fc: check all request and response have been processed Daniel Wagner ` (3 subsequent siblings) 4 siblings, 2 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw) To: Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner nvme_fc_ctrl_put can acquire the rport lock when freeing the ctrl object: nvme_fc_ctrl_put nvme_fc_ctrl_free spin_lock_irqsave(rport->lock) Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. Signed-off-by: Daniel Wagner <wagi@kernel.org> --- drivers/nvme/host/fc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 03987f497a5b..2c0ea843ae57 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -1488,7 +1488,9 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, if (ret) /* leave the ctrl get reference */ break; + spin_unlock_irqrestore(&rport->lock, flags); nvme_fc_ctrl_put(ctrl); + spin_lock_irqsave(&rport->lock, flags); } spin_unlock_irqrestore(&rport->lock, flags); -- 2.51.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner @ 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Christoph Hellwig @ 2025-10-29 8:51 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Oct 28, 2025 at 04:26:20PM +0100, Daniel Wagner wrote: > nvme_fc_ctrl_put can acquire the rport lock when freeing the > ctrl object: > > nvme_fc_ctrl_put > nvme_fc_ctrl_free > spin_lock_irqsave(rport->lock) > > Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig @ 2025-11-04 10:51 ` Hannes Reinecke 2025-11-04 12:32 ` Daniel Wagner 1 sibling, 1 reply; 23+ messages in thread From: Hannes Reinecke @ 2025-11-04 10:51 UTC (permalink / raw) To: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel On 10/28/25 16:26, Daniel Wagner wrote: > nvme_fc_ctrl_put can acquire the rport lock when freeing the > ctrl object: > > nvme_fc_ctrl_put > nvme_fc_ctrl_free > spin_lock_irqsave(rport->lock) > > Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> > --- > drivers/nvme/host/fc.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c > index 03987f497a5b..2c0ea843ae57 100644 > --- a/drivers/nvme/host/fc.c > +++ b/drivers/nvme/host/fc.c > @@ -1488,7 +1488,9 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, > if (ret) > /* leave the ctrl get reference */ > break; > + spin_unlock_irqrestore(&rport->lock, flags); > nvme_fc_ctrl_put(ctrl); > + spin_lock_irqsave(&rport->lock, flags); > } > > spin_unlock_irqrestore(&rport->lock, flags); > In theory, yes. In practice we're getting a reference to the controller at the start of the loop, so nvme_fc_ctrl_put() should just decrement the refcount. But _if_ someone manages to sneak in an drop the reference while we are within that loop then the entire logic falls apart as the controller will be deleted and the next loop iteration will trip over an uninitialized pointer. So you would need to modify the loop to use loop_for_each_entry_safe() to avoid this, too. 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 ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-11-04 10:51 ` Hannes Reinecke @ 2025-11-04 12:32 ` Daniel Wagner 0 siblings, 0 replies; 23+ messages in thread From: Daniel Wagner @ 2025-11-04 12:32 UTC (permalink / raw) To: Hannes Reinecke Cc: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Nov 04, 2025 at 11:51:09AM +0100, Hannes Reinecke wrote: > On 10/28/25 16:26, Daniel Wagner wrote: > > nvme_fc_ctrl_put can acquire the rport lock when freeing the > > ctrl object: > > > > nvme_fc_ctrl_put > > nvme_fc_ctrl_free > > spin_lock_irqsave(rport->lock) > > > > Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. > > > > Signed-off-by: Daniel Wagner <wagi@kernel.org> > > --- > > drivers/nvme/host/fc.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c > > index 03987f497a5b..2c0ea843ae57 100644 > > --- a/drivers/nvme/host/fc.c > > +++ b/drivers/nvme/host/fc.c > > @@ -1488,7 +1488,9 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, > > if (ret) > > /* leave the ctrl get reference */ > > break; > > + spin_unlock_irqrestore(&rport->lock, flags); > > nvme_fc_ctrl_put(ctrl); > > + spin_lock_irqsave(&rport->lock, flags); > > } > > spin_unlock_irqrestore(&rport->lock, flags); > > > In theory, yes. I hit this in practice ;) ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 2/5] nvme-fc: check all request and response have been processed 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner 2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner @ 2025-10-28 15:26 ` Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 3/5] nvmet-fcloop: " Daniel Wagner ` (2 subsequent siblings) 4 siblings, 2 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw) To: Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner When the rport is removed there shouldn't be any in flight request or responses. Signed-off-by: Daniel Wagner <wagi@kernel.org> --- drivers/nvme/host/fc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 2c0ea843ae57..dcb7fc2ca0b7 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -520,6 +520,8 @@ nvme_fc_free_rport(struct kref *ref) WARN_ON(rport->remoteport.port_state != FC_OBJSTATE_DELETED); WARN_ON(!list_empty(&rport->ctrl_list)); + WARN_ON(!list_empty(&rport->ls_req_list)); + WARN_ON(!list_empty(&rport->ls_rcv_list)); /* remove from lport list */ spin_lock_irqsave(&nvme_fc_lock, flags); -- 2.51.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 2/5] nvme-fc: check all request and response have been processed 2025-10-28 15:26 ` [PATCH 2/5] nvme-fc: check all request and response have been processed Daniel Wagner @ 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Christoph Hellwig @ 2025-10-29 8:51 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Oct 28, 2025 at 04:26:21PM +0100, Daniel Wagner wrote: > When the rport is removed there shouldn't be any in flight request or > responses. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/5] nvme-fc: check all request and response have been processed 2025-10-28 15:26 ` [PATCH 2/5] nvme-fc: check all request and response have been processed Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig @ 2025-11-04 10:51 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Hannes Reinecke @ 2025-11-04 10:51 UTC (permalink / raw) To: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel On 10/28/25 16:26, Daniel Wagner wrote: > When the rport is removed there shouldn't be any in flight request or > responses. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> > --- > drivers/nvme/host/fc.c | 2 ++ > 1 file changed, 2 insertions(+) > Reviewed-by: Hannes Reinecke <hare@suse.de> 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 ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 3/5] nvmet-fcloop: check all request and response have been processed 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner 2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner 2025-10-28 15:26 ` [PATCH 2/5] nvme-fc: check all request and response have been processed Daniel Wagner @ 2025-10-28 15:26 ` Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 4/5] nvmet-fcloop: remove unused lsdir member Daniel Wagner 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner 4 siblings, 2 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw) To: Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner When the remoteport or the targetport are removed check that there are no inflight requests or responses. Signed-off-by: Daniel Wagner <wagi@kernel.org> --- drivers/nvme/target/fcloop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 5dffcc5becae..4e429a1ea2bd 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1111,8 +1111,10 @@ fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) rport->nport->rport = NULL; spin_unlock_irqrestore(&fcloop_lock, flags); - if (put_port) + if (put_port) { + WARN_ON(!list_empty(&rport->ls_list)); fcloop_nport_put(rport->nport); + } } static void @@ -1130,8 +1132,10 @@ fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) tport->nport->tport = NULL; spin_unlock_irqrestore(&fcloop_lock, flags); - if (put_port) + if (put_port) { + WARN_ON(!list_empty(&tport->ls_list)); fcloop_nport_put(tport->nport); + } } #define FCLOOP_HW_QUEUES 4 -- 2.51.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 3/5] nvmet-fcloop: check all request and response have been processed 2025-10-28 15:26 ` [PATCH 3/5] nvmet-fcloop: " Daniel Wagner @ 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Christoph Hellwig @ 2025-10-29 8:52 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Oct 28, 2025 at 04:26:22PM +0100, Daniel Wagner wrote: > When the remoteport or the targetport are removed check that there are > no inflight requests or responses. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/5] nvmet-fcloop: check all request and response have been processed 2025-10-28 15:26 ` [PATCH 3/5] nvmet-fcloop: " Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig @ 2025-11-04 10:52 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Hannes Reinecke @ 2025-11-04 10:52 UTC (permalink / raw) To: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel On 10/28/25 16:26, Daniel Wagner wrote: > When the remoteport or the targetport are removed check that there are > no inflight requests or responses. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> > --- > drivers/nvme/target/fcloop.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.de> 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 ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 4/5] nvmet-fcloop: remove unused lsdir member. 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner ` (2 preceding siblings ...) 2025-10-28 15:26 ` [PATCH 3/5] nvmet-fcloop: " Daniel Wagner @ 2025-10-28 15:26 ` Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner 4 siblings, 2 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw) To: Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner Nothing is using lsdir member in struct fcloop_lsreq. Signed-off-by: Daniel Wagner <wagi@kernel.org> --- drivers/nvme/target/fcloop.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 4e429a1ea2bd..c30e9a3e014f 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -254,7 +254,6 @@ struct fcloop_nport { struct fcloop_lsreq { struct nvmefc_ls_req *lsreq; struct nvmefc_ls_rsp ls_rsp; - int lsdir; /* H2T or T2H */ int status; struct list_head ls_list; /* fcloop_rport->ls_list */ }; -- 2.51.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 4/5] nvmet-fcloop: remove unused lsdir member. 2025-10-28 15:26 ` [PATCH 4/5] nvmet-fcloop: remove unused lsdir member Daniel Wagner @ 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Christoph Hellwig @ 2025-10-29 8:52 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Oct 28, 2025 at 04:26:23PM +0100, Daniel Wagner wrote: > Nothing is using lsdir member in struct fcloop_lsreq. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/5] nvmet-fcloop: remove unused lsdir member. 2025-10-28 15:26 ` [PATCH 4/5] nvmet-fcloop: remove unused lsdir member Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig @ 2025-11-04 10:52 ` Hannes Reinecke 1 sibling, 0 replies; 23+ messages in thread From: Hannes Reinecke @ 2025-11-04 10:52 UTC (permalink / raw) To: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel On 10/28/25 16:26, Daniel Wagner wrote: > Nothing is using lsdir member in struct fcloop_lsreq. > > Signed-off-by: Daniel Wagner <wagi@kernel.org> > --- > drivers/nvme/target/fcloop.c | 1 - > 1 file changed, 1 deletion(-) > > diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c > index 4e429a1ea2bd..c30e9a3e014f 100644 > --- a/drivers/nvme/target/fcloop.c > +++ b/drivers/nvme/target/fcloop.c > @@ -254,7 +254,6 @@ struct fcloop_nport { > struct fcloop_lsreq { > struct nvmefc_ls_req *lsreq; > struct nvmefc_ls_rsp ls_rsp; > - int lsdir; /* H2T or T2H */ > int status; > struct list_head ls_list; /* fcloop_rport->ls_list */ > }; > Reviewed-by: Hannes Reinecke <hare@suse.de> 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 ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner ` (3 preceding siblings ...) 2025-10-28 15:26 ` [PATCH 4/5] nvmet-fcloop: remove unused lsdir member Daniel Wagner @ 2025-10-28 15:26 ` Daniel Wagner 2025-10-28 15:47 ` Daniel Wagner ` (2 more replies) 4 siblings, 3 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:26 UTC (permalink / raw) To: Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel, Daniel Wagner Many of the nvmet-fc log messages cannot print the device used, because it's not there yet: (NULL device *): {0:0} Association deleted Use the pr_* macros consistently throughout the module and match the output of the nvme-fc module. Using port:association ids are more useful when debugging what's going on, because these match now with the log entries from nvme-fc. --- drivers/nvme/target/fc.c | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 7d84527d5a43..0d9784004c9b 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -490,8 +490,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc) sizeof(*discon_rqst) + sizeof(*discon_acc) + tgtport->ops->lsrqst_priv_sz), GFP_KERNEL); if (!lsop) { - dev_info(tgtport->dev, - "{%d:%d} send Disconnect Association failed: ENOMEM\n", + pr_info("{%d:%d}: send Disconnect Association failed: ENOMEM\n", tgtport->fc_target_port.port_num, assoc->a_id); return; } @@ -513,8 +512,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc) ret = nvmet_fc_send_ls_req_async(tgtport, lsop, nvmet_fc_disconnect_assoc_done); if (ret) { - dev_info(tgtport->dev, - "{%d:%d} XMT Disconnect Association failed: %d\n", + pr_info("{%d:%d}: XMT Disconnect Association failed: %d\n", tgtport->fc_target_port.port_num, assoc->a_id, ret); kfree(lsop); } @@ -1187,8 +1185,7 @@ nvmet_fc_target_assoc_free(struct kref *ref) if (oldls) nvmet_fc_xmt_ls_rsp(tgtport, oldls); ida_free(&tgtport->assoc_cnt, assoc->a_id); - dev_info(tgtport->dev, - "{%d:%d} Association freed\n", + pr_info("{%d:%d}: Association freed\n", tgtport->fc_target_port.port_num, assoc->a_id); kfree(assoc); } @@ -1224,8 +1221,7 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc) flush_workqueue(assoc->queues[i]->work_q); } - dev_info(tgtport->dev, - "{%d:%d} Association deleted\n", + pr_info("{%d:%d}: Association deleted\n", tgtport->fc_target_port.port_num, assoc->a_id); nvmet_fc_tgtport_put(tgtport); @@ -1716,9 +1712,9 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport, } if (ret) { - dev_err(tgtport->dev, - "Create Association LS failed: %s\n", - validation_errors[ret]); + pr_err("{%d}: Create Association LS failed: %s\n", + tgtport->fc_target_port.port_num, + validation_errors[ret]); iod->lsrsp->rsplen = nvme_fc_format_rjt(acc, sizeof(*acc), rqst->w0.ls_cmd, FCNVME_RJT_RC_LOGIC, @@ -1730,8 +1726,7 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport, atomic_set(&queue->connected, 1); queue->sqhd = 0; /* best place to init value */ - dev_info(tgtport->dev, - "{%d:%d} Association created\n", + pr_info("{%d:%d}: Association created\n", tgtport->fc_target_port.port_num, iod->assoc->a_id); /* format a response */ @@ -1809,9 +1804,9 @@ nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport, } if (ret) { - dev_err(tgtport->dev, - "Create Connection LS failed: %s\n", - validation_errors[ret]); + pr_err("{%d}: Create Connection LS failed: %s\n", + tgtport->fc_target_port.port_num, + validation_errors[ret]); iod->lsrsp->rsplen = nvme_fc_format_rjt(acc, sizeof(*acc), rqst->w0.ls_cmd, (ret == VERR_NO_ASSOC) ? @@ -1871,9 +1866,9 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport, } if (ret || !assoc) { - dev_err(tgtport->dev, - "Disconnect LS failed: %s\n", - validation_errors[ret]); + pr_err("{%d}: Disconnect LS failed: %s\n", + tgtport->fc_target_port.port_num, + validation_errors[ret]); iod->lsrsp->rsplen = nvme_fc_format_rjt(acc, sizeof(*acc), rqst->w0.ls_cmd, (ret == VERR_NO_ASSOC) ? @@ -1907,8 +1902,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport, spin_unlock_irqrestore(&tgtport->lock, flags); if (oldls) { - dev_info(tgtport->dev, - "{%d:%d} Multiple Disconnect Association LS's " + pr_info("{%d:%d}: Multiple Disconnect Association LS's " "received\n", tgtport->fc_target_port.port_num, assoc->a_id); /* overwrite good response with bogus failure */ @@ -2051,8 +2045,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port, struct fcnvme_ls_rqst_w0 *w0 = (struct fcnvme_ls_rqst_w0 *)lsreqbuf; if (lsreqbuf_len > sizeof(union nvmefc_ls_requests)) { - dev_info(tgtport->dev, - "RCV %s LS failed: payload too large (%d)\n", + pr_info("{%d}: RCV %s LS failed: payload too large (%d)\n", + tgtport->fc_target_port.port_num, (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ? nvmefc_ls_names[w0->ls_cmd] : "", lsreqbuf_len); @@ -2060,8 +2054,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port, } if (!nvmet_fc_tgtport_get(tgtport)) { - dev_info(tgtport->dev, - "RCV %s LS failed: target deleting\n", + pr_info("{%d}: RCV %s LS failed: target deleting\n", + tgtport->fc_target_port.port_num, (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ? nvmefc_ls_names[w0->ls_cmd] : ""); return -ESHUTDOWN; @@ -2069,8 +2063,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port, iod = nvmet_fc_alloc_ls_iod(tgtport); if (!iod) { - dev_info(tgtport->dev, - "RCV %s LS failed: context allocation failed\n", + pr_info("{%d}: RCV %s LS failed: context allocation failed\n", + tgtport->fc_target_port.port_num, (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ? nvmefc_ls_names[w0->ls_cmd] : ""); nvmet_fc_tgtport_put(tgtport); -- 2.51.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner @ 2025-10-28 15:47 ` Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:54 ` Hannes Reinecke 2 siblings, 0 replies; 23+ messages in thread From: Daniel Wagner @ 2025-10-28 15:47 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel On Tue, Oct 28, 2025 at 04:26:24PM +0100, Daniel Wagner wrote: > Many of the nvmet-fc log messages cannot print the device used, because > it's not there yet: > > (NULL device *): {0:0} Association deleted > > Use the pr_* macros consistently throughout the module and match the > output of the nvme-fc module. > > Using port:association ids are more useful when debugging what's going > on, because these match now with the log entries from nvme-fc. Signed-off-by: Daniel Wagner <wagi@kernel.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner 2025-10-28 15:47 ` Daniel Wagner @ 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:54 ` Hannes Reinecke 2 siblings, 0 replies; 23+ messages in thread From: Christoph Hellwig @ 2025-10-29 8:52 UTC (permalink / raw) To: Daniel Wagner Cc: Justin Tee, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, linux-kernel Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner 2025-10-28 15:47 ` Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig @ 2025-11-04 10:54 ` Hannes Reinecke 2 siblings, 0 replies; 23+ messages in thread From: Hannes Reinecke @ 2025-11-04 10:54 UTC (permalink / raw) To: Daniel Wagner, Justin Tee, Christoph Hellwig, Keith Busch Cc: James Smart, Jens Axboe, linux-nvme, linux-kernel On 10/28/25 16:26, Daniel Wagner wrote: > Many of the nvmet-fc log messages cannot print the device used, because > it's not there yet: > > (NULL device *): {0:0} Association deleted > > Use the pr_* macros consistently throughout the module and match the > output of the nvme-fc module. > > Using port:association ids are more useful when debugging what's going > on, because these match now with the log entries from nvme-fc. > --- > drivers/nvme/target/fc.c | 48 +++++++++++++++++++++--------------------------- > 1 file changed, 21 insertions(+), 27 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.de> 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 ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl @ 2025-10-29 0:33 Justin Tee 2025-10-29 10:05 ` Daniel Wagner 2025-10-30 9:49 ` Daniel Wagner 0 siblings, 2 replies; 23+ messages in thread From: Justin Tee @ 2025-10-29 0:33 UTC (permalink / raw) To: Daniel Wagner Cc: Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, LKML, Justin Tee Hi Daniel, > nvme_fc_ctrl_put can acquire the rport lock when freeing the > ctrl object: > > nvme_fc_ctrl_put > nvme_fc_ctrl_free > spin_lock_irqsave(rport->lock) > > Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. While I agree that we can’t hold the rport lock when calling nvme_fc_ctrl_put, nvme_fc_ctrl_free also does a nvme_fc_rport_put, which could also trigger nvme_fc_free_rport, making rport invalid. Should we also add kref get on the rport before entering the list_for_each_entry loop? Also, because nvme_fc_ctrl_free removes itself from the rport->ctrl_list, should we also start using list_for_each_entry_safe? So, something like this? diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 03987f497a5b..fcd30801921b 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -1468,14 +1468,16 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, { struct fcnvme_ls_disconnect_assoc_rqst *rqst = &lsop->rqstbuf->rq_dis_assoc; - struct nvme_fc_ctrl *ctrl, *ret = NULL; + struct nvme_fc_ctrl *ctrl, *tmp, *ret = NULL; struct nvmefc_ls_rcv_op *oldls = NULL; u64 association_id = be64_to_cpu(rqst->associd.association_id); unsigned long flags; + nvme_fc_rport_get(rport); + spin_lock_irqsave(&rport->lock, flags); - list_for_each_entry(ctrl, &rport->ctrl_list, ctrl_list) { + list_for_each_entry_safe(ctrl, tmp, &rport->ctrl_list, ctrl_list) { if (!nvme_fc_ctrl_get(ctrl)) continue; spin_lock(&ctrl->lock); @@ -1488,11 +1490,15 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, if (ret) /* leave the ctrl get reference */ break; + spin_unlock_irqrestore(&rport->lock, flags); nvme_fc_ctrl_put(ctrl); + spin_lock_irqsave(&rport->lock, flags); } spin_unlock_irqrestore(&rport->lock, flags); + nvme_fc_rport_put(rport); + /* transmit a response for anything that was pending */ if (oldls) { dev_info(rport->lport->dev, Regards, Justin ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-29 0:33 [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Justin Tee @ 2025-10-29 10:05 ` Daniel Wagner 2025-10-29 16:36 ` Justin Tee 2025-10-30 9:49 ` Daniel Wagner 1 sibling, 1 reply; 23+ messages in thread From: Daniel Wagner @ 2025-10-29 10:05 UTC (permalink / raw) To: Justin Tee Cc: Daniel Wagner, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, LKML, Justin Tee Hi Justin, On Tue, Oct 28, 2025 at 05:33:17PM -0700, Justin Tee wrote: > > nvme_fc_ctrl_put can acquire the rport lock when freeing the > > ctrl object: > > > > nvme_fc_ctrl_put > > nvme_fc_ctrl_free > > spin_lock_irqsave(rport->lock) > > > > Thus we can't hold the rport lock when calling nvme_fc_ctrl_put. > > While I agree that we can’t hold the rport lock when calling > nvme_fc_ctrl_put, nvme_fc_ctrl_free also does a nvme_fc_rport_put, > which could also trigger nvme_fc_free_rport, making rport invalid. > Should we also add kref get on the rport before entering the > list_for_each_entry loop? > > Also, because nvme_fc_ctrl_free removes itself from the > rport->ctrl_list, should we also start using list_for_each_entry_safe? > > So, something like this? Yes, this makes sense. Just wondering why I didn't see any KASAN reports. Should I add your change to my patch (obviously mentioning it), or do you want to send a patch yourself? In the meantime, I am giving this patch a spin in my test setup. Thanks, Daniel ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-29 10:05 ` Daniel Wagner @ 2025-10-29 16:36 ` Justin Tee 0 siblings, 0 replies; 23+ messages in thread From: Justin Tee @ 2025-10-29 16:36 UTC (permalink / raw) To: Daniel Wagner Cc: Daniel Wagner, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, LKML, Justin Tee Hi Daniel, > Should I add your change to my patch (obviously mentioning it) Sure, this sounds fine to me. Thanks, Justin ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-29 0:33 [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Justin Tee 2025-10-29 10:05 ` Daniel Wagner @ 2025-10-30 9:49 ` Daniel Wagner 2025-10-30 22:02 ` Justin Tee 1 sibling, 1 reply; 23+ messages in thread From: Daniel Wagner @ 2025-10-30 9:49 UTC (permalink / raw) To: Justin Tee Cc: Daniel Wagner, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, LKML, Justin Tee On Tue, Oct 28, 2025 at 05:33:17PM -0700, Justin Tee wrote: > So, something like this? > > diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c > index 03987f497a5b..fcd30801921b 100644 > --- a/drivers/nvme/host/fc.c > +++ b/drivers/nvme/host/fc.c > @@ -1468,14 +1468,16 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, > { > struct fcnvme_ls_disconnect_assoc_rqst *rqst = > &lsop->rqstbuf->rq_dis_assoc; > - struct nvme_fc_ctrl *ctrl, *ret = NULL; > + struct nvme_fc_ctrl *ctrl, *tmp, *ret = NULL; > struct nvmefc_ls_rcv_op *oldls = NULL; > u64 association_id = be64_to_cpu(rqst->associd.association_id); > unsigned long flags; > > + nvme_fc_rport_get(rport); > + > spin_lock_irqsave(&rport->lock, flags); > > - list_for_each_entry(ctrl, &rport->ctrl_list, ctrl_list) { > + list_for_each_entry_safe(ctrl, tmp, &rport->ctrl_list, ctrl_list) { > if (!nvme_fc_ctrl_get(ctrl)) > continue; > spin_lock(&ctrl->lock); > @@ -1488,11 +1490,15 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport, > if (ret) > /* leave the ctrl get reference */ > break; > + spin_unlock_irqrestore(&rport->lock, flags); > nvme_fc_ctrl_put(ctrl); > + spin_lock_irqsave(&rport->lock, flags); > } > > spin_unlock_irqrestore(&rport->lock, flags); > > + nvme_fc_rport_put(rport); > + > /* transmit a response for anything that was pending */ > if (oldls) { > dev_info(rport->lport->dev, I've dropped the nvme_fc_rport_get because it's not necessary, a ref is taken in nvme_fc_rcv_ls_req, so the port is not going away until the disconnect LS is processed. All tests seems to work fine except one, nvme/58 (test rapid namespace remapping). But this one also fails for the other trasnport, e.g TCP: block nvme1n1: no available path - failing I/O Oops: general protection fault, probably for non-canonical address 0xdffffc00000I KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 5 UID: 0 PID: 707 Comm: kworker/5:2H Tainted: G D W 6.17.0-ra Tainted: [D]=DIE, [W]=WARN Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.17.0-6.fc43 04/01/2014 Workqueue: kblockd nvme_requeue_work [nvme_core] RIP: 0010:__rq_qos_done_bio+0x24/0xa0 Code: 90 90 90 90 90 90 0f 1f 44 00 00 41 54 55 53 49 89 f4 48 83 ec 08 48 89 fbc RSP: 0018:ffff888116e07980 EFLAGS: 00010256 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: 1ffff11022f2a6eb RSI: ffff88810d2a6140 RDI: 0000000000000000 nvme nvme4: IDs don't match for shared namespace 3 RBP: dffffc0000000000 R08: 0000000000000001 R09: ffffffff9f4df3cf R10: ffff888116e0760f R11: ffffffffa6b771d0 R12: ffff88810d2a6140 R13: ffff88810d2a6148 R14: ffff88810d2a6140 R15: ffff888106d66808 FS: 0000000000000000(0000) GS:ffff8881b2408000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 nvme nvme3: rescanning namespaces. CR2: 000055f4b1f6d080 CR3: 000000011c082000 CR4: 0000000000750ef0 PKRU: 55555554 Call Trace: <TASK> bio_endio+0x1c9/0x610 nvme_ns_head_submit_bio+0x79e/0xa20 [nvme_core 8550ebbc328e8e8a801d6cacfcd551a5] ? lock_release+0x244/0x450 __submit_bio+0x31a/0x6c0 ? __pfx___submit_bio+0x10/0x10 ? lock_acquire+0x292/0x2e0 ? lock_release+0x244/0x450 ? __pfx_blk_cgroup_bio_start+0x10/0x10 ? lock_acquire+0x292/0x2e0 ? submit_bio_noacct_nocheck+0x577/0xaa0 submit_bio_noacct_nocheck+0x577/0xaa0 ? trace_irq_enable.constprop.0+0xc0/0x100 ? trace_hardirqs_on+0x32/0x40 ? __pfx_submit_bio_noacct_nocheck+0x10/0x10 ? submit_bio_noacct+0x97d/0x1ce0 nvme_requeue_work+0xa2/0xd0 [nvme_core 8550ebbc328e8e8a801d6cacfcd551a5345e7fd9] process_one_work+0x7f3/0x1420 ? __pfx_process_one_work+0x10/0x10 ? local_clock+0x11/0x30 ? assign_work+0x156/0x390 worker_thread+0x5cf/0xfe0 ? _raw_spin_unlock_irqrestore+0x40/0x60 ? __pfx_worker_thread+0x10/0x10 ? __kthread_parkme+0xb3/0x1f0 ? __pfx_worker_thread+0x10/0x10 kthread+0x39d/0x740 ? __pfx_do_raw_spin_trylock+0x10/0x10 ? __pfx_kthread+0x10/0x10 ? kvm_sched_clock_read+0xd/0x20 ? local_clock_noinstr+0xb/0xf0 ? local_clock+0x11/0x30 ? lock_release+0x2e2/0x450 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x371/0x460 ? __pfx_kthread+0x10/0x10 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> Modules linked in: nvmet_tcp nvmet nvme_tcp nvme nvme_fabrics nvme_core nvme_autp ---[ end trace 0000000000000000 ]--- ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl 2025-10-30 9:49 ` Daniel Wagner @ 2025-10-30 22:02 ` Justin Tee 0 siblings, 0 replies; 23+ messages in thread From: Justin Tee @ 2025-10-30 22:02 UTC (permalink / raw) To: Daniel Wagner Cc: Daniel Wagner, Christoph Hellwig, Keith Busch, James Smart, Jens Axboe, linux-nvme, LKML, Justin Tee > I've dropped the nvme_fc_rport_get because it's not necessary, a ref is > taken in nvme_fc_rcv_ls_req, so the port is not going away until the > disconnect LS is processed. Yes, correct, and the put would be in nvme_fc_xmt_ls_rsp_done->nvme_fc_xmt_ls_rsp_free. Thank you for checking. > All tests seems to work fine except one, nvme/58 (test rapid namespace > remapping). But this one also fails for the other trasnport, e.g TCP: Okay, sure, we can try to address this in a different patch set. Regards, Justin ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2025-11-04 12:32 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-28 15:26 [PATCH 0/5] nvme-fc: misc small improvents Daniel Wagner 2025-10-28 15:26 ` [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 2025-11-04 12:32 ` Daniel Wagner 2025-10-28 15:26 ` [PATCH 2/5] nvme-fc: check all request and response have been processed Daniel Wagner 2025-10-29 8:51 ` Christoph Hellwig 2025-11-04 10:51 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 3/5] nvmet-fcloop: " Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 4/5] nvmet-fcloop: remove unused lsdir member Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:52 ` Hannes Reinecke 2025-10-28 15:26 ` [PATCH 5/5] nvmet-fc: use pr_* print macros instead of dev_* Daniel Wagner 2025-10-28 15:47 ` Daniel Wagner 2025-10-29 8:52 ` Christoph Hellwig 2025-11-04 10:54 ` Hannes Reinecke -- strict thread matches above, loose matches on Subject: below -- 2025-10-29 0:33 [PATCH 1/5] nvme-fc: don't hold rport lock when putting ctrl Justin Tee 2025-10-29 10:05 ` Daniel Wagner 2025-10-29 16:36 ` Justin Tee 2025-10-30 9:49 ` Daniel Wagner 2025-10-30 22:02 ` Justin Tee
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox