summaryrefslogtreecommitdiff
blob: a87d6d3465510b039919cf0f90c6067b7d0307ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
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