probe.h revision bdc3514af41b5fbfea16c5192d5aade1da641cf4
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 19struct blkid_magic; 20 21#define SB_BUFFER_SIZE 0x11000 22 23struct 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 33typedef int (*blkid_probe_t)(struct blkid_probe *probe, 34 struct blkid_magic *id, unsigned char *buf); 35 36struct 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 */ 51struct 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 91struct 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 106struct 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 122struct 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 130struct 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 143struct romfs_super_block { 144 unsigned char ros_magic[8]; 145 __u32 ros_dummy1[2]; 146 unsigned char ros_volume[16]; 147}; 148 149struct 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 164struct 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 */ 176struct 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 */ 207struct 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 230struct 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 249struct 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 262struct 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 281struct hfs_super_block { 282 char h_magic[2]; 283 char h_dummy[18]; 284 __u32 h_blksize; 285}; 286 287struct 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 295struct 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 312struct 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 327struct 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 336struct 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 357static __u16 blkid_swab16(__u16 val); 358static __u32 blkid_swab32(__u32 val); 359static __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#ifdef WORDS_BIGENDIAN 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 */ 436