1 /* vi: set sw=4 ts=4: */
3 * probe.h - constants and on-disk structures for extracting device data
5 * Copyright (C) 1999 by Andries Brouwer
6 * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
7 * Copyright (C) 2001 by Andreas Dilger
10 * This file may be redistributed under the terms of the
11 * GNU Lesser General Public License.
15 #define BLKID_PROBE_H 1
17 #include <linux/types.h>
21 typedef int (*blkid_probe_t
)(int fd
, blkid_cache cache
, blkid_dev dev
,
22 const struct blkid_magic
*id
, unsigned char *buf
);
25 const char *bim_type
; /* type name for this magic */
26 long bim_kboff
; /* kilobyte offset of superblock */
27 unsigned bim_sboff
; /* byte offset within superblock */
28 unsigned bim_len
; /* length of magic */
29 const char *bim_magic
; /* magic string */
30 blkid_probe_t bim_probe
; /* probe function */
34 * Structures for each of the content types we want to extract information
35 * from. We do not necessarily need the magic field here, because we have
36 * already identified the content type before we get this far. It may still
37 * be useful if there are probe functions which handle multiple content types.
39 struct ext2_super_block
{
42 __u32 s_r_blocks_count
;
43 __u32 s_free_blocks_count
;
44 __u32 s_free_inodes_count
;
45 __u32 s_first_data_block
;
46 __u32 s_log_block_size
;
48 unsigned char s_magic
[2];
51 __u32 s_feature_compat
;
52 __u32 s_feature_incompat
;
53 __u32 s_feature_ro_compat
;
54 unsigned char s_uuid
[16];
55 char s_volume_name
[16];
57 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x00000004
58 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x00000004
59 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x00000008
61 struct xfs_super_block
{
62 unsigned char xs_magic
[4];
67 unsigned char xs_uuid
[16];
76 struct reiserfs_super_block
{
77 __u32 rs_blocks_count
;
80 __u32 rs_journal_block
;
82 __u32 rs_orig_journal_size
;
86 unsigned char rs_magic
[12];
88 unsigned char rs_uuid
[16];
92 struct jfs_super_block
{
93 unsigned char js_magic
[4];
100 unsigned char js_uuid
[16];
101 unsigned char js_label
[16];
102 unsigned char js_loguuid
[16];
105 struct romfs_super_block
{
106 unsigned char ros_magic
[8];
108 unsigned char ros_volume
[16];
111 struct cramfs_super_block
{
126 struct swap_id_block
{
127 /* unsigned char sws_boot[1024]; */
131 unsigned char sws_uuid
[16];
133 unsigned char sws_pad
[117];
137 /* Yucky misaligned values */
138 struct vfat_super_block
{
139 /* 00*/ unsigned char vs_ignored
[3];
140 /* 03*/ unsigned char vs_sysid
[8];
141 /* 0b*/ unsigned char vs_sector_size
[2];
142 /* 0d*/ __u8 vs_cluster_size
;
143 /* 0e*/ __u16 vs_reserved
;
144 /* 10*/ __u8 vs_fats
;
145 /* 11*/ unsigned char vs_dir_entries
[2];
146 /* 13*/ unsigned char vs_sectors
[2];
147 /* 15*/ unsigned char vs_media
;
148 /* 16*/ __u16 vs_fat_length
;
149 /* 18*/ __u16 vs_secs_track
;
150 /* 1a*/ __u16 vs_heads
;
151 /* 1c*/ __u32 vs_hidden
;
152 /* 20*/ __u32 vs_total_sect
;
153 /* 24*/ __u32 vs_fat32_length
;
154 /* 28*/ __u16 vs_flags
;
155 /* 2a*/ __u8 vs_version
[2];
156 /* 2c*/ __u32 vs_root_cluster
;
157 /* 30*/ __u16 vs_insfo_sector
;
158 /* 32*/ __u16 vs_backup_boot
;
159 /* 34*/ __u16 vs_reserved2
[6];
160 /* 40*/ unsigned char vs_unknown
[3];
161 /* 43*/ unsigned char vs_serno
[4];
162 /* 47*/ char vs_label
[11];
163 /* 52*/ unsigned char vs_magic
[8];
164 /* 5a*/ unsigned char vs_dummy2
[164];
165 /*1fe*/ unsigned char vs_pmagic
[2];
168 /* Yucky misaligned values */
169 struct msdos_super_block
{
170 /* 00*/ unsigned char ms_ignored
[3];
171 /* 03*/ unsigned char ms_sysid
[8];
172 /* 0b*/ unsigned char ms_sector_size
[2];
173 /* 0d*/ __u8 ms_cluster_size
;
174 /* 0e*/ __u16 ms_reserved
;
175 /* 10*/ __u8 ms_fats
;
176 /* 11*/ unsigned char ms_dir_entries
[2];
177 /* 13*/ unsigned char ms_sectors
[2];
178 /* 15*/ unsigned char ms_media
;
179 /* 16*/ __u16 ms_fat_length
;
180 /* 18*/ __u16 ms_secs_track
;
181 /* 1a*/ __u16 ms_heads
;
182 /* 1c*/ __u32 ms_hidden
;
183 /* 20*/ __u32 ms_total_sect
;
184 /* 24*/ unsigned char ms_unknown
[3];
185 /* 27*/ unsigned char ms_serno
[4];
186 /* 2b*/ char ms_label
[11];
187 /* 36*/ unsigned char ms_magic
[8];
188 /* 3d*/ unsigned char ms_dummy2
[192];
189 /*1fe*/ unsigned char ms_pmagic
[2];
192 struct minix_super_block
{
195 __u16 ms_imap_blocks
;
196 __u16 ms_zmap_blocks
;
197 __u16 ms_firstdatazone
;
198 __u16 ms_log_zone_size
;
200 unsigned char ms_magic
[2];
205 struct mdp_superblock_s
{
218 __u32 not_persistent
;
224 struct hfs_super_block
{
230 struct ocfs_volume_header
{
231 unsigned char minor_version
[4];
232 unsigned char major_version
[4];
233 unsigned char signature
[128];
235 unsigned char mount_len
[2];
238 struct ocfs_volume_label
{
239 unsigned char disk_lock
[48];
241 unsigned char label_len
[2];
242 unsigned char vol_id
[16];
243 unsigned char vol_id_len
[2];
246 #define ocfsmajor(o) ((__u32)o.major_version[0] \
247 + (((__u32) o.major_version[1]) << 8) \
248 + (((__u32) o.major_version[2]) << 16) \
249 + (((__u32) o.major_version[3]) << 24))
250 #define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8))
251 #define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8))
253 #define OCFS_MAGIC "OracleCFS"
255 struct ocfs2_super_block
{
256 unsigned char signature
[8];
257 unsigned char s_dummy1
[184];
258 unsigned char s_dummy2
[80];
260 unsigned char s_uuid
[16];
263 #define OCFS2_MIN_BLOCKSIZE 512
264 #define OCFS2_MAX_BLOCKSIZE 4096
266 #define OCFS2_SUPER_BLOCK_BLKNO 2
268 #define OCFS2_SUPER_BLOCK_SIGNATURE "OCFSV2"
270 struct oracle_asm_disk_label
{
276 #define ORACLE_ASM_DISK_LABEL_MARKED "ORCLDISK"
277 #define ORACLE_ASM_DISK_LABEL_OFFSET 32
279 #define ISODCL(from, to) (to - from + 1)
280 struct iso_volume_descriptor
{
281 char type
[ISODCL(1,1)]; /* 711 */
282 char id
[ISODCL(2,6)];
283 char version
[ISODCL(7,7)];
284 char data
[ISODCL(8,2048)];
288 * Byte swap functions
291 #define _INLINE_ static __inline__
292 #else /* For Watcom C */
293 #define _INLINE_ static inline
296 static __u16
blkid_swab16(__u16 val
);
297 static __u32
blkid_swab32(__u32 val
);
298 static __u64
blkid_swab64(__u64 val
);
300 #if ((defined __GNUC__) && \
301 (defined(__i386__) || defined(__i486__) || defined(__i586__)))
303 #define _BLKID_HAVE_ASM_BITOPS_
305 _INLINE_ __u32
blkid_swab32(__u32 val
)
307 #ifdef EXT2FS_REQUIRE_486
308 __asm__("bswap %0" : "=r" (val
) : "0" (val
));
310 __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
311 "rorl $16,%0\n\t" /* swap words */
312 "xchgb %b0,%h0" /* swap higher bytes */
319 _INLINE_ __u16
blkid_swab16(__u16 val
)
321 __asm__("xchgb %b0,%h0" /* swap bytes */
327 _INLINE_ __u64
blkid_swab64(__u64 val
)
329 return blkid_swab32(val
>> 32) |
330 ( ((__u64
)blkid_swab32((__u32
)val
)) << 32 );
334 #if !defined(_BLKID_HAVE_ASM_BITOPS_)
336 _INLINE_ __u16
blkid_swab16(__u16 val
)
338 return (val
>> 8) | (val
<< 8);
341 _INLINE_ __u32
blkid_swab32(__u32 val
)
343 return (val
>>24) | ((val
>>8) & 0xFF00) |
344 ((val
<<8) & 0xFF0000) | (val
<<24);
347 _INLINE_ __u64
blkid_swab64(__u64 val
)
349 return blkid_swab32(val
>> 32) |
350 ( ((__u64
)blkid_swab32((__u32
)val
)) << 32 );
356 #if __BYTE_ORDER == __BIG_ENDIAN
357 #define blkid_le16(x) blkid_swab16(x)
358 #define blkid_le32(x) blkid_swab32(x)
359 #define blkid_le64(x) blkid_swab64(x)
360 #define blkid_be16(x) (x)
361 #define blkid_be32(x) (x)
362 #define blkid_be64(x) (x)
364 #define blkid_le16(x) (x)
365 #define blkid_le32(x) (x)
366 #define blkid_le64(x) (x)
367 #define blkid_be16(x) blkid_swab16(x)
368 #define blkid_be32(x) blkid_swab32(x)
369 #define blkid_be64(x) blkid_swab64(x)
374 #endif /* _BLKID_PROBE_H */