From owner-svn-src-all@freebsd.org Wed May 13 19:17:31 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 4F3832FD50A; Wed, 13 May 2020 19:17:31 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 49Mkvb1lxSz4R48; Wed, 13 May 2020 19:17:31 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 32EA726374; Wed, 13 May 2020 19:17:31 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 04DJHVbf043639; Wed, 13 May 2020 19:17:31 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 04DJHTok043628; Wed, 13 May 2020 19:17:29 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202005131917.04DJHTok043628@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 13 May 2020 19:17:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r361015 - in head/sys/geom: . eli mountver nop part uzip X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys/geom: . eli mountver nop part uzip X-SVN-Commit-Revision: 361015 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 May 2020 19:17:31 -0000 Author: imp Date: Wed May 13 19:17:28 2020 New Revision: 361015 URL: https://svnweb.freebsd.org/changeset/base/361015 Log: Reimplement aliases in geom The alias needs to be part of the provider instead of the geom to work properly. To bind the DEV geom, we need to look at the provider's names and aliases and create the dev entries from there. If this lives in the GEOM, then it won't propigate down the tree properly. Remove it from geom, add it provider. Update geli, gmountver, gnop, gpart, and guzip to use it, which handles the bulk of the uses in FreeBSD. I think this is all the providers that create a new name based on their parent's name. Modified: head/sys/geom/eli/g_eli.c head/sys/geom/geom.h head/sys/geom/geom_dev.c head/sys/geom/geom_disk.c head/sys/geom/geom_dump.c head/sys/geom/geom_subr.c head/sys/geom/mountver/g_mountver.c head/sys/geom/nop/g_nop.c head/sys/geom/part/g_part.c head/sys/geom/uzip/g_uzip.c Modified: head/sys/geom/eli/g_eli.c ============================================================================== --- head/sys/geom/eli/g_eli.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/eli/g_eli.c Wed May 13 19:17:28 2020 (r361015) @@ -843,6 +843,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, 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 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, 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); Modified: head/sys/geom/geom.h ============================================================================== --- head/sys/geom/geom.h Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/geom.h Wed May 13 19:17:28 2020 (r361015) @@ -122,15 +122,6 @@ struct g_class { 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 @@ struct g_geom { #define G_GEOM_VOLATILE_BIO 0x02 #define G_GEOM_IN_ACCESS 0x04 #define G_GEOM_ACCESS_WAIT 0x08 - LIST_HEAD(,g_geom_alias) aliases; }; /* @@ -203,6 +193,15 @@ struct g_consumer { }; /* + * 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". */ struct g_provider { @@ -226,6 +225,7 @@ struct g_provider { #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_destroy_provider(struct g_provider *pp); 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, @@ -293,6 +292,8 @@ struct g_consumer * g_new_consumer(struct g_geom *gp); struct g_geom * g_new_geomf(struct g_class *mp, const char *fmt, ...) __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); Modified: head/sys/geom/geom_dev.c ============================================================================== --- head/sys/geom/geom_dev.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/geom_dev.c Wed May 13 19:17:28 2020 (r361015) @@ -383,7 +383,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, /* * 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) { Modified: head/sys/geom/geom_disk.c ============================================================================== --- head/sys/geom/geom_disk.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/geom_disk.c Wed May 13 19:17:28 2020 (r361015) @@ -718,11 +718,9 @@ g_disk_create(void *arg, int flag) 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; Modified: head/sys/geom/geom_dump.c ============================================================================== --- head/sys/geom/geom_dump.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/geom_dump.c Wed May 13 19:17:28 2020 (r361015) @@ -211,6 +211,7 @@ g_conf_consumer(struct sbuf *sb, struct g_consumer *cp 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 @@ g_conf_provider(struct sbuf *sb, struct g_provider *pp 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 @@ g_conf_geom(struct sbuf *sb, struct g_geom *gp, struct { struct g_consumer *cp2; struct g_provider *pp2; - struct g_geom_alias *gap; sbuf_printf(sb, " \n", gp); sbuf_printf(sb, " \n", gp->class); @@ -267,11 +272,6 @@ g_conf_geom(struct sbuf *sb, struct g_geom *gp, struct if (pp != NULL && pp != pp2) 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"); } Modified: head/sys/geom/geom_subr.c ============================================================================== --- head/sys/geom/geom_subr.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/geom_subr.c Wed May 13 19:17:28 2020 (r361015) @@ -391,7 +391,6 @@ g_new_geomf(struct g_class *mp, const char *fmt, ...) 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 @@ g_new_geomf(struct g_class *mp, const char *fmt, ...) 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_destroy_geom(struct g_geom *gp) 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 @@ g_new_providerf(struct g_geom *gp, const char *fmt, .. 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, @@ -641,6 +638,28 @@ g_new_providerf(struct g_geom *gp, const char *fmt, .. } void +g_provider_add_alias(struct g_provider *pp, const char *fmt, ...) +{ + struct sbuf *sb; + struct g_geom_alias *gap; + va_list ap; + + /* + * Generate the alias string and save it in the list. + */ + sb = sbuf_new_auto(); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + gap = g_malloc(sizeof(*gap) + sbuf_len(sb) + 1, M_WAITOK | M_ZERO); + memcpy((char *)(gap + 1), sbuf_data(sb), sbuf_len(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 +787,7 @@ void 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 +806,8 @@ g_destroy_provider(struct g_provider *pp) */ 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(); @@ -1314,18 +1335,6 @@ g_compare_names(const char *namea, const char *nameb) if (strcmp(namea + deva, nameb + devb) == 0) return (1); 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) Modified: head/sys/geom/mountver/g_mountver.c ============================================================================== --- head/sys/geom/mountver/g_mountver.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/mountver/g_mountver.c Wed May 13 19:17:28 2020 (r361015) @@ -276,6 +276,7 @@ g_mountver_create(struct gctl_req *req, struct g_class 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 @@ g_mountver_create(struct gctl_req *req, struct g_class 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); Modified: head/sys/geom/nop/g_nop.c ============================================================================== --- head/sys/geom/nop/g_nop.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/nop/g_nop.c Wed May 13 19:17:28 2020 (r361015) @@ -346,6 +346,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, 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 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, 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; Modified: head/sys/geom/part/g_part.c ============================================================================== --- head/sys/geom/part/g_part.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/part/g_part.c Wed May 13 19:17:28 2020 (r361015) @@ -481,24 +481,25 @@ g_part_new_provider(struct g_geom *gp, struct g_part_t 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); /* - * 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). + * If our parent provider had any aliases, then copy them to our + * provider so when geom DEV tastes things later, they will be + * there for it to create the aliases with those name used in + * place of the geom's name we use to create the provider. The + * kobj interface that generates names makes this awkward. */ - 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. */ } @@ -1968,7 +1969,6 @@ g_part_taste(struct g_class *mp, struct g_provider *pp 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 +1985,6 @@ g_part_taste(struct g_class *mp, struct g_provider *pp * 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); Modified: head/sys/geom/uzip/g_uzip.c ============================================================================== --- head/sys/geom/uzip/g_uzip.c Wed May 13 18:36:02 2020 (r361014) +++ head/sys/geom/uzip/g_uzip.c Wed May 13 19:17:28 2020 (r361015) @@ -677,6 +677,7 @@ g_uzip_taste(struct g_class *mp, struct g_provider *pp 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 @@ g_uzip_taste(struct g_class *mp, struct g_provider *pp 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);