Author: delphij
Date: Sun Jul 26 00:44:59 2020
New Revision: 363537
URL: https://svnweb.freebsd.org/changeset/base/363537

Log:
  geom_label: Make glabel labels more trivial by separating the tasting
  routines out.
  
  While there, also simplify the creation of label paths a little bit
  by requiring the / suffix for label directory prefixes (ld_dir renamed
  to ld_dirprefix to indicate the change) and stop defining macros for
  these when they are only used once.
  
  Reviewed by:          cem
  MFC after:            2 weeks
  Differential Revision:        https://reviews.freebsd.org/D25597

Modified:
  head/sys/geom/label/g_label.c
  head/sys/geom/label/g_label.h
  head/sys/geom/label/g_label_disk_ident.c
  head/sys/geom/label/g_label_ext2fs.c
  head/sys/geom/label/g_label_flashmap.c
  head/sys/geom/label/g_label_gpt.c
  head/sys/geom/label/g_label_iso9660.c
  head/sys/geom/label/g_label_msdosfs.c
  head/sys/geom/label/g_label_ntfs.c
  head/sys/geom/label/g_label_reiserfs.c
  head/sys/geom/label/g_label_ufs.c

Modified: head/sys/geom/label/g_label.c
==============================================================================
--- head/sys/geom/label/g_label.c       Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label.c       Sun Jul 26 00:44:59 2020        
(r363537)
@@ -63,9 +63,12 @@ static int g_label_destroy_geom(struct gctl_req *req, 
 static int g_label_destroy(struct g_geom *gp, boolean_t force);
 static struct g_geom *g_label_taste(struct g_class *mp, struct g_provider *pp,
     int flags __unused);
+static void g_label_generic_taste(struct g_consumer *, char *, size_t);
 static void g_label_config(struct gctl_req *req, struct g_class *mp,
     const char *verb);
 
+#define        G_LABEL_DIRPREFIX       "label/"
+
 struct g_class g_label_class = {
        .name = G_LABEL_CLASS_NAME,
        .version = G_VERSION,
@@ -74,6 +77,12 @@ struct g_class g_label_class = {
        .destroy_geom = g_label_destroy_geom
 };
 
+static struct g_label_desc g_label_generic = {
+        .ld_taste = g_label_generic_taste,
+        .ld_dirprefix = G_LABEL_DIRPREFIX,
+        .ld_enabled = 1
+};
+
 /*
  * To add a new file system where you want to look for volume labels,
  * you have to:
@@ -99,6 +108,7 @@ const struct g_label_desc *g_labels[] = {
        &g_label_disk_ident,
        &g_label_flashmap,
 #endif
+       &g_label_generic,
        NULL
 };
 
@@ -213,7 +223,7 @@ g_label_mangle_name(char *label, size_t size)
 
 static struct g_geom *
 g_label_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
-    const char *label, const char *dir, off_t mediasize)
+    const char *label, const char *dirprefix, off_t mediasize)
 {
        struct g_geom *gp;
        struct g_provider *pp2;
@@ -232,7 +242,7 @@ g_label_create(struct gctl_req *req, struct g_class *m
        }
        gp = NULL;
        cp = NULL;
-       if (snprintf(name, sizeof(name), "%s/%s", dir, label) >= sizeof(name)) {
+       if (snprintf(name, sizeof(name), "%s%s", dirprefix, label) >= 
sizeof(name)) {
                if (req != NULL)
                        gctl_error(req, "Label name %s is too long.", label);
                return (NULL);
@@ -300,13 +310,9 @@ g_label_read_metadata(struct g_consumer *cp, struct g_
        u_char *buf;
        int error;
 
-       g_topology_assert();
-
        pp = cp->provider;
-       g_topology_unlock();
        buf = g_read_data(cp, pp->mediasize - pp->sectorsize, pp->sectorsize,
            &error);
-       g_topology_lock();
        if (buf == NULL)
                return (error);
        /* Decode metadata. */
@@ -339,12 +345,43 @@ g_label_access_taste(struct g_provider *pp __unused, i
        return (EOPNOTSUPP);
 }
 
+static void
+g_label_generic_taste(struct g_consumer *cp, char *label, size_t size)
+{
+       struct g_provider *pp;
+       struct g_label_metadata md;
+
+       g_topology_assert_not();
+       label[0] = '\0';
+       pp = cp->provider;
+
+       if (g_label_read_metadata(cp, &md) != 0)
+               return;
+
+       if (strcmp(md.md_magic, G_LABEL_MAGIC) != 0)
+               return;
+
+       if (md.md_version > G_LABEL_VERSION) {
+               printf("geom_label.ko module is too old to handle %s.\n",
+                       pp->name);
+               return;
+       }
+       /*
+        * Backward compatibility: there was no md_provsize field in
+        * earlier versions of metadata, so only check if we have it.
+        */
+       if (md.md_version >= 2 && md.md_provsize != pp->mediasize)
+               return;
+
+       strlcpy(label, md.md_label, size);
+}
+
 static struct g_geom *
 g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
 {
-       struct g_label_metadata md;
        struct g_consumer *cp;
        struct g_geom *gp;
+       off_t mediasize;
        int i;
 
        g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
@@ -367,33 +404,6 @@ g_label_taste(struct g_class *mp, struct g_provider *p
        g_attach(cp, pp);
        if (g_access(cp, 1, 0, 0) != 0)
                goto end;
-       do {
-               if (g_label_read_metadata(cp, &md) != 0)
-                       break;
-               if (strcmp(md.md_magic, G_LABEL_MAGIC) != 0)
-                       break;
-               if (md.md_version > G_LABEL_VERSION) {
-                       printf("geom_label.ko module is too old to handle 
%s.\n",
-                           pp->name);
-                       break;
-               }
-
-               /*
-                * Backward compatibility:
-                */
-               /*
-                * There was no md_provsize field in earlier versions of
-                * metadata.
-                */
-               if (md.md_version < 2)
-                       md.md_provsize = pp->mediasize;
-
-               if (md.md_provsize != pp->mediasize)
-                       break;
-
-               g_label_create(NULL, mp, pp, md.md_label, G_LABEL_DIR,
-                   pp->mediasize - pp->sectorsize);
-       } while (0);
        for (i = 0; g_labels[i] != NULL; i++) {
                char label[128];
 
@@ -405,8 +415,13 @@ g_label_taste(struct g_class *mp, struct g_provider *p
                g_topology_lock();
                if (label[0] == '\0')
                        continue;
-               g_label_create(NULL, mp, pp, label, g_labels[i]->ld_dir,
-                   pp->mediasize);
+               if (g_labels[i] != &g_label_generic) {
+                       mediasize = pp->mediasize;
+               } else {
+                       mediasize = pp->mediasize - pp->sectorsize;
+               }
+               g_label_create(NULL, mp, pp, label,
+                   g_labels[i]->ld_dirprefix, mediasize);
        }
        g_access(cp, -1, 0, 0);
 end:
@@ -448,23 +463,20 @@ g_label_ctl_create(struct gctl_req *req, struct g_clas
                gctl_error(req, "No 'arg%d' argument", 0);
                return;
        }
-       g_label_create(req, mp, pp, name, G_LABEL_DIR, pp->mediasize);
+       g_label_create(req, mp, pp, name, G_LABEL_DIRPREFIX, pp->mediasize);
 }
 
 static const char *
 g_label_skip_dir(const char *name)
 {
-       char path[64];
        u_int i;
 
        if (strncmp(name, _PATH_DEV, strlen(_PATH_DEV)) == 0)
                name += strlen(_PATH_DEV);
-       if (strncmp(name, G_LABEL_DIR "/", strlen(G_LABEL_DIR "/")) == 0)
-               name += strlen(G_LABEL_DIR "/");
        for (i = 0; g_labels[i] != NULL; i++) {
-               snprintf(path, sizeof(path), "%s/", g_labels[i]->ld_dir);
-               if (strncmp(name, path, strlen(path)) == 0) {
-                       name += strlen(path);
+               if (strncmp(name, g_labels[i]->ld_dirprefix,
+                   strlen(g_labels[i]->ld_dirprefix)) == 0) {
+                       name += strlen(g_labels[i]->ld_dirprefix);
                        break;
                }
        }

Modified: head/sys/geom/label/g_label.h
==============================================================================
--- head/sys/geom/label/g_label.h       Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label.h       Sun Jul 26 00:44:59 2020        
(r363537)
@@ -45,7 +45,6 @@
  * 2 - Added md_provsize field to metadata.
  */
 #define        G_LABEL_VERSION         2
-#define        G_LABEL_DIR             "label"
 
 #ifdef _KERNEL
 extern u_int g_label_debug;
@@ -66,7 +65,7 @@ typedef void g_label_taste_t (struct g_consumer *cp, c
 
 struct g_label_desc {
        g_label_taste_t *ld_taste;
-       char            *ld_dir;
+       char            *ld_dirprefix;
        int              ld_enabled;
 };
 

Modified: head/sys/geom/label/g_label_disk_ident.c
==============================================================================
--- head/sys/geom/label/g_label_disk_ident.c    Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_disk_ident.c    Sun Jul 26 00:44:59 2020        
(r363537)
@@ -40,8 +40,6 @@ __FBSDID("$FreeBSD$");
 #include <geom/multipath/g_multipath.h>
 
 
-#define G_LABEL_DISK_IDENT_DIR "diskid"
-
 static char* classes_pass[] = { G_DISK_CLASS_NAME, G_MULTIPATH_CLASS_NAME,
     NULL };
 
@@ -82,7 +80,7 @@ g_label_disk_ident_taste(struct g_consumer *cp, char *
 
 struct g_label_desc g_label_disk_ident = {
        .ld_taste = g_label_disk_ident_taste,
-       .ld_dir = G_LABEL_DISK_IDENT_DIR,
+       .ld_dirprefix = "diskid/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_ext2fs.c
==============================================================================
--- head/sys/geom/label/g_label_ext2fs.c        Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_ext2fs.c        Sun Jul 26 00:44:59 2020        
(r363537)
@@ -97,7 +97,7 @@ exit_free:
 
 struct g_label_desc g_label_ext2fs = {
        .ld_taste = g_label_ext2fs_taste,
-       .ld_dir = "ext2fs",
+       .ld_dirprefix = "ext2fs/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_flashmap.c
==============================================================================
--- head/sys/geom/label/g_label_flashmap.c      Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_flashmap.c      Sun Jul 26 00:44:59 2020        
(r363537)
@@ -39,8 +39,6 @@ __FBSDID("$FreeBSD$");
 #include <geom/geom_slice.h>
 #include <geom/label/g_label.h>
 
-#define        G_LABEL_FLASHMAP_SLICE_DIR      "flash"
-
 static void
 g_label_flashmap_taste(struct g_consumer *cp, char *label, size_t size)
 {
@@ -70,7 +68,7 @@ g_label_flashmap_taste(struct g_consumer *cp, char *la
 
 struct g_label_desc g_label_flashmap = {
        .ld_taste = g_label_flashmap_taste,
-       .ld_dir = G_LABEL_FLASHMAP_SLICE_DIR,
+       .ld_dirprefix = "flash/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_gpt.c
==============================================================================
--- head/sys/geom/label/g_label_gpt.c   Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_gpt.c   Sun Jul 26 00:44:59 2020        
(r363537)
@@ -44,9 +44,6 @@ __FBSDID("$FreeBSD$");
 #define        PART_CLASS_NAME "PART"
 #define        SCHEME_NAME     "GPT"
 
-#define        G_LABEL_GPT_VOLUME_DIR  "gpt"
-#define        G_LABEL_GPT_ID_DIR      "gptid"
-
 /* XXX: Also defined in geom/part/g_part_gpt.c */
 struct g_part_gpt_entry {
        struct g_part_entry     base;
@@ -158,13 +155,13 @@ g_label_gpt_uuid_taste(struct g_consumer *cp, char *la
 
 struct g_label_desc g_label_gpt = {
        .ld_taste = g_label_gpt_taste,
-       .ld_dir = G_LABEL_GPT_VOLUME_DIR,
+       .ld_dirprefix = "gpt/",
        .ld_enabled = 1
 };
 
 struct g_label_desc g_label_gpt_uuid = {
        .ld_taste = g_label_gpt_uuid_taste,
-       .ld_dir = G_LABEL_GPT_ID_DIR,
+       .ld_dirprefix = "gptid/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_iso9660.c
==============================================================================
--- head/sys/geom/label/g_label_iso9660.c       Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_iso9660.c       Sun Jul 26 00:44:59 2020        
(r363537)
@@ -38,8 +38,6 @@ __FBSDID("$FreeBSD$");
 #include <geom/geom_dbg.h>
 #include <geom/label/g_label.h>
 
-#define G_LABEL_ISO9660_DIR    "iso9660"
-
 #define        ISO9660_MAGIC   "\x01" "CD001" "\x01\x00"
 #define        ISO9660_OFFSET  0x8000
 #define        VOLUME_LEN      32
@@ -75,7 +73,7 @@ g_label_iso9660_taste(struct g_consumer *cp, char *lab
 
 struct g_label_desc g_label_iso9660 = {
        .ld_taste = g_label_iso9660_taste,
-       .ld_dir = G_LABEL_ISO9660_DIR,
+       .ld_dirprefix = "iso9660/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_msdosfs.c
==============================================================================
--- head/sys/geom/label/g_label_msdosfs.c       Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_msdosfs.c       Sun Jul 26 00:44:59 2020        
(r363537)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
 #include <geom/label/g_label.h>
 #include <geom/label/g_label_msdosfs.h>
 
-#define G_LABEL_MSDOSFS_DIR    "msdosfs"
 #define LABEL_NO_NAME          "NO NAME    "
 
 static void
@@ -213,7 +212,7 @@ error:
 
 struct g_label_desc g_label_msdosfs = {
        .ld_taste = g_label_msdosfs_taste,
-       .ld_dir = G_LABEL_MSDOSFS_DIR,
+       .ld_dirprefix = "msdosfs/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_ntfs.c
==============================================================================
--- head/sys/geom/label/g_label_ntfs.c  Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_ntfs.c  Sun Jul 26 00:44:59 2020        
(r363537)
@@ -41,8 +41,6 @@ __FBSDID("$FreeBSD$");
 #define        NTFS_FILEMAGIC          ((uint32_t)(0x454C4946))
 #define        NTFS_VOLUMEINO          3
 
-#define G_LABEL_NTFS_DIR       "ntfs"
-
 struct ntfs_attr {
        uint32_t        a_type;
        uint32_t        reclen;
@@ -170,7 +168,7 @@ done:
 
 struct g_label_desc g_label_ntfs = {
        .ld_taste = g_label_ntfs_taste,
-       .ld_dir = G_LABEL_NTFS_DIR,
+       .ld_dirprefix = "ntfs/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_reiserfs.c
==============================================================================
--- head/sys/geom/label/g_label_reiserfs.c      Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_reiserfs.c      Sun Jul 26 00:44:59 2020        
(r363537)
@@ -116,7 +116,7 @@ exit_free:
 
 struct g_label_desc g_label_reiserfs = {
        .ld_taste = g_label_reiserfs_taste,
-       .ld_dir = "reiserfs",
+       .ld_dirprefix = "reiserfs/",
        .ld_enabled = 1
 };
 

Modified: head/sys/geom/label/g_label_ufs.c
==============================================================================
--- head/sys/geom/label/g_label_ufs.c   Sat Jul 25 23:08:51 2020        
(r363536)
+++ head/sys/geom/label/g_label_ufs.c   Sun Jul 26 00:44:59 2020        
(r363537)
@@ -45,9 +45,6 @@ __FBSDID("$FreeBSD$");
 #include <geom/geom_dbg.h>
 #include <geom/label/g_label.h>
 
-#define G_LABEL_UFS_VOLUME_DIR "ufs"
-#define G_LABEL_UFS_ID_DIR     "ufsid"
-
 #define        G_LABEL_UFS_VOLUME      0
 #define        G_LABEL_UFS_ID          1
 
@@ -142,13 +139,13 @@ g_label_ufs_id_taste(struct g_consumer *cp, char *labe
 
 struct g_label_desc g_label_ufs_volume = {
        .ld_taste = g_label_ufs_volume_taste,
-       .ld_dir = G_LABEL_UFS_VOLUME_DIR,
+       .ld_dirprefix = "ufs/",
        .ld_enabled = 1
 };
 
 struct g_label_desc g_label_ufs_id = {
        .ld_taste = g_label_ufs_id_taste,
-       .ld_dir = G_LABEL_UFS_ID_DIR,
+       .ld_dirprefix = "ufsid/",
        .ld_enabled = 1
 };
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to