1 /*
2 libparted - a library for manipulating disk partitions
3 Copyright (C) 2001 Free Software Foundation, Inc.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include <config.h>
20
21 #include <parted/parted.h>
22 #include <parted/endian.h>
23
24 #if ENABLE_NLS
25 # include <libintl.h>
26 # define _(String) dgettext (PACKAGE, String)
27 #else
28 # define _(String) (String)
29 #endif /* ENABLE_NLS */
30
31 #include <uuid/uuid.h>
32 #include "platform_defs.h"
33 #include "xfs_types.h"
34 #include "xfs_sb.h"
35
36 #define XFS_BLOCK_SIZES ((int[2]){512, 0})
37
38 static PedGeometry*
xfs_probe(PedGeometry * geom)39 xfs_probe (PedGeometry* geom)
40 {
41 PedSector block_size;
42 PedSector block_count;
43 union {
44 struct xfs_sb sb;
45 char bytes [512];
46 } buf;
47
48 if (geom->length < XFS_SB_DADDR + 1)
49 return NULL;
50 if (!ped_geometry_read (geom, &buf, XFS_SB_DADDR, 1))
51 return NULL;
52
53 if (PED_LE32_TO_CPU (buf.sb.sb_magicnum) == XFS_SB_MAGIC) {
54 block_size = PED_LE32_TO_CPU (buf.sb.sb_blocksize) / 512;
55 block_count = PED_LE64_TO_CPU (buf.sb.sb_dblocks);
56
57 return ped_geometry_new (geom->dev, geom->start,
58 block_size * block_count);
59 }
60
61 if (PED_BE32_TO_CPU (buf.sb.sb_magicnum) == XFS_SB_MAGIC) {
62 block_size = PED_BE32_TO_CPU (buf.sb.sb_blocksize) / 512;
63 block_count = PED_BE64_TO_CPU (buf.sb.sb_dblocks);
64
65 return ped_geometry_new (geom->dev, geom->start,
66 block_size * block_count);
67 }
68
69 return NULL;
70 }
71
72 #ifndef DISCOVER_ONLY
73 static int
xfs_clobber(PedGeometry * geom)74 xfs_clobber (PedGeometry* geom)
75 {
76 char buf[512];
77
78 memset (buf, 0, 512);
79 return ped_geometry_write (geom, buf, XFS_SB_DADDR, 1);
80 }
81 #endif /* !DISCOVER_ONLY */
82
83 static PedFileSystemOps xfs_ops = {
84 .probe = xfs_probe,
85 #ifndef DISCOVER_ONLY
86 .clobber = xfs_clobber,
87 #else
88 .clobber = NULL,
89 #endif
90 .open = NULL,
91 .create = NULL,
92 .close = NULL,
93 .check = NULL,
94 .copy = NULL,
95 .resize = NULL,
96 .get_create_constraint = NULL,
97 .get_resize_constraint = NULL,
98 .get_copy_constraint = NULL
99 };
100
101 static PedFileSystemType xfs_type = {
102 .next = NULL,
103 .ops = &xfs_ops,
104 .name = "xfs",
105 .block_sizes = XFS_BLOCK_SIZES
106 };
107
108 void
ped_file_system_xfs_init()109 ped_file_system_xfs_init ()
110 {
111 ped_file_system_type_register (&xfs_type);
112 }
113
114 void
ped_file_system_xfs_done()115 ped_file_system_xfs_done ()
116 {
117 ped_file_system_type_unregister (&xfs_type);
118 }
119
120