Index: sys/cam/nvme/nvme_da.c =================================================================== --- sys/cam/nvme/nvme_da.c +++ sys/cam/nvme/nvme_da.c @@ -950,7 +950,7 @@ /* * Add alias for older nvd drives to ease transition. */ - /* disk_add_alias(disk, "nvd"); Have reports of this causing problems */ + disk_add_alias(disk, "nvd"); /* * Acquire a reference to the periph before we register with GEOM. Index: sys/geom/eli/g_eli.c =================================================================== --- sys/geom/eli/g_eli.c +++ sys/geom/eli/g_eli.c @@ -843,6 +843,7 @@ struct g_geom *gp; struct g_provider *pp; struct g_consumer *cp; + struct g_geom_alias *gap; u_int i, threads; int dcw, error; @@ -971,6 +972,8 @@ pp = g_new_providerf(gp, "%s%s", bpp->name, G_ELI_SUFFIX); pp->mediasize = sc->sc_mediasize; pp->sectorsize = sc->sc_sectorsize; + LIST_FOREACH(gap, &bpp->aliases, ga_next) + g_provider_add_alias(pp, "%s%s", gap->ga_alias, G_ELI_SUFFIX); g_error_provider(pp, 0); Index: sys/geom/geom.h =================================================================== --- sys/geom/geom.h +++ sys/geom/geom.h @@ -122,15 +122,6 @@ LIST_HEAD(,g_geom) geom; }; -/* - * The g_geom_alias is a list node for aliases for the geom name - * for device node creation. - */ -struct g_geom_alias { - LIST_ENTRY(g_geom_alias) ga_next; - const char *ga_alias; -}; - #define G_VERSION_00 0x19950323 #define G_VERSION_01 0x20041207 /* add fflag to g_ioctl_t */ #define G_VERSION G_VERSION_01 @@ -163,7 +154,6 @@ #define G_GEOM_VOLATILE_BIO 0x02 #define G_GEOM_IN_ACCESS 0x04 #define G_GEOM_ACCESS_WAIT 0x08 - LIST_HEAD(,g_geom_alias) aliases; }; /* @@ -202,6 +192,15 @@ u_int index; }; +/* + * The g_geom_alias is a list node for aliases for the provider name for device + * node creation. + */ +struct g_geom_alias { + LIST_ENTRY(g_geom_alias) ga_next; + const char *ga_alias; +}; + /* * A g_provider is a "logical disk". */ @@ -226,6 +225,7 @@ #define G_PF_ACCEPT_UNMAPPED 0x8 #define G_PF_DIRECT_SEND 0x10 #define G_PF_DIRECT_RECEIVE 0x20 + LIST_HEAD(,g_geom_alias) aliases; /* Two fields for the implementing class to use */ void *private; @@ -280,7 +280,6 @@ void g_detach(struct g_consumer *cp); void g_error_provider(struct g_provider *pp, int error); struct g_provider *g_provider_by_name(char const *arg); -void g_geom_add_alias(struct g_geom *gp, const char *alias); int g_getattr__(const char *attr, struct g_consumer *cp, void *var, int len); #define g_getattr(a, c, v) g_getattr__((a), (c), (v), sizeof *(v)) int g_handleattr(struct bio *bp, const char *attribute, const void *val, @@ -294,6 +293,8 @@ __printflike(2, 3); struct g_provider * g_new_providerf(struct g_geom *gp, const char *fmt, ...) __printflike(2, 3); +void g_provider_add_alias(struct g_provider *pp, const char *fmt, ...) + __printflike(2, 3); void g_resize_provider(struct g_provider *pp, off_t size); int g_retaste(struct g_class *mp); void g_spoil(struct g_provider *pp, struct g_consumer *cp); Index: sys/geom/geom_dev.c =================================================================== --- sys/geom/geom_dev.c +++ sys/geom/geom_dev.c @@ -383,7 +383,7 @@ /* * Now add all the aliases for this drive */ - LIST_FOREACH(gap, &pp->geom->aliases, ga_next) { + LIST_FOREACH(gap, &pp->aliases, ga_next) { error = make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &adev, dev, "%s", gap->ga_alias); if (error) { Index: sys/geom/geom_disk.c =================================================================== --- sys/geom/geom_disk.c +++ sys/geom/geom_disk.c @@ -718,11 +718,9 @@ sc->d_devstat = dp->d_devstat; gp = g_new_geomf(&g_disk_class, "%s%d", dp->d_name, dp->d_unit); gp->softc = sc; - LIST_FOREACH(dap, &dp->d_aliases, da_next) { - snprintf(tmpstr, sizeof(tmpstr), "%s%d", dap->da_alias, dp->d_unit); - g_geom_add_alias(gp, tmpstr); - } pp = g_new_providerf(gp, "%s", gp->name); + LIST_FOREACH(dap, &dp->d_aliases, da_next) + g_provider_add_alias(pp, "%s%d", dap->da_alias, dp->d_unit); devstat_remove_entry(pp->stat); pp->stat = NULL; dp->d_devstat->id = pp; Index: sys/geom/geom_dump.c =================================================================== --- sys/geom/geom_dump.c +++ sys/geom/geom_dump.c @@ -211,6 +211,7 @@ static void g_conf_provider(struct sbuf *sb, struct g_provider *pp) { + struct g_geom_alias *gap; sbuf_printf(sb, "\t\n", pp); sbuf_printf(sb, "\t \n", pp->geom); @@ -219,6 +220,11 @@ sbuf_cat(sb, "\t "); g_conf_cat_escaped(sb, pp->name); sbuf_cat(sb, "\n"); + LIST_FOREACH(gap, &pp->aliases, ga_next) { + sbuf_cat(sb, "\t "); + g_conf_cat_escaped(sb, gap->ga_alias); + sbuf_cat(sb, "\n"); + } sbuf_printf(sb, "\t %jd\n", (intmax_t)pp->mediasize); sbuf_printf(sb, "\t %u\n", pp->sectorsize); @@ -242,7 +248,6 @@ { struct g_consumer *cp2; struct g_provider *pp2; - struct g_geom_alias *gap; sbuf_printf(sb, " \n", gp); sbuf_printf(sb, " \n", gp->class); @@ -268,11 +273,6 @@ continue; g_conf_provider(sb, pp2); } - LIST_FOREACH(gap, &gp->aliases, ga_next) { - sbuf_cat(sb, " \n"); - g_conf_cat_escaped(sb, gap->ga_alias); - sbuf_cat(sb, " \n"); - } sbuf_cat(sb, " \n"); } Index: sys/geom/geom_subr.c =================================================================== --- sys/geom/geom_subr.c +++ sys/geom/geom_subr.c @@ -391,7 +391,6 @@ gp->rank = 1; LIST_INIT(&gp->consumer); LIST_INIT(&gp->provider); - LIST_INIT(&gp->aliases); LIST_INSERT_HEAD(&mp->geom, gp, geom); TAILQ_INSERT_HEAD(&geoms, gp, geoms); strcpy(gp->name, sbuf_data(sb)); @@ -412,7 +411,6 @@ void g_destroy_geom(struct g_geom *gp) { - struct g_geom_alias *gap, *gaptmp; g_topology_assert(); G_VALID_GEOM(gp); @@ -426,8 +424,6 @@ g_cancel_event(gp); LIST_REMOVE(gp, geom); TAILQ_REMOVE(&geoms, gp, geoms); - LIST_FOREACH_SAFE(gap, &gp->aliases, ga_next, gaptmp) - g_free(gap); g_free(gp->name); g_free(gp); } @@ -631,6 +627,7 @@ strcpy(pp->name, sbuf_data(sb)); sbuf_delete(sb); LIST_INIT(&pp->consumers); + LIST_INIT(&pp->aliases); pp->error = ENXIO; pp->geom = gp; pp->stat = devstat_new_entry(pp, -1, 0, DEVSTAT_ALL_SUPPORTED, @@ -640,6 +637,26 @@ return (pp); } +void +g_provider_add_alias(struct g_provider *pp, const char *fmt, ...) +{ + struct sbuf *sb; + struct g_geom_alias *gap; + va_list ap; + + sb = sbuf_new_auto(); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + gap = (struct g_geom_alias *)g_malloc( + sizeof(struct g_geom_alias) + sbuf_len(sb) + 1, M_WAITOK | M_ZERO); + strcpy((char *)(gap + 1), sbuf_data(sb)); + sbuf_delete(sb); + gap->ga_alias = (const char *)(gap + 1); + LIST_INSERT_HEAD(&pp->aliases, gap, ga_next); +} + void g_error_provider(struct g_provider *pp, int error) { @@ -768,6 +785,7 @@ g_destroy_provider(struct g_provider *pp) { struct g_geom *gp; + struct g_geom_alias *gap, *gaptmp; g_topology_assert(); G_VALID_PROVIDER(pp); @@ -786,7 +804,8 @@ */ if (gp->providergone != NULL) gp->providergone(pp); - + LIST_FOREACH_SAFE(gap, &pp->aliases, ga_next, gaptmp) + g_free(gap); g_free(pp); if ((gp->flags & G_GEOM_WITHER)) g_do_wither(); @@ -1316,18 +1335,6 @@ return (0); } -void -g_geom_add_alias(struct g_geom *gp, const char *alias) -{ - struct g_geom_alias *gap; - - gap = (struct g_geom_alias *)g_malloc( - sizeof(struct g_geom_alias) + strlen(alias) + 1, M_WAITOK); - strcpy((char *)(gap + 1), alias); - gap->ga_alias = (const char *)(gap + 1); - LIST_INSERT_HEAD(&gp->aliases, gap, ga_next); -} - #if defined(DIAGNOSTIC) || defined(DDB) /* * This function walks the mesh and returns a non-zero integer if it Index: sys/geom/mountver/g_mountver.c =================================================================== --- sys/geom/mountver/g_mountver.c +++ sys/geom/mountver/g_mountver.c @@ -276,6 +276,7 @@ struct g_geom *gp; struct g_provider *newpp; struct g_consumer *cp; + struct g_geom_alias *gap; char name[64]; int error; int identsize = DISK_IDENT_SIZE; @@ -309,6 +310,8 @@ newpp->mediasize = pp->mediasize; newpp->sectorsize = pp->sectorsize; newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; + LIST_FOREACH(gap, &pp->aliases, ga_next) + g_provider_add_alias(newpp, "%s%s", gap->ga_alias, G_MOUNTVER_SUFFIX); if ((pp->flags & G_PF_ACCEPT_UNMAPPED) != 0) { G_MOUNTVER_DEBUG(0, "Unmapped supported for %s.", gp->name); Index: sys/geom/nop/g_nop.c =================================================================== --- sys/geom/nop/g_nop.c +++ sys/geom/nop/g_nop.c @@ -346,6 +346,7 @@ struct g_geom *gp; struct g_provider *newpp; struct g_consumer *cp; + struct g_geom_alias *gap; char name[64]; int error, n; off_t explicitsize; @@ -458,6 +459,8 @@ newpp->sectorsize = secsize; newpp->stripesize = stripesize; newpp->stripeoffset = stripeoffset; + LIST_FOREACH(gap, &pp->aliases, ga_next) + g_provider_add_alias(newpp, "%s%s", gap->ga_alias, G_NOP_SUFFIX); cp = g_new_consumer(gp); cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; Index: sys/geom/part/g_part.c =================================================================== --- sys/geom/part/g_part.c +++ sys/geom/part/g_part.c @@ -481,26 +481,26 @@ entry->gpe_offset = offset; if (entry->gpe_pp == NULL) { + sb = sbuf_new_auto(); + G_PART_FULLNAME(table, entry, sb, gp->name); + sbuf_finish(sb); + entry->gpe_pp = g_new_providerf(gp, "%s", sbuf_data(sb)); + sbuf_delete(sb); + entry->gpe_pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; + entry->gpe_pp->private = entry; /* Close the circle. */ /* * Add aliases to the geom before we create the provider so that * geom_dev can taste it with all the aliases in place so all * the aliased dev_t instances get created for each partition * (eg foo5p7 gets created for bar5p7 when foo is an alias of bar). */ - LIST_FOREACH(gap, &table->gpt_gp->aliases, ga_next) { + LIST_FOREACH(gap, &pp->aliases, ga_next) { sb = sbuf_new_auto(); G_PART_FULLNAME(table, entry, sb, gap->ga_alias); sbuf_finish(sb); - g_geom_add_alias(gp, sbuf_data(sb)); + g_provider_add_alias(entry->gpe_pp, "%s", sbuf_data(sb)); sbuf_delete(sb); } - sb = sbuf_new_auto(); - G_PART_FULLNAME(table, entry, sb, gp->name); - sbuf_finish(sb); - entry->gpe_pp = g_new_providerf(gp, "%s", sbuf_data(sb)); - sbuf_delete(sb); - entry->gpe_pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; - entry->gpe_pp->private = entry; /* Close the circle. */ } entry->gpe_pp->index = entry->gpe_index - 1; /* index is 1-based. */ entry->gpe_pp->mediasize = (entry->gpe_end - entry->gpe_start + 1) * @@ -1968,7 +1968,6 @@ struct g_part_entry *entry; struct g_part_table *table; struct root_hold_token *rht; - struct g_geom_alias *gap; int attr, depth; int error; @@ -1985,8 +1984,6 @@ * to the provider. */ gp = g_new_geomf(mp, "%s", pp->name); - LIST_FOREACH(gap, &pp->geom->aliases, ga_next) - g_geom_add_alias(gp, gap->ga_alias); cp = g_new_consumer(gp); cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); Index: sys/geom/uzip/g_uzip.c =================================================================== --- sys/geom/uzip/g_uzip.c +++ sys/geom/uzip/g_uzip.c @@ -677,6 +677,7 @@ struct g_geom *gp; struct g_provider *pp2; struct g_uzip_softc *sc; + struct g_geom_alias *gap; enum { G_UZIP = 1, G_ULZMA, @@ -910,6 +911,8 @@ pp2->mediasize = (off_t)sc->nblocks * sc->blksz; pp2->stripesize = pp->stripesize; pp2->stripeoffset = pp->stripeoffset; + LIST_FOREACH(gap, &pp->aliases, ga_next) + g_provider_add_alias(pp2, GUZ_DEV_NAME("%s"), gap->ga_alias); g_error_provider(pp2, 0); g_access(cp, -1, 0, 0);