svn commit: r363537 - head/sys/geom/label

Xin LI delphij at FreeBSD.org
Sun Jul 26 00:45:02 UTC 2020


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
 };
 


More information about the svn-src-head mailing list