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

Warner Losh imp at bsdimp.com
Mon Aug 7 21:32:04 UTC 2017


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.

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