diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2024-06-05 19:52:24 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2024-06-05 19:52:24 +0000 |
| commit | 8a082ca89fc007850b302f4eead2f9b6eb2ccbe0 (patch) | |
| tree | 5d46e625e70dde4aa6d46684029ef83bfba12575 /sys/dev | |
| parent | 02ddb305cc6d7fc3964e33985ae89501b99bb05b (diff) | |
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/nvmf/host/nvmf.c | 52 |
1 files 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 |
