Index: sys/geom/label/g_label.h =================================================================== --- sys/geom/label/g_label.h +++ sys/geom/label/g_label.h @@ -73,6 +73,7 @@ g_label_taste_t *ld_taste; char *ld_dir; int ld_enabled; + bool ld_persistent; }; /* Supported labels. */ Index: sys/geom/label/g_label.c =================================================================== --- sys/geom/label/g_label.c +++ sys/geom/label/g_label.c @@ -192,7 +192,7 @@ static struct g_geom * g_label_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, - const char *label, const char *dir, off_t mediasize) + const char *label, const char *dir, off_t mediasize, bool persistent) { struct g_geom *gp; struct g_provider *pp2; @@ -235,8 +235,18 @@ gctl_error(req, "Cannot create slice %s.", label); return (NULL); } + + /* + * If 'persistent' is true that means that the label can not be changed + * by any access via the labelled provider itself and, thus, + * we don't have to spoil the label when the provider is opened for + * writing. + */ + if (persistent) + gp->spoiled = NULL; + else + gp->spoiled = g_label_spoiled; gp->orphan = g_label_orphan; - gp->spoiled = g_label_spoiled; gp->resize = g_label_resize; g_access(cp, -1, 0, 0); g_slice_config(gp, 0, G_SLICE_CONFIG_SET, (off_t)0, mediasize, @@ -367,7 +377,7 @@ break; g_label_create(NULL, mp, pp, md.md_label, G_LABEL_DIR, - pp->mediasize - pp->sectorsize); + pp->mediasize - pp->sectorsize, false); } while (0); for (i = 0; g_labels[i] != NULL; i++) { char label[128]; @@ -381,7 +391,7 @@ if (label[0] == '\0') continue; g_label_create(NULL, mp, pp, label, g_labels[i]->ld_dir, - pp->mediasize); + pp->mediasize, g_labels[i]->ld_persistent); } g_access(cp, -1, 0, 0); end: @@ -433,7 +443,7 @@ gctl_error(req, "No 'arg%d' argument", 0); return; } - g_label_create(req, mp, pp, name, G_LABEL_DIR, pp->mediasize); + g_label_create(req, mp, pp, name, G_LABEL_DIR, pp->mediasize, true); } static const char * Index: sys/geom/label/g_label_disk_ident.c =================================================================== --- sys/geom/label/g_label_disk_ident.c +++ sys/geom/label/g_label_disk_ident.c @@ -81,7 +81,8 @@ struct g_label_desc g_label_disk_ident = { .ld_taste = g_label_disk_ident_taste, .ld_dir = G_LABEL_DISK_IDENT_DIR, - .ld_enabled = 1 + .ld_enabled = 1, + .ld_persistent = true }; G_LABEL_INIT(disk_ident, g_label_disk_ident, "Create device nodes for drives " Index: sys/geom/label/g_label_gpt.c =================================================================== --- sys/geom/label/g_label_gpt.c +++ sys/geom/label/g_label_gpt.c @@ -157,13 +157,15 @@ struct g_label_desc g_label_gpt = { .ld_taste = g_label_gpt_taste, .ld_dir = G_LABEL_GPT_VOLUME_DIR, - .ld_enabled = 1 + .ld_enabled = 1, + .ld_persistent = true }; struct g_label_desc g_label_gpt_uuid = { .ld_taste = g_label_gpt_uuid_taste, .ld_dir = G_LABEL_GPT_ID_DIR, - .ld_enabled = 1 + .ld_enabled = 1, + .ld_persistent = true }; G_LABEL_INIT(gpt, g_label_gpt, "Create device nodes for GPT labels");