From a652c80f142411473d14c038e91c24ba81537f5b Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Fri, 28 Mar 2014 17:09:48 +0000 Subject: Add ZFS support Last-Update: 2019-10-11 Patch-Name: zfs.patch --- libparted/fs/Makefile.am | 3 +- libparted/fs/zfs/zfs.c | 77 ++++++++++++++++++++++++++++++++++++++++ libparted/libparted.c | 4 +++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 libparted/fs/zfs/zfs.c diff --git a/libparted/fs/Makefile.am b/libparted/fs/Makefile.am index 41a60d98..1636d49f 100644 --- a/libparted/fs/Makefile.am +++ b/libparted/fs/Makefile.am @@ -52,7 +52,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/zfs/zfs.c b/libparted/fs/zfs/zfs.c new file mode 100644 index 00000000..47cd6773 --- /dev/null +++ b/libparted/fs/zfs/zfs.c @@ -0,0 +1,77 @@ +/* + 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 . +*/ + +#include + +#include +#include + +#if ENABLE_NLS +# include +# define _(String) dgettext (PACKAGE, String) +#else +# define _(String) (String) +#endif /* ENABLE_NLS */ + +#include + +#define ZFS_SIGNATURE 0x00bab10c + +struct zfs_uberblock +{ + uint64_t signature; + uint64_t version; +}; + +static PedGeometry* +zfs_probe (PedGeometry* geom) +{ + struct zfs_uberblock *uber = alloca (geom->dev->sector_size); + + if (!ped_geometry_read (geom, uber, 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", +}; + +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 204ce007..88e7eea2 100644 --- a/libparted/libparted.c +++ b/libparted/libparted.c @@ -115,6 +115,7 @@ extern void ped_file_system_ext2_init (void); extern void ped_file_system_nilfs2_init (void); extern void ped_file_system_btrfs_init (void); extern void ped_file_system_udf_init (void); +extern void ped_file_system_zfs_init (void); static void init_file_system_types () @@ -133,6 +134,7 @@ init_file_system_types () ped_file_system_nilfs2_init (); ped_file_system_btrfs_init (); ped_file_system_udf_init (); + ped_file_system_zfs_init (); } extern void ped_disk_aix_done (); @@ -200,10 +202,12 @@ extern void ped_file_system_xfs_done (void); extern void ped_file_system_amiga_done (void); extern void ped_file_system_btrfs_done (void); extern void ped_file_system_udf_done (void); +extern void ped_file_system_zfs_done (void); static void done_file_system_types () { + ped_file_system_zfs_done (); ped_file_system_nilfs2_done (); ped_file_system_ext2_done (); ped_file_system_f2fs_done ();