Logo Search packages:      
Sourcecode: ldiskfsprogs version File versions  Download package

probe.h

/*
 * probe.h - constants and on-disk structures for extracting device data
 *
 * Copyright (C) 1999 by Andries Brouwer
 * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
 * Copyright (C) 2001 by Andreas Dilger
 *
 * %Begin-Header%
 * This file may be redistributed under the terms of the
 * GNU Lesser General Public License.
 * %End-Header%
 */

#ifndef _BLKID_PROBE_H
#define _BLKID_PROBE_H

#include <blkid/blkid_types.h>

struct blkid_magic;

#define SB_BUFFER_SIZE        0x11000

struct blkid_probe {
      int               fd;
      blkid_cache       cache;
      blkid_dev         dev;
      unsigned char           *sbbuf;
      size_t                  sb_valid;
      unsigned char           *buf;
      size_t                  buf_max;
};

typedef int (*blkid_probe_t)(struct blkid_probe *probe, 
                       struct blkid_magic *id, unsigned char *buf);

struct blkid_magic {
      const char  *bim_type;  /* type name for this magic */
      long        bim_kboff;  /* kilobyte offset of superblock */
      unsigned    bim_sboff;  /* byte offset within superblock */
      unsigned    bim_len;    /* length of magic */
      const char  *bim_magic; /* magic string */
      blkid_probe_t     bim_probe;  /* probe function */
};

/*
 * Structures for each of the content types we want to extract information
 * from.  We do not necessarily need the magic field here, because we have
 * already identified the content type before we get this far.  It may still
 * be useful if there are probe functions which handle multiple content types.
 */
struct ext2_super_block {
      __u32       s_inodes_count;
      __u32       s_blocks_count;
      __u32       s_r_blocks_count;
      __u32       s_free_blocks_count;
      __u32       s_free_inodes_count;
      __u32       s_first_data_block;
      __u32       s_log_block_size;
      __u32       s_dummy3[7];
      unsigned char     s_magic[2];
      __u16       s_state;
      __u32       s_dummy5[8];
      __u32       s_feature_compat;
      __u32       s_feature_incompat;
      __u32       s_feature_ro_compat;
      unsigned char   s_uuid[16];
      char     s_volume_name[16];
      char  s_last_mounted[64];
      __u32 s_algorithm_usage_bitmap;
      __u8  s_prealloc_blocks;
      __u8  s_prealloc_dir_blocks;
      __u16 s_reserved_gdt_blocks;
      __u8  s_journal_uuid[16];
      __u32 s_journal_inum;
      __u32 s_journal_dev;
      __u32 s_last_orphan;
      __u32 s_hash_seed[4];
      __u8  s_def_hash_version;
      __u8  s_jnl_backup_type;
      __u16 s_reserved_word_pad;
      __u32 s_default_mount_opts;
      __u32 s_first_meta_bg;
      __u32 s_mkfs_time;
      __u32 s_jnl_blocks[17];
      __u32 s_blocks_count_hi;
      __u32 s_r_blocks_count_hi;
      __u32 s_free_blocks_hi;
      __u16 s_min_extra_isize;
      __u16 s_want_extra_isize;
      __u32 s_flags;
      __u16   s_raid_stride;
      __u16   s_mmp_interval;
      __u64   s_mmp_block;
      __u32   s_raid_stripe_width;
      __u32   s_reserved[163];
};

/* for s_flags */
#define EXT2_FLAGS_TEST_FILESYS           0x0004

/* for s_feature_compat */
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL         0x0004

/* for s_feature_ro_compat */
#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER     0x0001
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR  0x0004
#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE  0x0008
#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM         0x0010
#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK  0x0020
#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE      0x0040

/* for s_feature_incompat */
#define EXT2_FEATURE_INCOMPAT_FILETYPE          0x0002
#define EXT3_FEATURE_INCOMPAT_RECOVER           0x0004
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
#define EXT2_FEATURE_INCOMPAT_META_BG           0x0010
#define EXT4_FEATURE_INCOMPAT_EXTENTS           0x0040 /* extents support */
#define EXT4_FEATURE_INCOMPAT_64BIT       0x0080
#define EXT4_FEATURE_INCOMPAT_MMP         0x0100
#define EXT4_FEATURE_INCOMPAT_FLEX_BG           0x0200

#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                               EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
                               EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
#define EXT2_FEATURE_INCOMPAT_SUPP  (EXT2_FEATURE_INCOMPAT_FILETYPE| \
                               EXT2_FEATURE_INCOMPAT_META_BG)
#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP
#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED      ~EXT2_FEATURE_RO_COMPAT_SUPP

#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                               EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
                               EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
#define EXT3_FEATURE_INCOMPAT_SUPP  (EXT2_FEATURE_INCOMPAT_FILETYPE| \
                               EXT3_FEATURE_INCOMPAT_RECOVER| \
                               EXT2_FEATURE_INCOMPAT_META_BG)
#define EXT3_FEATURE_INCOMPAT_UNSUPPORTED ~EXT3_FEATURE_INCOMPAT_SUPP
#define EXT3_FEATURE_RO_COMPAT_UNSUPPORTED      ~EXT3_FEATURE_RO_COMPAT_SUPP


struct xfs_super_block {
      unsigned char     xs_magic[4];
      __u32       xs_blocksize;
      __u64       xs_dblocks;
      __u64       xs_rblocks;
      __u32       xs_dummy1[2];
      unsigned char     xs_uuid[16];
      __u32       xs_dummy2[15];
      char        xs_fname[12];
      __u32       xs_dummy3[2];
      __u64       xs_icount;
      __u64       xs_ifree;
      __u64       xs_fdblocks;
};

struct reiserfs_super_block {
      __u32       rs_blocks_count;
      __u32       rs_free_blocks;
      __u32       rs_root_block;
      __u32       rs_journal_block;
      __u32       rs_journal_dev;
      __u32       rs_orig_journal_size;
      __u32       rs_dummy2[5];
      __u16       rs_blocksize;
      __u16       rs_dummy3[3];
      unsigned char     rs_magic[12];
      __u32       rs_dummy4[5];
      unsigned char     rs_uuid[16];
      char        rs_label[16];
};

struct reiser4_super_block {
      unsigned char     rs4_magic[16];
      __u16       rs4_dummy[2];
      unsigned char     rs4_uuid[16];
      unsigned char     rs4_label[16];
      __u64       rs4_dummy2;
};

struct jfs_super_block {
      unsigned char     js_magic[4];
      __u32       js_version;
      __u64       js_size;
      __u32       js_bsize;
      __u32       js_dummy1;
      __u32       js_pbsize;
      __u32       js_dummy2[27];
      unsigned char     js_uuid[16];
      unsigned char     js_label[16];
      unsigned char     js_loguuid[16];
};

struct romfs_super_block {
      unsigned char     ros_magic[8];
      __u32       ros_dummy1[2];
      unsigned char     ros_volume[16];
};

struct cramfs_super_block {
      __u8        magic[4];
      __u32       size;
      __u32       flags;
      __u32       future;
      __u8        signature[16];
      struct cramfs_info {
            __u32       crc;
            __u32       edition;
            __u32       blocks;
            __u32       files;
      } info;
      __u8        name[16];
};

struct swap_id_block {
/*    unsigned char     sws_boot[1024]; */
      __u32       sws_version;
      __u32       sws_lastpage;
      __u32       sws_nrbad;
      unsigned char     sws_uuid[16];
      char        sws_volume[16];
      unsigned char     sws_pad[117];
      __u32       sws_badpg;
};

/* Yucky misaligned values */
struct vfat_super_block {
/* 00*/     unsigned char     vs_ignored[3];
/* 03*/     unsigned char     vs_sysid[8];
/* 0b*/     unsigned char     vs_sector_size[2];
/* 0d*/     __u8        vs_cluster_size;
/* 0e*/     __u16       vs_reserved;
/* 10*/     __u8        vs_fats;
/* 11*/     unsigned char     vs_dir_entries[2];
/* 13*/     unsigned char     vs_sectors[2];
/* 15*/     unsigned char     vs_media;
/* 16*/     __u16       vs_fat_length;
/* 18*/     __u16       vs_secs_track;
/* 1a*/     __u16       vs_heads;
/* 1c*/     __u32       vs_hidden;
/* 20*/     __u32       vs_total_sect;
/* 24*/     __u32       vs_fat32_length;
/* 28*/     __u16       vs_flags;
/* 2a*/     __u8        vs_version[2];
/* 2c*/     __u32       vs_root_cluster;
/* 30*/     __u16       vs_insfo_sector;
/* 32*/     __u16       vs_backup_boot;
/* 34*/     __u16       vs_reserved2[6];
/* 40*/     unsigned char     vs_unknown[3];
/* 43*/     unsigned char     vs_serno[4];
/* 47*/     unsigned char     vs_label[11];
/* 52*/     unsigned char   vs_magic[8];
/* 5a*/     unsigned char     vs_dummy2[164];
/*1fe*/     unsigned char     vs_pmagic[2];
};

/* Yucky misaligned values */
struct msdos_super_block {
/* 00*/     unsigned char     ms_ignored[3];
/* 03*/     unsigned char     ms_sysid[8];
/* 0b*/     unsigned char     ms_sector_size[2];
/* 0d*/     __u8        ms_cluster_size;
/* 0e*/     __u16       ms_reserved;
/* 10*/     __u8        ms_fats;
/* 11*/     unsigned char     ms_dir_entries[2];
/* 13*/     unsigned char     ms_sectors[2];
/* 15*/     unsigned char     ms_media;
/* 16*/     __u16       ms_fat_length;
/* 18*/     __u16       ms_secs_track;
/* 1a*/     __u16       ms_heads;
/* 1c*/     __u32       ms_hidden;
/* 20*/     __u32       ms_total_sect;
/* 24*/     unsigned char     ms_unknown[3];
/* 27*/     unsigned char     ms_serno[4];
/* 2b*/     unsigned char     ms_label[11];
/* 36*/     unsigned char   ms_magic[8];
/* 3d*/     unsigned char     ms_dummy2[192];
/*1fe*/     unsigned char     ms_pmagic[2];
};

struct vfat_dir_entry {
      __u8  name[11];
      __u8  attr;
      __u16 time_creat;
      __u16 date_creat;
      __u16 time_acc;
      __u16 date_acc;
      __u16 cluster_high;
      __u16 time_write;
      __u16 date_write;
      __u16 cluster_low;
      __u32 size;
};

/* maximum number of clusters */
#define FAT12_MAX 0xFF4
#define FAT16_MAX 0xFFF4
#define FAT32_MAX 0x0FFFFFF6

struct minix_super_block {
      __u16       ms_ninodes;
      __u16       ms_nzones;
      __u16       ms_imap_blocks;
      __u16       ms_zmap_blocks;
      __u16       ms_firstdatazone;
      __u16       ms_log_zone_size;
      __u32       ms_max_size;
      unsigned char     ms_magic[2];
      __u16       ms_state;
      __u32       ms_zones;
};

struct mdp_superblock_s {
      __u32 md_magic;
      __u32 major_version;
      __u32 minor_version;
      __u32 patch_version;
      __u32 gvalid_words;
      __u32 set_uuid0;
      __u32 ctime;
      __u32 level;
      __u32 size;
      __u32 nr_disks;
      __u32 raid_disks;
      __u32 md_minor;
      __u32 not_persistent;
      __u32 set_uuid1;
      __u32 set_uuid2;
      __u32 set_uuid3;
};

struct hfs_super_block {
      char  h_magic[2];
      char  h_dummy[18];
      __u32 h_blksize;
};

struct ocfs_volume_header {
      unsigned char     minor_version[4];
      unsigned char     major_version[4];
      unsigned char     signature[128];
      char        mount[128];
      unsigned char   mount_len[2];
};

struct ocfs_volume_label {
      unsigned char     disk_lock[48];
      char        label[64];  
      unsigned char     label_len[2];
      unsigned char  vol_id[16];
      unsigned char  vol_id_len[2];
};

#define ocfsmajor(o) ((__u32)o.major_version[0] \
                   + (((__u32) o.major_version[1]) << 8) \
                   + (((__u32) o.major_version[2]) << 16) \
                   + (((__u32) o.major_version[3]) << 24))
#define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8))
#define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8))

#define OCFS_MAGIC "OracleCFS"

struct ocfs2_super_block {
      unsigned char  signature[8];
      unsigned char  s_dummy1[184];
      unsigned char  s_dummy2[80];
      char         s_label[64];
      unsigned char  s_uuid[16];
};

#define OCFS2_MIN_BLOCKSIZE             512
#define OCFS2_MAX_BLOCKSIZE             4096

#define OCFS2_SUPER_BLOCK_BLKNO         2

#define OCFS2_SUPER_BLOCK_SIGNATURE     "OCFSV2"

struct oracle_asm_disk_label {
      char dummy[32];
      char dl_tag[8];
      char dl_id[24];
};

#define ORACLE_ASM_DISK_LABEL_MARKED    "ORCLDISK"
#define ORACLE_ASM_DISK_LABEL_OFFSET    32

struct iso_volume_descriptor {
      unsigned char     vd_type;
      unsigned char     vd_id[5];
      unsigned char     vd_version;
      unsigned char     flags;
      unsigned char     system_id[32];
      unsigned char     volume_id[32];
      unsigned char     unused[8];
      unsigned char     space_size[8];
      unsigned char     escape_sequences[8];
};

/* Common gfs/gfs2 constants: */
#define GFS_MAGIC               0x01161970
#define GFS_DEFAULT_BSIZE       4096
#define GFS_SUPERBLOCK_OFFSET (0x10 * GFS_DEFAULT_BSIZE)
#define GFS_METATYPE_SB         1
#define GFS_FORMAT_SB           100
#define GFS_LOCKNAME_LEN        64

/* gfs1 constants: */
#define GFS_FORMAT_FS           1309
#define GFS_FORMAT_MULTI        1401
/* gfs2 constants: */
#define GFS2_FORMAT_FS          1801
#define GFS2_FORMAT_MULTI       1900

struct gfs2_meta_header {
      __u32 mh_magic;
      __u32 mh_type;
      __u64 __pad0;          /* Was generation number in gfs1 */
      __u32 mh_format;
      __u32 __pad1;          /* Was incarnation number in gfs1 */
};

struct gfs2_inum {
      __u64 no_formal_ino;
      __u64 no_addr;
};

struct gfs2_sb {
      struct gfs2_meta_header sb_header;

      __u32 sb_fs_format;
      __u32 sb_multihost_format;
      __u32  __pad0;  /* Was superblock flags in gfs1 */
      
      __u32 sb_bsize;
      __u32 sb_bsize_shift;
      __u32 __pad1;   /* Was journal segment size in gfs1 */
      
      struct gfs2_inum sb_master_dir; /* Was jindex dinode in gfs1 */
      struct gfs2_inum __pad2; /* Was rindex dinode in gfs1 */
      struct gfs2_inum sb_root_dir;
      
      char sb_lockproto[GFS_LOCKNAME_LEN];
      char sb_locktable[GFS_LOCKNAME_LEN];
      /* In gfs1, quota and license dinodes followed */
};

struct ntfs_super_block {
      __u8  jump[3];
      __u8  oem_id[8];
      __u8  bios_parameter_block[25];
      __u16 unused[2];
      __u64 number_of_sectors;
      __u64 mft_cluster_location;
      __u64 mft_mirror_cluster_location;
      __s8  cluster_per_mft_record;
      __u8  reserved1[3];
      __s8  cluster_per_index_record;
      __u8  reserved2[3];
      __u64 volume_serial;
      __u16 checksum;
};

struct master_file_table_record {
      __u32 magic;
      __u16 usa_ofs;
      __u16 usa_count;
      __u64 lsn;
      __u16 sequence_number;
      __u16 link_count;
      __u16 attrs_offset;
      __u16 flags;
      __u32 bytes_in_use;
      __u32 bytes_allocated;
} __attribute__((__packed__));

struct file_attribute {
      __u32 type;
      __u32 len;
      __u8  non_resident;
      __u8  name_len;
      __u16 name_offset;
      __u16 flags;
      __u16 instance;
      __u32 value_len;
      __u16 value_offset;
} __attribute__((__packed__));

#define MFT_RECORD_VOLUME                 3
#define MFT_RECORD_ATTR_VOLUME_NAME       0x60
#define MFT_RECORD_ATTR_VOLUME_INFO       0x70
#define MFT_RECORD_ATTR_OBJECT_ID         0x40
#define MFT_RECORD_ATTR_END               0xffffffffu

/* HFS / HFS+ */
struct hfs_finder_info {
        __u32        boot_folder;
        __u32        start_app;
        __u32        open_folder;
        __u32        os9_folder;
        __u32        reserved;
        __u32        osx_folder;
        __u8         id[8];
} __attribute__((packed));

struct hfs_mdb {
        __u8         signature[2];
        __u32        cr_date;
        __u32        ls_Mod;
        __u16        atrb;
        __u16        nm_fls;
        __u16        vbm_st;
        __u16        alloc_ptr;
        __u16        nm_al_blks;
        __u32        al_blk_size;
        __u32        clp_size;
        __u16        al_bl_st;
        __u32        nxt_cnid;
        __u16        free_bks;
        __u8         label_len;
        __u8         label[27];
        __u32        vol_bkup;
        __u16        vol_seq_num;
        __u32        wr_cnt;
        __u32        xt_clump_size;
        __u32        ct_clump_size;
        __u16        num_root_dirs;
        __u32        file_count;
        __u32        dir_count;
        struct hfs_finder_info finder_info;
        __u8         embed_sig[2];
        __u16        embed_startblock;
        __u16        embed_blockcount;
} __attribute__((packed));

/* this is lvm's label_header & pv_header combined. */

#define LVM2_ID_LEN 32

struct lvm2_pv_label_header {
      /* label_header */
      __u8  id[8];            /* LABELONE */
      __u64 sector_xl;  /* Sector number of this label */
      __u32 crc_xl;           /* From next field to end of sector */
      __u32 offset_xl;  /* Offset from start of struct to contents */
      __u8  type[8];    /* LVM2 001 */
      /* pv_header */
      __u8  pv_uuid[LVM2_ID_LEN];
} __attribute__ ((packed));

/*
 * Byte swap functions
 */
#ifdef __GNUC__
#define _INLINE_ static __inline__
#else                   /* For Watcom C */
#define _INLINE_ static inline
#endif

static __u16 blkid_swab16(__u16 val);
static __u32 blkid_swab32(__u32 val);
static __u64 blkid_swab64(__u64 val);

#if ((defined __GNUC__) && \
     (defined(__i386__) || defined(__i486__) || defined(__i586__)))

#define _BLKID_HAVE_ASM_BITOPS_

_INLINE_ __u32 blkid_swab32(__u32 val)
{
#ifdef EXT2FS_REQUIRE_486
      __asm__("bswap %0" : "=r" (val) : "0" (val));
#else
      __asm__("xchgb %b0,%h0\n\t"   /* swap lower bytes     */
            "rorl $16,%0\n\t" /* swap words           */
            "xchgb %b0,%h0"         /* swap higher bytes    */
            :"=q" (val)
            : "0" (val));
#endif
      return val;
}

_INLINE_ __u16 blkid_swab16(__u16 val)
{
      __asm__("xchgb %b0,%h0"       /* swap bytes           */ \
            : "=q" (val) \
            :  "0" (val)); \
            return val;
}

_INLINE_ __u64 blkid_swab64(__u64 val)
{
      return (blkid_swab32(val >> 32) |
            (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
}
#endif

#if !defined(_BLKID_HAVE_ASM_BITOPS_)

_INLINE_  __u16 blkid_swab16(__u16 val)
{
      return (val >> 8) | (val << 8);
}

_INLINE_ __u32 blkid_swab32(__u32 val)
{
      return ((val>>24) | ((val>>8)&0xFF00) |
            ((val<<8)&0xFF0000) | (val<<24));
}

_INLINE_ __u64 blkid_swab64(__u64 val)
{
      return (blkid_swab32(val >> 32) |
            (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
}
#endif 



#ifdef WORDS_BIGENDIAN
#define blkid_le16(x) blkid_swab16(x)
#define blkid_le32(x) blkid_swab32(x)
#define blkid_le64(x) blkid_swab64(x)
#define blkid_be16(x) (x)
#define blkid_be32(x) (x)
#define blkid_be64(x) (x)
#else
#define blkid_le16(x) (x)
#define blkid_le32(x) (x)
#define blkid_le64(x) (x)
#define blkid_be16(x) blkid_swab16(x)
#define blkid_be32(x) blkid_swab32(x)
#define blkid_be64(x) blkid_swab64(x)
#endif

#undef _INLINE_

#endif /* _BLKID_PROBE_H */

Generated by  Doxygen 1.6.0   Back to index