git: 130739e33acc - main - nvmf: factor out the pending request abort loop

From: Abdelkader Boudih <seuros_at_FreeBSD.org>
Date: Fri, 25 Sep 2026 21:43:18 UTC
The branch main has been updated by seuros:

URL: https://cgit.FreeBSD.org/src/commit/?id=130739e33acc1b55f6da297fdebb693d9d8feea8

commit 130739e33acc1b55f6da297fdebb693d9d8feea8
Author:     Abdelkader Boudih <seuros@FreeBSD.org>
AuthorDate: 2026-09-25 21:42:23 +0000
Commit:     Abdelkader Boudih <seuros@FreeBSD.org>
CommitDate: 2026-09-25 21:42:23 +0000

    nvmf: factor out the pending request abort loop
    
    The routine is entered with the namespace lock held and drops it before
    completing the requests, which preserves the existing locking.
    
    Reviewed by:    imp, adrian
    Differential Revision:  https://reviews.freebsd.org/D60019
---
 sys/dev/nvmf/host/nvmf_ns.c | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/sys/dev/nvmf/host/nvmf_ns.c b/sys/dev/nvmf/host/nvmf_ns.c
index 572649870e05..12db071b891b 100644
--- a/sys/dev/nvmf/host/nvmf_ns.c
+++ b/sys/dev/nvmf/host/nvmf_ns.c
@@ -433,14 +433,15 @@ nvmf_reconnect_ns(struct nvmf_namespace *ns)
 	}
 }
 
-void
-nvmf_shutdown_ns(struct nvmf_namespace *ns)
+/* Called with ns->lock held; drops it. */
+static void
+nvmf_ns_abort_pending_bios(struct nvmf_namespace *ns)
 {
 	TAILQ_HEAD(, bio) bios;
 	struct bio *bio;
 
-	mtx_lock(&ns->lock);
-	ns->shutdown = true;
+	mtx_assert(&ns->lock, MA_OWNED);
+
 	TAILQ_INIT(&bios);
 	TAILQ_CONCAT(&bios, &ns->pending_bios, bio_queue);
 	mtx_unlock(&ns->lock);
@@ -456,11 +457,16 @@ nvmf_shutdown_ns(struct nvmf_namespace *ns)
 }
 
 void
-nvmf_destroy_ns(struct nvmf_namespace *ns)
+nvmf_shutdown_ns(struct nvmf_namespace *ns)
 {
-	TAILQ_HEAD(, bio) bios;
-	struct bio *bio;
+	mtx_lock(&ns->lock);
+	ns->shutdown = true;
+	nvmf_ns_abort_pending_bios(ns);
+}
 
+void
+nvmf_destroy_ns(struct nvmf_namespace *ns)
+{
 	if (ns->cdev->si_drv2 != NULL)
 		destroy_dev(ns->cdev->si_drv2);
 	destroy_dev(ns->cdev);
@@ -477,18 +483,7 @@ nvmf_destroy_ns(struct nvmf_namespace *ns)
 	}
 
 	/* Abort any pending I/O requests. */
-	TAILQ_INIT(&bios);
-	TAILQ_CONCAT(&bios, &ns->pending_bios, bio_queue);
-	mtx_unlock(&ns->lock);
-
-	while (!TAILQ_EMPTY(&bios)) {
-		bio = TAILQ_FIRST(&bios);
-		TAILQ_REMOVE(&bios, bio, bio_queue);
-		bio->bio_error = ECONNABORTED;
-		bio->bio_flags |= BIO_ERROR;
-		bio->bio_resid = bio->bio_bcount;
-		biodone(bio);
-	}
+	nvmf_ns_abort_pending_bios(ns);
 
 	mtx_destroy(&ns->lock);
 	free(ns, M_NVMF);