git: 8a082ca89fc0 - main - nvmf: Factor out most of nvmf_rescan_ns into a helper routine

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Wed, 05 Jun 2024 20:04:00 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=8a082ca89fc007850b302f4eead2f9b6eb2ccbe0

commit 8a082ca89fc007850b302f4eead2f9b6eb2ccbe0
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2024-06-05 19:52:24 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2024-06-05 19:52:24 +0000

    nvmf: Factor out most of nvmf_rescan_ns into a helper routine
    
    This function accepts a namespace ID and associated namespace data
    from IDENTIFY and takes care of updating nvmeXnY and ndaZ.
    
    Reviewed by:    imp
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D45459
---
 sys/dev/nvmf/host/nvmf.c | 52 ++++++++++++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 22 deletions(-)

diff --git a/sys/dev/nvmf/host/nvmf.c b/sys/dev/nvmf/host/nvmf.c
index df07d70b6c86..086df5f637c9 100644
--- a/sys/dev/nvmf/host/nvmf.c
+++ b/sys/dev/nvmf/host/nvmf.c
@@ -733,12 +733,40 @@ nvmf_detach(device_t dev)
 	return (0);
 }
 
+static void
+nvmf_rescan_ns_1(struct nvmf_softc *sc, uint32_t nsid,
+    const struct nvme_namespace_data *data)
+{
+	struct nvmf_namespace *ns;
+
+	/* XXX: Needs locking around sc->ns[]. */
+	ns = sc->ns[nsid - 1];
+	if (data->nsze == 0) {
+		/* XXX: Needs locking */
+		if (ns != NULL) {
+			nvmf_destroy_ns(ns);
+			sc->ns[nsid - 1] = NULL;
+		}
+	} else {
+		/* XXX: Needs locking */
+		if (ns == NULL) {
+			sc->ns[nsid - 1] = nvmf_init_ns(sc, nsid, data);
+		} else {
+			if (!nvmf_update_ns(ns, data)) {
+				nvmf_destroy_ns(ns);
+				sc->ns[nsid - 1] = NULL;
+			}
+		}
+	}
+
+	nvmf_sim_rescan_ns(sc, nsid);
+}
+
 void
 nvmf_rescan_ns(struct nvmf_softc *sc, uint32_t nsid)
 {
 	struct nvmf_completion_status status;
 	struct nvme_namespace_data *data;
-	struct nvmf_namespace *ns;
 
 	data = malloc(sizeof(*data), M_NVMF, M_WAITOK);
 
@@ -771,29 +799,9 @@ nvmf_rescan_ns(struct nvmf_softc *sc, uint32_t nsid)
 
 	nvme_namespace_data_swapbytes(data);
 
-	/* XXX: Needs locking around sc->ns[]. */
-	ns = sc->ns[nsid - 1];
-	if (data->nsze == 0) {
-		/* XXX: Needs locking */
-		if (ns != NULL) {
-			nvmf_destroy_ns(ns);
-			sc->ns[nsid - 1] = NULL;
-		}
-	} else {
-		/* XXX: Needs locking */
-		if (ns == NULL) {
-			sc->ns[nsid - 1] = nvmf_init_ns(sc, nsid, data);
-		} else {
-			if (!nvmf_update_ns(ns, data)) {
-				nvmf_destroy_ns(ns);
-				sc->ns[nsid - 1] = NULL;
-			}
-		}
-	}
+	nvmf_rescan_ns_1(sc, nsid, data);
 
 	free(data, M_NVMF);
-
-	nvmf_sim_rescan_ns(sc, nsid);
 }
 
 int