xref: /onnv-gate/usr/src/lib/libparted/common/libparted/fs/xfs/xfs.c (revision 9663:ace9a2ac3683)
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