kern/165428: [glabel][patch] Add xfs support to glabel

Arne Meyer meyer.arne83 at gmail.com
Thu Feb 23 20:10:13 UTC 2012


>Number:         165428
>Category:       kern
>Synopsis:       [glabel][patch] Add xfs support to glabel
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Feb 23 20:10:12 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Arne Meyer
>Release:        9-STABLE
>Organization:
Hochschule Emden/Leer
>Environment:
FreeBSD partyvan 9.0-STABLE FreeBSD 9.0-STABLE #0 r231864M: Fri Feb 17 13:49:42 CET 2012     pk at partyvan:
/usr/obj/usr/src/sys/PARTYVAN  i386
>Description:
glabel does not detect xfs volumes. Back in 2010 I added simple support for xfs labels. I tested it on an old usb drive with an xfs volume on it and it worked for me(TM). This probably needs further testing as I'm no expert on xfs...
>How-To-Repeat:

>Fix:
1. Apply patch
2. ????
3. Profit!

Patch attached with submission follows:

diff --git a/sbin/geom/class/label/glabel.8 b/sbin/geom/class/label/glabel.8
index fff9205..bfa45ca 100644
--- a/sbin/geom/class/label/glabel.8
+++ b/sbin/geom/class/label/glabel.8
@@ -117,6 +117,9 @@ REISERFS (directory
 .It
 NTFS (directory
 .Pa /dev/ntfs/ ) .
+.It
+XFS (directory
+.Pa /dev/xfs ) .
 .El
 .Pp
 Support for partition metadata is implemented for:
diff --git a/sys/conf/files b/sys/conf/files
index 1abb924..49c12ed 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2222,6 +2222,7 @@ geom/label/g_label_ntfs.c	optional geom_label
 geom/label/g_label_reiserfs.c	optional geom_label
 geom/label/g_label_ufs.c	optional geom_label
 geom/label/g_label_gpt.c	optional geom_label
+geom/label/g_label_xfs.c	optional geom_label
 geom/linux_lvm/g_linux_lvm.c	optional geom_linux_lvm
 geom/mirror/g_mirror.c		optional geom_mirror
 geom/mirror/g_mirror_ctl.c	optional geom_mirror
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c
index 0d8a3b4..179509a 100644
--- a/sys/geom/label/g_label.c
+++ b/sys/geom/label/g_label.c
@@ -87,6 +87,7 @@ const struct g_label_desc *g_labels[] = {
 	&g_label_ntfs,
 	&g_label_gpt,
 	&g_label_gpt_uuid,
+	&g_label_xfs,
 	NULL
 };
 
diff --git a/sys/geom/label/g_label.h b/sys/geom/label/g_label.h
index 06ba2f5..e0d78e8 100644
--- a/sys/geom/label/g_label.h
+++ b/sys/geom/label/g_label.h
@@ -87,6 +87,7 @@ extern struct g_label_desc g_label_reiserfs;
 extern struct g_label_desc g_label_ntfs;
 extern struct g_label_desc g_label_gpt;
 extern struct g_label_desc g_label_gpt_uuid;
+extern struct g_label_desc g_label_xfs;
 #endif	/* _KERNEL */
 
 struct g_label_metadata {
diff --git a/sys/geom/label/g_label_xfs.c b/sys/geom/label/g_label_xfs.c
new file mode 100644
index 0000000..69db15f
--- /dev/null
+++ b/sys/geom/label/g_label_xfs.c
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2010 Arne Meyer
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+
+#include <geom/geom.h>
+#include <geom/label/g_label.h>
+
+#define XFS_MAGIC 0x58465342
+
+typedef struct xfs_sb {
+	uint32_t sb_magicnum;
+	char fake[104];
+	char sb_fname[12];
+} xfs_sb_t;
+
+static void
+g_label_xfs_taste(struct g_consumer *cp, char *label, size_t size)
+{
+	struct g_provider *pp;
+	xfs_sb_t *fs;
+
+	g_topology_assert_not();
+	pp = cp->provider;
+	label[0] = '\0';
+
+	fs = (xfs_sb_t *)g_read_data(cp, 0, pp->sectorsize, NULL);
+	if(fs == NULL)
+		return;
+
+	/* Check for xfs magic */
+	if (be32toh(fs->sb_magicnum) == XFS_MAGIC) {
+		G_LABEL_DEBUG(1, "xfs file system detected on %s.",
+		    pp->name);
+	} else {
+		goto exit_free;
+	}
+
+	/* Check for volume label */
+	if (fs->sb_fname[0] == '\0')
+		goto exit_free;
+
+	/* Terminate label */
+	fs->sb_fname[sizeof(fs->sb_fname) - 1] = '\0';
+	strlcpy(label, fs->sb_fname, size);
+
+exit_free:
+	g_free(fs);
+}
+
+struct g_label_desc g_label_xfs = {
+	.ld_taste = g_label_xfs_taste,
+	.ld_dir = "xfs",
+	.ld_enabled = 1
+};
+
+G_LABEL_INIT(xfs, g_label_xfs, "Create device nodes for XFS volumes");
diff --git a/sys/modules/geom/geom_label/Makefile b/sys/modules/geom/geom_label/Makefile
index 300606a..87d8ec0 100644
--- a/sys/modules/geom/geom_label/Makefile
+++ b/sys/modules/geom/geom_label/Makefile
@@ -11,5 +11,6 @@ SRCS+=	g_label_msdosfs.c
 SRCS+=	g_label_ntfs.c
 SRCS+=	g_label_reiserfs.c
 SRCS+=	g_label_ufs.c
+SRCS+=	g_label_xfs.c
 
 .include <bsd.kmod.mk>


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list