Whamcloud - gitweb
Add EXT_JOURNAL to the blkid tag of ext3 filesystems.
[tools/e2fsprogs.git] / lib / blkid / probe.h
1 /*
2  * probe.h - constants and on-disk structures for extracting device data
3  *
4  * Copyright (C) 1999 by Andries Brouwer
5  * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
6  * Copyright (C) 2001 by Andreas Dilger
7  *
8  * %Begin-Header%
9  * This file may be redistributed under the terms of the
10  * GNU Lesser General Public License.
11  * %End-Header%
12  */
13
14 #ifndef _BLKID_PROBE_H
15 #define _BLKID_PROBE_H
16
17 #include <blkid/blkid_types.h>
18
19 struct blkid_magic;
20
21 #define SB_BUFFER_SIZE          0x11000
22
23 struct blkid_probe {
24         int                     fd;
25         blkid_cache             cache;
26         blkid_dev               dev;
27         unsigned char           *sbbuf;
28         size_t                  sb_valid;
29         unsigned char           *buf;
30         size_t                  buf_max;
31 };
32
33 typedef int (*blkid_probe_t)(struct blkid_probe *probe, 
34                              struct blkid_magic *id, unsigned char *buf);
35
36 struct blkid_magic {
37         const char      *bim_type;      /* type name for this magic */
38         long            bim_kboff;      /* kilobyte offset of superblock */
39         unsigned        bim_sboff;      /* byte offset within superblock */
40         unsigned        bim_len;        /* length of magic */
41         const char      *bim_magic;     /* magic string */
42         blkid_probe_t   bim_probe;      /* probe function */
43 };
44
45 /*
46  * Structures for each of the content types we want to extract information
47  * from.  We do not necessarily need the magic field here, because we have
48  * already identified the content type before we get this far.  It may still
49  * be useful if there are probe functions which handle multiple content types.
50  */
51 struct ext2_super_block {
52         __u32           s_inodes_count;
53         __u32           s_blocks_count;
54         __u32           s_r_blocks_count;
55         __u32           s_free_blocks_count;
56         __u32           s_free_inodes_count;
57         __u32           s_first_data_block;
58         __u32           s_log_block_size;
59         __u32           s_dummy3[7];
60         unsigned char   s_magic[2];
61         __u16           s_state;
62         __u32           s_dummy5[8];
63         __u32           s_feature_compat;
64         __u32           s_feature_incompat;
65         __u32           s_feature_ro_compat;
66         unsigned char   s_uuid[16];
67         char       s_volume_name[16];
68         char    s_last_mounted[64];
69         __u32   s_algorithm_usage_bitmap;
70         __u8    s_prealloc_blocks;
71         __u8    s_prealloc_dir_blocks;
72         __u16   s_reserved_gdt_blocks;
73         __u8    s_journal_uuid[16];
74         __u32   s_journal_inum;
75         __u32   s_journal_dev;
76         __u32   s_last_orphan;
77         __u32   s_hash_seed[4];
78         __u8    s_def_hash_version;
79         __u8    s_jnl_backup_type;
80         __u16   s_reserved_word_pad;
81         __u32   s_default_mount_opts;
82         __u32   s_first_meta_bg;
83         __u32   s_mkfs_time;
84         __u32   s_jnl_blocks[17];
85         __u32   s_reserved[172];
86 };
87 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL         0x00000004
88 #define EXT3_FEATURE_INCOMPAT_RECOVER           0x00000004
89 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV       0x00000008
90
91 struct xfs_super_block {
92         unsigned char   xs_magic[4];
93         __u32           xs_blocksize;
94         __u64           xs_dblocks;
95         __u64           xs_rblocks;
96         __u32           xs_dummy1[2];
97         unsigned char   xs_uuid[16];
98         __u32           xs_dummy2[15];
99         char            xs_fname[12];
100         __u32           xs_dummy3[2];
101         __u64           xs_icount;
102         __u64           xs_ifree;
103         __u64           xs_fdblocks;
104 };
105
106 struct reiserfs_super_block {
107         __u32           rs_blocks_count;
108         __u32           rs_free_blocks;
109         __u32           rs_root_block;
110         __u32           rs_journal_block;
111         __u32           rs_journal_dev;
112         __u32           rs_orig_journal_size;
113         __u32           rs_dummy2[5];
114         __u16           rs_blocksize;
115         __u16           rs_dummy3[3];
116         unsigned char   rs_magic[12];
117         __u32           rs_dummy4[5];
118         unsigned char   rs_uuid[16];
119         char            rs_label[16];
120 };
121
122 struct reiser4_super_block {
123         unsigned char   rs4_magic[16];
124         __u16           rs4_dummy[2];
125         unsigned char   rs4_uuid[16];
126         unsigned char   rs4_label[16];
127         __u64           rs4_dummy2;
128 };
129
130 struct jfs_super_block {
131         unsigned char   js_magic[4];
132         __u32           js_version;
133         __u64           js_size;
134         __u32           js_bsize;
135         __u32           js_dummy1;
136         __u32           js_pbsize;
137         __u32           js_dummy2[27];
138         unsigned char   js_uuid[16];
139         unsigned char   js_label[16];
140         unsigned char   js_loguuid[16];
141 };
142
143 struct romfs_super_block {
144         unsigned char   ros_magic[8];
145         __u32           ros_dummy1[2];
146         unsigned char   ros_volume[16];
147 };
148
149 struct cramfs_super_block {
150         __u8            magic[4];
151         __u32           size;
152         __u32           flags;
153         __u32           future;
154         __u8            signature[16];
155         struct cramfs_info {
156                 __u32           crc;
157                 __u32           edition;
158                 __u32           blocks;
159                 __u32           files;
160         } info;
161         __u8            name[16];
162 };
163
164 struct swap_id_block {
165 /*      unsigned char   sws_boot[1024]; */
166         __u32           sws_version;
167         __u32           sws_lastpage;
168         __u32           sws_nrbad;
169         unsigned char   sws_uuid[16];
170         char            sws_volume[16];
171         unsigned char   sws_pad[117];
172         __u32           sws_badpg;
173 };
174
175 /* Yucky misaligned values */
176 struct vfat_super_block {
177 /* 00*/ unsigned char   vs_ignored[3];
178 /* 03*/ unsigned char   vs_sysid[8];
179 /* 0b*/ unsigned char   vs_sector_size[2];
180 /* 0d*/ __u8            vs_cluster_size;
181 /* 0e*/ __u16           vs_reserved;
182 /* 10*/ __u8            vs_fats;
183 /* 11*/ unsigned char   vs_dir_entries[2];
184 /* 13*/ unsigned char   vs_sectors[2];
185 /* 15*/ unsigned char   vs_media;
186 /* 16*/ __u16           vs_fat_length;
187 /* 18*/ __u16           vs_secs_track;
188 /* 1a*/ __u16           vs_heads;
189 /* 1c*/ __u32           vs_hidden;
190 /* 20*/ __u32           vs_total_sect;
191 /* 24*/ __u32           vs_fat32_length;
192 /* 28*/ __u16           vs_flags;
193 /* 2a*/ __u8            vs_version[2];
194 /* 2c*/ __u32           vs_root_cluster;
195 /* 30*/ __u16           vs_insfo_sector;
196 /* 32*/ __u16           vs_backup_boot;
197 /* 34*/ __u16           vs_reserved2[6];
198 /* 40*/ unsigned char   vs_unknown[3];
199 /* 43*/ unsigned char   vs_serno[4];
200 /* 47*/ unsigned char   vs_label[11];
201 /* 52*/ unsigned char   vs_magic[8];
202 /* 5a*/ unsigned char   vs_dummy2[164];
203 /*1fe*/ unsigned char   vs_pmagic[2];
204 };
205
206 /* Yucky misaligned values */
207 struct msdos_super_block {
208 /* 00*/ unsigned char   ms_ignored[3];
209 /* 03*/ unsigned char   ms_sysid[8];
210 /* 0b*/ unsigned char   ms_sector_size[2];
211 /* 0d*/ __u8            ms_cluster_size;
212 /* 0e*/ __u16           ms_reserved;
213 /* 10*/ __u8            ms_fats;
214 /* 11*/ unsigned char   ms_dir_entries[2];
215 /* 13*/ unsigned char   ms_sectors[2];
216 /* 15*/ unsigned char   ms_media;
217 /* 16*/ __u16           ms_fat_length;
218 /* 18*/ __u16           ms_secs_track;
219 /* 1a*/ __u16           ms_heads;
220 /* 1c*/ __u32           ms_hidden;
221 /* 20*/ __u32           ms_total_sect;
222 /* 24*/ unsigned char   ms_unknown[3];
223 /* 27*/ unsigned char   ms_serno[4];
224 /* 2b*/ unsigned char   ms_label[11];
225 /* 36*/ unsigned char   ms_magic[8];
226 /* 3d*/ unsigned char   ms_dummy2[192];
227 /*1fe*/ unsigned char   ms_pmagic[2];
228 };
229
230 struct vfat_dir_entry {
231         __u8    name[11];
232         __u8    attr;
233         __u16   time_creat;
234         __u16   date_creat;
235         __u16   time_acc;
236         __u16   date_acc;
237         __u16   cluster_high;
238         __u16   time_write;
239         __u16   date_write;
240         __u16   cluster_low;
241         __u32   size;
242 };
243
244 /* maximum number of clusters */
245 #define FAT12_MAX 0xFF4
246 #define FAT16_MAX 0xFFF4
247 #define FAT32_MAX 0x0FFFFFF6
248
249 struct minix_super_block {
250         __u16           ms_ninodes;
251         __u16           ms_nzones;
252         __u16           ms_imap_blocks;
253         __u16           ms_zmap_blocks;
254         __u16           ms_firstdatazone;
255         __u16           ms_log_zone_size;
256         __u32           ms_max_size;
257         unsigned char   ms_magic[2];
258         __u16           ms_state;
259         __u32           ms_zones;
260 };
261
262 struct mdp_superblock_s {
263         __u32 md_magic;
264         __u32 major_version;
265         __u32 minor_version;
266         __u32 patch_version;
267         __u32 gvalid_words;
268         __u32 set_uuid0;
269         __u32 ctime;
270         __u32 level;
271         __u32 size;
272         __u32 nr_disks;
273         __u32 raid_disks;
274         __u32 md_minor;
275         __u32 not_persistent;
276         __u32 set_uuid1;
277         __u32 set_uuid2;
278         __u32 set_uuid3;
279 };
280
281 struct hfs_super_block {
282         char    h_magic[2];
283         char    h_dummy[18];
284         __u32   h_blksize;
285 };
286
287 struct ocfs_volume_header {
288         unsigned char   minor_version[4];
289         unsigned char   major_version[4];
290         unsigned char   signature[128];
291         char            mount[128];
292         unsigned char   mount_len[2];
293 };
294
295 struct ocfs_volume_label {
296         unsigned char   disk_lock[48];
297         char            label[64];      
298         unsigned char   label_len[2];
299         unsigned char  vol_id[16];
300         unsigned char  vol_id_len[2];
301 };
302
303 #define ocfsmajor(o) ((__u32)o.major_version[0] \
304                    + (((__u32) o.major_version[1]) << 8) \
305                    + (((__u32) o.major_version[2]) << 16) \
306                    + (((__u32) o.major_version[3]) << 24))
307 #define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8))
308 #define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8))
309
310 #define OCFS_MAGIC "OracleCFS"
311
312 struct ocfs2_super_block {
313         unsigned char  signature[8];
314         unsigned char  s_dummy1[184];
315         unsigned char  s_dummy2[80];
316         char           s_label[64];
317         unsigned char  s_uuid[16];
318 };
319
320 #define OCFS2_MIN_BLOCKSIZE             512
321 #define OCFS2_MAX_BLOCKSIZE             4096
322
323 #define OCFS2_SUPER_BLOCK_BLKNO         2
324
325 #define OCFS2_SUPER_BLOCK_SIGNATURE     "OCFSV2"
326
327 struct oracle_asm_disk_label {
328         char dummy[32];
329         char dl_tag[8];
330         char dl_id[24];
331 };
332
333 #define ORACLE_ASM_DISK_LABEL_MARKED    "ORCLDISK"
334 #define ORACLE_ASM_DISK_LABEL_OFFSET    32
335
336 struct iso_volume_descriptor {
337         unsigned char   vd_type;
338         unsigned char   vd_id[5];
339         unsigned char   vd_version;
340         unsigned char   flags;
341         unsigned char   system_id[32];
342         unsigned char   volume_id[32];
343         unsigned char   unused[8];
344         unsigned char   space_size[8];
345         unsigned char   escape_sequences[8];
346 };
347
348 /*
349  * Byte swap functions
350  */
351 #ifdef __GNUC__
352 #define _INLINE_ static __inline__
353 #else                           /* For Watcom C */
354 #define _INLINE_ static inline
355 #endif
356
357 static __u16 blkid_swab16(__u16 val);
358 static __u32 blkid_swab32(__u32 val);
359 static __u64 blkid_swab64(__u64 val);
360
361 #if ((defined __GNUC__) && \
362      (defined(__i386__) || defined(__i486__) || defined(__i586__)))
363
364 #define _BLKID_HAVE_ASM_BITOPS_
365
366 _INLINE_ __u32 blkid_swab32(__u32 val)
367 {
368 #ifdef EXT2FS_REQUIRE_486
369         __asm__("bswap %0" : "=r" (val) : "0" (val));
370 #else
371         __asm__("xchgb %b0,%h0\n\t"     /* swap lower bytes     */
372                 "rorl $16,%0\n\t"       /* swap words           */
373                 "xchgb %b0,%h0"         /* swap higher bytes    */
374                 :"=q" (val)
375                 : "0" (val));
376 #endif
377         return val;
378 }
379
380 _INLINE_ __u16 blkid_swab16(__u16 val)
381 {
382         __asm__("xchgb %b0,%h0"         /* swap bytes           */ \
383                 : "=q" (val) \
384                 :  "0" (val)); \
385                 return val;
386 }
387
388 _INLINE_ __u64 blkid_swab64(__u64 val)
389 {
390         return (blkid_swab32(val >> 32) |
391                 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
392 }
393 #endif
394
395 #if !defined(_BLKID_HAVE_ASM_BITOPS_)
396
397 _INLINE_  __u16 blkid_swab16(__u16 val)
398 {
399         return (val >> 8) | (val << 8);
400 }
401
402 _INLINE_ __u32 blkid_swab32(__u32 val)
403 {
404         return ((val>>24) | ((val>>8)&0xFF00) |
405                 ((val<<8)&0xFF0000) | (val<<24));
406 }
407
408 _INLINE_ __u64 blkid_swab64(__u64 val)
409 {
410         return (blkid_swab32(val >> 32) |
411                 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
412 }
413 #endif 
414
415
416
417 #if  __BYTE_ORDER == __BIG_ENDIAN
418 #define blkid_le16(x) blkid_swab16(x)
419 #define blkid_le32(x) blkid_swab32(x)
420 #define blkid_le64(x) blkid_swab64(x)
421 #define blkid_be16(x) (x)
422 #define blkid_be32(x) (x)
423 #define blkid_be64(x) (x)
424 #else
425 #define blkid_le16(x) (x)
426 #define blkid_le32(x) (x)
427 #define blkid_le64(x) (x)
428 #define blkid_be16(x) blkid_swab16(x)
429 #define blkid_be32(x) blkid_swab32(x)
430 #define blkid_be64(x) blkid_swab64(x)
431 #endif
432
433 #undef _INLINE_
434
435 #endif /* _BLKID_PROBE_H */