Author: imp
Date: Mon Aug  7 21:12:33 2017
New Revision: 322197
URL: https://svnweb.freebsd.org/changeset/base/322197

Log:
  Add alias support to gpart.
  
  When we're creating new providers for each of the partitions, add
  aliases to the geom before we create the provider so when geom_dev
  tastes the provider, the aliases are in place so the proper /dev
  entries are created. So foo5p6 gets created as an alias for bar5p6
  when foo is an alias for bar in the geom we're partitioning with
  g_part. This also copies aliases from the container geom (eg disk) to
  the label geom (the disk with GPT partitioning) so that aliases nest
  properly.
  
  Differential Revision: https://reviews.freebsd.org/D11873

Modified:
  head/sys/geom/part/g_part.c

Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c Mon Aug  7 21:12:28 2017        (r322196)
+++ head/sys/geom/part/g_part.c Mon Aug  7 21:12:33 2017        (r322197)
@@ -429,6 +429,7 @@ g_part_new_provider(struct g_geom *gp, struct g_part_t
        struct g_consumer *cp;
        struct g_provider *pp;
        struct sbuf *sb;
+       struct g_geom_alias *gap;
        off_t offset;
 
        cp = LIST_FIRST(&gp->consumer);
@@ -439,6 +440,19 @@ g_part_new_provider(struct g_geom *gp, struct g_part_t
                entry->gpe_offset = offset;
 
        if (entry->gpe_pp == NULL) {
+               /*
+                * 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).
+                */
+               LIST_FOREACH(gap, &table->gpt_gp->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));
+                       sbuf_delete(sb);
+               }
                sb = sbuf_new_auto();
                G_PART_FULLNAME(table, entry, sb, gp->name);
                sbuf_finish(sb);
@@ -1901,6 +1915,7 @@ 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;
 
@@ -1913,10 +1928,12 @@ g_part_taste(struct g_class *mp, struct g_provider *pp
 
        /*
         * Create a GEOM with consumer and hook it up to the provider.
-        * With that we become part of the topology. Optain read access
+        * With that we become part of the topology. Obtain read access
         * 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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to