I ported ZFS support to Gentoo's parted 3.1 package from Debian's parted
2.3 package.

https://bugs.gentoo.org/show_bug.cgi?id=419157
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=595007

It appears that Debian did not make an effort to send this upstream in
parted 3.x. I would like to do that.
commit 65f838008107a688751dd5a2753c9073e9353daf
Author: root <root@desktop.(none)>
Date:   Fri Jun 1 16:26:34 2012 -0400

    Add ZFS Support

diff --git a/libparted/fs/Makefile.am b/libparted/fs/Makefile.am
index 8d48ea1..51b4151 100644
--- a/libparted/fs/Makefile.am
+++ b/libparted/fs/Makefile.am
@@ -49,7 +49,8 @@ libfs_la_SOURCES =		\
   xfs/platform_defs.h		\
   xfs/xfs.c			\
   xfs/xfs_sb.h			\
-  xfs/xfs_types.h
+  xfs/xfs_types.h		\
+  zfs/zfs.c
 
 lib_LTLIBRARIES = libparted-fs-resize.la
 
diff --git a/libparted/fs/Makefile.in b/libparted/fs/Makefile.in
index 4335eb1..e3a134b 100644
--- a/libparted/fs/Makefile.in
+++ b/libparted/fs/Makefile.in
@@ -1112,7 +1112,8 @@ libfs_la_SOURCES = \
   xfs/platform_defs.h		\
   xfs/xfs.c			\
   xfs/xfs_sb.h			\
-  xfs/xfs_types.h
+  xfs/xfs_types.h		\
+  zfs/zfs.c
 
 lib_LTLIBRARIES = libparted-fs-resize.la
 EXTRA_DIST = hfs/DOC hfs/HISTORY hfs/TODO fsresize.sym
diff --git a/libparted/fs/zfs/Makefile.am b/libparted/fs/zfs/Makefile.am
new file mode 100644
index 0000000..3273c6a
--- /dev/null
+++ b/libparted/fs/zfs/zfs.c
@@ -0,0 +1,81 @@
+/*
+    libparted - a library for manipulating disk partitions
+    Copyright (C) 2000, 2007, 2009-2010 Free Software Foundation, Inc.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <parted/parted.h>
+#include <parted/endian.h>
+
+#if ENABLE_NLS
+#  include <libintl.h>
+#  define _(String) dgettext (PACKAGE, String)
+#else
+#  define _(String) (String)
+#endif /* ENABLE_NLS */
+
+#include <unistd.h>
+
+#define ZFS_BLOCK_SIZES       ((int[2]){512, 0})
+
+#define ZFS_SIGNATURE		0x00bab10c
+
+struct zfs_uberblock
+{ 
+  uint64_t signature;
+  uint64_t version;
+};
+
+static PedGeometry*
+zfs_probe (PedGeometry* geom)
+{
+	uint8_t	buf[512];
+	struct zfs_uberblock *uber = (void *) buf;
+
+	if (!ped_geometry_read (geom, buf, 256, 1))
+		return 0;
+
+	if ((le64toh (uber->signature) == ZFS_SIGNATURE
+		|| be64toh (uber->signature) == ZFS_SIGNATURE)
+		&& uber->version != 0)
+		return ped_geometry_new (geom->dev, geom->start, geom->length);
+	else
+		return NULL;
+}
+
+static PedFileSystemOps zfs_ops = {
+	probe:		zfs_probe,
+};
+
+static PedFileSystemType zfs_type = {
+	next:	NULL,
+	ops:	&zfs_ops,
+	name:	"zfs",
+	block_sizes: ZFS_BLOCK_SIZES
+};
+
+void
+ped_file_system_zfs_init ()
+{
+	ped_file_system_type_register (&zfs_type);
+}
+
+void
+ped_file_system_zfs_done ()
+{
+	ped_file_system_type_unregister (&zfs_type);
+}
diff --git a/libparted/libparted.c b/libparted/libparted.c
index a6d86f0..6545989 100644
--- a/libparted/libparted.c
+++ b/libparted/libparted.c
@@ -109,6 +109,7 @@ extern void ped_file_system_hfs_init (void);
 extern void ped_file_system_fat_init (void);
 extern void ped_file_system_ext2_init (void);
 extern void ped_file_system_nilfs2_init (void);
+extern void ped_file_system_zfs_init (void);
 
 static void
 init_file_system_types ()
@@ -124,6 +125,7 @@ init_file_system_types ()
 	ped_file_system_fat_init ();
 	ped_file_system_ext2_init ();
 	ped_file_system_nilfs2_init ();
+	ped_file_system_zfs_init ();
 }
 
 extern void ped_disk_aix_done ();
@@ -186,6 +188,7 @@ extern void ped_file_system_reiserfs_done (void);
 extern void ped_file_system_ufs_done (void);
 extern void ped_file_system_xfs_done (void);
 extern void ped_file_system_amiga_done (void);
+extern void ped_file_system_zfs_done (void);
 
 static void
 done_file_system_types ()
@@ -201,6 +204,7 @@ done_file_system_types ()
 	ped_file_system_ufs_done ();
 	ped_file_system_xfs_done ();
 	ped_file_system_amiga_done ();
+	ped_file_system_zfs_done ();
 }
 
 static void _done() __attribute__ ((destructor));
diff --git a/scripts/data/abi/baseline_symbols.txt b/scripts/data/abi/baseline_symbols.txt
index 9162f1a..8bb87e6 100644
--- a/scripts/data/abi/baseline_symbols.txt
+++ b/scripts/data/abi/baseline_symbols.txt
@@ -344,6 +344,8 @@ FUNC:ped_file_system_ufs_done
 FUNC:ped_file_system_ufs_init
 FUNC:ped_file_system_xfs_done
 FUNC:ped_file_system_xfs_init
+FUNC:ped_file_system_zfs_done
+FUNC:ped_file_system_zfs_init
 FUNC:ped_geometry_check
 FUNC:ped_geometry_destroy
 FUNC:ped_geometry_duplicate

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to