Index: head/sys/geom/geom_dev.c =================================================================== --- head/sys/geom/geom_dev.c (revision 221202) +++ head/sys/geom/geom_dev.c (working copy) @@ -80,6 +80,11 @@ static struct g_class g_dev_class = { .orphan = g_dev_orphan, }; +struct new_alias_args { + struct g_provider *pp; + char name[SPECNAMELEN]; +}; + void g_dev_print(void) { @@ -107,7 +112,67 @@ g_dev_getprovider(struct cdev *dev) return (cp->provider); } +static void +g_dev_new_alias(void *arg, int flag) +{ + struct new_alias_args *args; + struct g_consumer *cp; + struct g_geom *gp; + struct cdev *dev, *adev; + int error; + g_topology_assert(); + args = (struct new_alias_args *)arg; + g_trace(G_T_TOPOLOGY, "g_dev_new_alias(%s, %s)", args->pp->name, + args->name); + + LIST_FOREACH(gp, &g_dev_class.geom, geom) { + cp = LIST_FIRST(&gp->consumer); + if (cp->provider == pp) + break; + } + if (gp == NULL) { + printf("%s: geom not found for provider %p\n", + __func__, pp); + goto done; + } + dev = gp->softc; + error = make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &adev, + dev, args->name); + if (error != 0) { + printf("%s: make_dev_alias_p failed (name=%s, error=%d)\n", + __func__, args->name, error); + goto done; + } + adev->si_iosize_max = MAXPHYS; + adev->si_drv1 = gp; + adev->si_drv2 = cp; + if (cp->provider->flags & G_PF_CANDELETE) + adev->si_flags |= SI_CANDELETE; +done: + g_free(args); +} + +void +g_dev_make_alias(struct g_provider *pp, const char *fmt, ...) +{ + struct new_alias_args *args; + struct sbuf *sb; + va_list ap; + + g_topology_assert(); + sb = sbuf_new_auto(); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + + args = g_malloc(sizeof(*args), M_WAITOK | M_ZERO); + strlcpy(args->name, sbuf_data(sb), SPECNAMELEN); + args->pp = pp; + g_post_event(g_dev_new_alias, args, M_WAITOK, NULL); +} + static struct g_geom * g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused) { Index: head/sys/geom/geom.h =================================================================== --- head/sys/geom/geom.h (revision 221202) +++ head/sys/geom/geom.h (working copy) @@ -218,6 +218,7 @@ struct g_classifier_hook { struct cdev; void g_dev_print(void); struct g_provider *g_dev_getprovider(struct cdev *dev); +void g_dev_make_alias(struct g_provider *pp, const char *fmt, ...); /* geom_dump.c */ void g_trace(int level, const char *, ...);