Date: Mon, 7 Aug 2017 15:32:02 -0600 From: Warner Losh <imp@bsdimp.com> To: Nathan Whitehorn <nwhitehorn@freebsd.org> Cc: Warner Losh <imp@freebsd.org>, src-committers <src-committers@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org> Subject: Re: svn commit: r322198 - in head: share/man/man9 sys/geom Message-ID: <CANCZdfpOKZ0TnZF6g1ABMhtFAA8KwBv0mMWQ=4Tkm0P3XY-fKQ@mail.gmail.com> In-Reply-To: <ff9f9256-bd4e-0096-ed24-742ef8aed24a@freebsd.org> References: <201708072112.v77LCcXm001489@repo.freebsd.org> <ff9f9256-bd4e-0096-ed24-742ef8aed24a@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Aug 7, 2017 at 3:19 PM, Nathan Whitehorn <nwhitehorn@freebsd.org> wrote: > It would be really nice to let gpart provide aliases correct to partition > labels, which would fix the existing racy and unreliable glabel code. Do > you see any obstacles to using this code for that? I'm not sure I understand well enough the issue here to have an opinion. Warner On 08/07/17 14:12, Warner Losh wrote: > >> Author: imp >> Date: Mon Aug 7 21:12:38 2017 >> New Revision: 322198 >> URL: https://svnweb.freebsd.org/changeset/base/322198 >> >> Log: >> Expose API to allow disks to ask for alias names in devfs. >> Implement disk_add_alias to allow aliases to be added to disks. All >> disk have a primary name (say "foo") can also have secondary names >> (say "bar") such that all instances of "foo" also have a "bar" >> alias. So if you have foo0, foo0p1, foo1, foo1s1 and foo1s1a nodes >> created by the foo driver and gpart, device nodes bar0, bar0p1, bar1, >> bar1s1 and bar1s1a will appear as symlinks back to the original nodes. >> This generalizes to multiple aliases. However, since the unit number >> follows the primary name, multiple device drivers can't create the >> same aliases unless those drives coorinate the unit number space (eg >> you couldn't add an alias 'disk' to both 'da' and 'ada' because it's >> possible to have da0 and ada0, because 'disk0' is ambiguous). >> Differential Revision: https://reviews.freebsd.org/D11873 >> >> Modified: >> head/share/man/man9/disk.9 >> head/sys/geom/geom_disk.c >> head/sys/geom/geom_disk.h >> >> Modified: head/share/man/man9/disk.9 >> ============================================================ >> ================== >> --- head/share/man/man9/disk.9 Mon Aug 7 21:12:33 2017 (r322197) >> +++ head/share/man/man9/disk.9 Mon Aug 7 21:12:38 2017 (r322198) >> @@ -27,7 +27,7 @@ >> .\" >> .\" $FreeBSD$ >> .\" >> -.Dd October 30, 2012 >> +.Dd August 3, 2017 >> .Dt DISK 9 >> .Os >> .Sh NAME >> @@ -45,6 +45,8 @@ >> .Fn disk_destroy "struct disk *disk" >> .Ft int >> .Fn disk_resize "struct disk *disk" "int flags" >> +.Ft void >> +.Fn disk_add_alias "struct disk *disk" "const char *alias" >> .Sh DESCRIPTION >> The disk storage API permits kernel device drivers providing access to >> disk-like storage devices to advertise the device to other kernel >> @@ -69,6 +71,20 @@ function, >> fill in the fields and call >> .Fn disk_create >> when the device is ready to service requests. >> +.Fn disk_add_alias >> +adds an alias for the disk and must be called before >> +.Fn disk_create , >> +but may be called multiple times. >> +For each alias added, a device node will be created with >> +.Xr make_dev_alias 9 >> +in the same way primary device nodes are created with >> +.Xr make_dev 9 >> +for >> +.Va d_name >> +and >> +.Va d_unit . >> +Care should be taken to ensure that only one driver creates aliases >> +for any given name. >> .Fn disk_resize >> can be called by the driver after modifying >> .Va d_mediasize >> @@ -227,7 +243,13 @@ structure for this disk device. >> .El >> .Sh SEE ALSO >> .Xr GEOM 4 , >> -.Xr devfs 5 >> +.Xr devfs 5 , >> +.Xr MAKE_DEV 9 >> .Sh AUTHORS >> This manual page was written by >> .An Robert Watson . >> +.Sh BUGS >> +Disk aliases are not a general purpose aliasing mechanism, but are >> +intended only to ease the transition from one name to another. >> +They can be used to ensure that nvd0 and nda0 are the same thing. >> +They cannot be used to implement the diskX concept from macOS. >> >> Modified: head/sys/geom/geom_disk.c >> ============================================================ >> ================== >> --- head/sys/geom/geom_disk.c Mon Aug 7 21:12:33 2017 (r322197) >> +++ head/sys/geom/geom_disk.c Mon Aug 7 21:12:38 2017 (r322198) >> @@ -676,6 +676,7 @@ g_disk_create(void *arg, int flag) >> struct g_provider *pp; >> struct disk *dp; >> struct g_disk_softc *sc; >> + struct disk_alias *dap; >> char tmpstr[80]; >> if (flag == EV_CANCEL) >> @@ -704,6 +705,10 @@ g_disk_create(void *arg, int flag) >> sc->dp = dp; >> 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); >> devstat_remove_entry(pp->stat); >> pp->stat = NULL; >> @@ -791,6 +796,7 @@ g_disk_destroy(void *ptr, int flag) >> struct disk *dp; >> struct g_geom *gp; >> struct g_disk_softc *sc; >> + struct disk_alias *dap, *daptmp; >> g_topology_assert(); >> dp = ptr; >> @@ -802,6 +808,8 @@ g_disk_destroy(void *ptr, int flag) >> dp->d_geom = NULL; >> g_wither_geom(gp, ENXIO); >> } >> + LIST_FOREACH_SAFE(dap, &dp->d_aliases, da_next, daptmp) >> + g_free(dap); >> g_free(dp); >> } >> @@ -834,8 +842,11 @@ g_disk_ident_adjust(char *ident, size_t size) >> struct disk * >> disk_alloc(void) >> { >> + struct disk *dp; >> - return (g_malloc(sizeof(struct disk), M_WAITOK | M_ZERO)); >> + dp = g_malloc(sizeof(struct disk), M_WAITOK | M_ZERO); >> + LIST_INIT(&dp->d_aliases); >> + return (dp); >> } >> void >> @@ -882,6 +893,18 @@ disk_destroy(struct disk *dp) >> if (dp->d_devstat != NULL) >> devstat_remove_entry(dp->d_devstat); >> g_post_event(g_disk_destroy, dp, M_WAITOK, NULL); >> +} >> + >> +void >> +disk_add_alias(struct disk *dp, const char *name) >> +{ >> + struct disk_alias *dap; >> + >> + dap = (struct disk_alias *)g_malloc( >> + sizeof(struct disk_alias) + strlen(name) + 1, M_WAITOK); >> + strcpy((char *)(dap + 1), name); >> + dap->da_alias = (const char *)(dap + 1); >> + LIST_INSERT_HEAD(&dp->d_aliases, dap, da_next); >> } >> void >> >> Modified: head/sys/geom/geom_disk.h >> ============================================================ >> ================== >> --- head/sys/geom/geom_disk.h Mon Aug 7 21:12:33 2017 (r322197) >> +++ head/sys/geom/geom_disk.h Mon Aug 7 21:12:38 2017 (r322198) >> @@ -66,6 +66,11 @@ typedef enum { >> DISK_INIT_DONE >> } disk_init_level; >> +struct disk_alias { >> + LIST_ENTRY(disk_alias) da_next; >> + const char *da_alias; >> +}; >> + >> struct disk { >> /* Fields which are private to geom_disk */ >> struct g_geom *d_geom; >> @@ -109,6 +114,9 @@ struct disk { >> /* Fields private to the driver */ >> void *d_drv1; >> + >> + /* Fields private to geom_disk, to be moved on next version bump >> */ >> + LIST_HEAD(,disk_alias) d_aliases; >> }; >> #define DISKFLAG_RESERVED 0x1 /* Was NEEDSGIANT */ >> @@ -132,6 +140,7 @@ void disk_attr_changed(struct disk *dp, const char *at >> void disk_media_changed(struct disk *dp, int flag); >> void disk_media_gone(struct disk *dp, int flag); >> int disk_resize(struct disk *dp, int flag); >> +void disk_add_alias(struct disk *disk, const char *); >> #define DISK_VERSION_00 0x58561059 >> #define DISK_VERSION_01 0x5856105a >> >> >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfpOKZ0TnZF6g1ABMhtFAA8KwBv0mMWQ=4Tkm0P3XY-fKQ>