Index: sys/dev/nvdimm/nvdimm_spa.c =================================================================== --- sys/dev/nvdimm/nvdimm_spa.c +++ sys/dev/nvdimm/nvdimm_spa.c @@ -64,19 +64,6 @@ #include #include -struct SPA_mapping *spa_mappings; -int spa_mappings_cnt; - -static int -nvdimm_spa_count(void *nfitsubtbl __unused, void *arg) -{ - int *cnt; - - cnt = arg; - (*cnt)++; - return (0); -} - static struct nvdimm_SPA_uuid_list_elm { const char *u_name; const char *u_id_str; @@ -386,7 +373,7 @@ } static g_init_t nvdimm_spa_g_init; -static g_fini_t nvdimm_spa_g_fini; +static g_ctl_destroy_geom_t nvdimm_spa_g_destroy_geom; struct g_class nvdimm_spa_g_class = { .name = "SPA", @@ -394,7 +381,7 @@ .start = nvdimm_spa_g_start, .access = nvdimm_spa_g_access, .init = nvdimm_spa_g_init, - .fini = nvdimm_spa_g_fini, + .destroy_geom = nvdimm_spa_g_destroy_geom, }; DECLARE_GEOM_CLASS(nvdimm_spa_g_class, g_spa); @@ -507,9 +494,7 @@ msleep(&spa->spa_g_queue, &spa->spa_g_mtx, PRIBIO, "spa_e", 0); mtx_unlock(&spa->spa_g_mtx); if (spa->spa_g != NULL) { - g_topology_lock(); g_wither_geom(spa->spa_g, ENXIO); - g_topology_unlock(); spa->spa_g = NULL; spa->spa_p = NULL; } @@ -535,20 +520,22 @@ { ACPI_NFIT_SYSTEM_ADDRESS *nfitaddr; struct SPA_mapping *spa; - int error, *i, j; + int error, j; - i = arg; - spa = &spa_mappings[*i]; nfitaddr = nfitsubtbl; for (j = 0; j < nitems(nvdimm_SPA_uuid_list); j++) { - /* XXXKIB: is ACPI UUID representation compatible ? */ if (uuidcmp((struct uuid *)&nfitaddr->RangeGuid, &nvdimm_SPA_uuid_list[j].u_id) != 0) continue; + spa = malloc(sizeof(struct SPA_mapping), M_NVDIMM, M_WAITOK | M_ZERO); error = nvdimm_spa_init_one(spa, nfitaddr, j); - if (error != 0) + if (error != 0) { + g_topology_lock(); nvdimm_spa_fini_one(spa); + g_topology_unlock(); + free(spa, M_NVDIMM); + } break; } if (j == nitems(nvdimm_SPA_uuid_list) && bootverbose) { @@ -556,7 +543,6 @@ printf_uuid((struct uuid *)&nfitaddr->RangeGuid); printf("\n"); } - (*i)++; return (0); } @@ -579,20 +565,8 @@ } error = nvdimm_iterate_nfit(nfitbl, ACPI_NFIT_TYPE_SYSTEM_ADDRESS, - nvdimm_spa_count, &spa_mappings_cnt); - if (error != 0) - return (error); - spa_mappings = malloc(sizeof(struct SPA_mapping) * spa_mappings_cnt, - M_NVDIMM, M_WAITOK | M_ZERO); - i = 0; - error = nvdimm_iterate_nfit(nfitbl, ACPI_NFIT_TYPE_SYSTEM_ADDRESS, - nvdimm_spa_parse, &i); - if (error != 0) { - free(spa_mappings, M_NVDIMM); - spa_mappings = NULL; - return (error); - } - return (0); + nvdimm_spa_parse, NULL); + return (error); } static void @@ -602,8 +576,6 @@ ACPI_STATUS status; int error; - spa_mappings_cnt = 0; - spa_mappings = NULL; if (acpi_disabled("nvdimm")) return; status = AcpiGetTable(ACPI_SIG_NFIT, 1, (ACPI_TABLE_HEADER **)&nfitbl); @@ -618,16 +590,14 @@ AcpiPutTable(&nfitbl->Header); } -static void -nvdimm_spa_g_fini(struct g_class *mp __unused) +static int +nvdimm_spa_g_destroy_geom(struct gctl_req *req, struct g_class *cp, + struct g_geom *gp) { - int i; + struct SPA_mapping *spa; - if (spa_mappings == NULL) - return; - for (i = 0; i < spa_mappings_cnt; i++) - nvdimm_spa_fini_one(&spa_mappings[i]); - free(spa_mappings, M_NVDIMM); - spa_mappings = NULL; - spa_mappings_cnt = 0; + spa = gp->softc; + nvdimm_spa_fini_one(spa); + free(spa, M_NVDIMM); + return (0); }