svn commit: r322198 - in head: share/man/man9 sys/geom

Warner Losh imp at bsdimp.com
Mon Aug 7 22:27:28 UTC 2017


On Mon, Aug 7, 2017 at 4:20 PM, Nathan Whitehorn <nwhitehorn at freebsd.org>
wrote:

>
>
> On 08/07/17 14:32, Warner Losh wrote:
>
>
>
> On Mon, Aug 7, 2017 at 3:19 PM, Nathan Whitehorn <nwhitehorn at 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.
>
>
> We get /dev/gpt/foo (etc.) right now by parsing the GPT labels with a
> completely parallel piece of code to gpart and then create an extra geom
> provider based on the label. This falls down in four ways:
> 1. The code is racy. It is perfectly possible to get a GPT label set by
> gpart but not have it picked up by glabel for some period of time that may
> be infinite (until a retaste), since the events don't propagate.
> 2. The resulting /dev entry is unpredictable from the label, since glabel
> internally does some fixups related to spaces, etc. You need to copy and
> paste glabel's munging code.
> 3. It isn't implemented for all of the schemes gpart supports since it has
> a reimplementation of the partition table parser.
> 4. Because it uses an extra provider, mounting, say, /dev/adaXpY causes
> /dev/gpt/Z to vanish.
>
> This combination of things is why we don't currently use labels in the
> installer and never have. Having gpart internally create symlinks would fix
> all of this at a stroke. I will take a look at this some more and see how
> hard it would be to implement; at the very least, I think you would also
> need a disk_remove_alias() or the like.
>

I've experienced all but #1 and #2. I've run systems for about a decade
with root mounted on /dev/gpt/HOST-root, usr on /dev/gpt/HOST-usr, etc.
Must have gotten lucky, or not hit the use case that you've seen.

Not sure what's up with #3, but it sounds orthogonal and an incomplete
gpart/glabel integration.

#4 has always bothered me. While device aliases like I've done here would
solve that problem, I'm not sure what other issues there'd be demoting
glabel devices to mere /dev/ nodes from first class geom objects.

The main issue I see is needing to have the aliases in place when tasting
time comes for the geom being tasted. I haven't thought through geom's
sequence enough to know if that would be more robust or not.

Warner


-Nathan
>
>
> 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
>>>
>>>
>>
>
>


More information about the svn-src-all mailing list