aboutsummaryrefslogtreecommitdiff
path: root/sys/geom
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2020-07-26 00:44:59 +0000
committerXin LI <delphij@FreeBSD.org>2020-07-26 00:44:59 +0000
commit795c5f365e38fe109e6611461dcc032a4a1134b8 (patch)
tree5dec5ea4f5e0abbffbf00ae82f2b8bedd6627a9e /sys/geom
parent357149f037beef26ff80e4a7e716e7d07a8a312f (diff)
downloadsrc-795c5f365e38fe109e6611461dcc032a4a1134b8.tar.gz
src-795c5f365e38fe109e6611461dcc032a4a1134b8.zip
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
Notes
Notes: svn path=/head/; revision=363537
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/label/g_label.c98
-rw-r--r--sys/geom/label/g_label.h3
-rw-r--r--sys/geom/label/g_label_disk_ident.c4
-rw-r--r--sys/geom/label/g_label_ext2fs.c2
-rw-r--r--sys/geom/label/g_label_flashmap.c4
-rw-r--r--sys/geom/label/g_label_gpt.c7
-rw-r--r--sys/geom/label/g_label_iso9660.c4
-rw-r--r--sys/geom/label/g_label_msdosfs.c3
-rw-r--r--sys/geom/label/g_label_ntfs.c4
-rw-r--r--sys/geom/label/g_label_reiserfs.c2
-rw-r--r--sys/geom/label/g_label_ufs.c7
11 files changed, 67 insertions, 71 deletions
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c
index 1052865b6a4e..ceb9d9d83d83 100644
--- a/sys/geom/label/g_label.c
+++ b/sys/geom/label/g_label.c
@@ -63,9 +63,12 @@ static int g_label_destroy_geom(struct gctl_req *req, struct g_class *mp,
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 *mp, struct g_provider *pp,
}
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_label_metadata *md)
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, int dr __unused,
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 *pp, int flags __unused)
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 *pp, int flags __unused)
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_class *mp)
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;
}
}
diff --git a/sys/geom/label/g_label.h b/sys/geom/label/g_label.h
index 4f71915d5b06..60df7e68a12b 100644
--- a/sys/geom/label/g_label.h
+++ b/sys/geom/label/g_label.h
@@ -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, char *label, size_t size);
struct g_label_desc {
g_label_taste_t *ld_taste;
- char *ld_dir;
+ char *ld_dirprefix;
int ld_enabled;
};
diff --git a/sys/geom/label/g_label_disk_ident.c b/sys/geom/label/g_label_disk_ident.c
index 030dba5e37d2..39789f91dc9a 100644
--- a/sys/geom/label/g_label_disk_ident.c
+++ b/sys/geom/label/g_label_disk_ident.c
@@ -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 *label, size_t size)
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
};
diff --git a/sys/geom/label/g_label_ext2fs.c b/sys/geom/label/g_label_ext2fs.c
index 783ea0c4e61e..2003d9b631f6 100644
--- a/sys/geom/label/g_label_ext2fs.c
+++ b/sys/geom/label/g_label_ext2fs.c
@@ -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
};
diff --git a/sys/geom/label/g_label_flashmap.c b/sys/geom/label/g_label_flashmap.c
index 23b018fb5b5a..c19f5fe3ee97 100644
--- a/sys/geom/label/g_label_flashmap.c
+++ b/sys/geom/label/g_label_flashmap.c
@@ -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 *label, size_t size)
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
};
diff --git a/sys/geom/label/g_label_gpt.c b/sys/geom/label/g_label_gpt.c
index 3ed8afeed2fd..13f161735aca 100644
--- a/sys/geom/label/g_label_gpt.c
+++ b/sys/geom/label/g_label_gpt.c
@@ -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 *label, size_t size)
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
};
diff --git a/sys/geom/label/g_label_iso9660.c b/sys/geom/label/g_label_iso9660.c
index 3b1926696a6f..d35f090cd616 100644
--- a/sys/geom/label/g_label_iso9660.c
+++ b/sys/geom/label/g_label_iso9660.c
@@ -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 *label, size_t size)
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
};
diff --git a/sys/geom/label/g_label_msdosfs.c b/sys/geom/label/g_label_msdosfs.c
index d78f728f4c4a..e02d95c0180c 100644
--- a/sys/geom/label/g_label_msdosfs.c
+++ b/sys/geom/label/g_label_msdosfs.c
@@ -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
};
diff --git a/sys/geom/label/g_label_ntfs.c b/sys/geom/label/g_label_ntfs.c
index 653524ab654c..dee105bcc833 100644
--- a/sys/geom/label/g_label_ntfs.c
+++ b/sys/geom/label/g_label_ntfs.c
@@ -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
};
diff --git a/sys/geom/label/g_label_reiserfs.c b/sys/geom/label/g_label_reiserfs.c
index 385f906035b8..4ed04f632324 100644
--- a/sys/geom/label/g_label_reiserfs.c
+++ b/sys/geom/label/g_label_reiserfs.c
@@ -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
};
diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c
index 1d2614b52747..ababbaa4b43a 100644
--- a/sys/geom/label/g_label_ufs.c
+++ b/sys/geom/label/g_label_ufs.c
@@ -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 *label, size_t size)
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
};