Index: share/man/man9/disk.9 =================================================================== --- share/man/man9/disk.9 +++ share/man/man9/disk.9 @@ -40,6 +40,8 @@ .Ft void .Fn disk_create "struct disk *disk" "int version" .Ft void +.Fn disk_free "struct disk *disk" +.Ft void .Fn disk_gone "struct disk *disk" .Ft void .Fn disk_destroy "struct disk *disk" @@ -71,6 +73,11 @@ fill in the fields and call .Fn disk_create when the device is ready to service requests. +.Fn disk_free +frees uninitialized disks from +.Fn disk_alloc +that will not proceed to +.Fn disk_create . .Fn disk_add_alias adds an alias for the disk and must be called before .Fn disk_create , Index: sys/geom/geom_disk.h =================================================================== --- sys/geom/geom_disk.h +++ sys/geom/geom_disk.h @@ -139,6 +139,7 @@ struct disk *disk_alloc(void); void disk_create(struct disk *disk, int version); void disk_destroy(struct disk *disk); +void disk_free(struct disk *disk); void disk_gone(struct disk *disk); void disk_attr_changed(struct disk *dp, const char *attr, int flag); void disk_media_changed(struct disk *dp, int flag); Index: sys/geom/geom_disk.c =================================================================== --- sys/geom/geom_disk.c +++ sys/geom/geom_disk.c @@ -798,6 +798,21 @@ g_free(sc); } +/* + * Free up a disk that's been allocated, but that will not go through + * disk_create, or has been completely torn down by g_disk_destroy. + */ +void +disk_free(struct disk *dp) +{ + KASSERT(dp->d_geom == NULL, + ("disk_free: d_geom initialized, use disk_destroy")); + KASSERT(LIST_FIRST(&dp->d_aliases) == NULL, + ("disk_free: alias list initialized, use disk_destroy")); + + g_free(dp); +} + static void g_disk_destroy(void *ptr, int flag) { @@ -819,7 +834,7 @@ LIST_FOREACH_SAFE(dap, &dp->d_aliases, da_next, daptmp) g_free(dap); - g_free(dp); + disk_free(dp); } /*