1 /*
   2  *  linux/include/linux/ext2_fs.h
   3  *
   4  * Copyright (C) 1992, 1993, 1994, 1995
   5  * Remy Card (card@masi.ibp.fr)
   6  * Laboratoire MASI - Institut Blaise Pascal
   7  * Universite Pierre et Marie Curie (Paris VI)
   8  *
   9  *  from
  10  *
  11  *  linux/include/linux/minix_fs.h
  12  *
  13  *  Copyright (C) 1991, 1992  Linus Torvalds
  14  */
  15 
  16 /*
  17  * EXT2_*_*() convienience macros added by Andrew Clausen <clausen@gnu.org>
  18  * Copyright (C) 2000 Free Software Foundation, Inc.
  19  */
  20 
  21 #ifndef _EXT2_FS_H
  22 #define _EXT2_FS_H
  23 
  24 #include <parted/endian.h>
  25 #include <stdint.h>
  26 
  27 /*
  28  * The second extended file system constants/structures
  29  */
  30 
  31 #define EXT2_SUPER_MAGIC_CONST  0xEF53
  32 #define EXT2_MIN_BLOCK_SIZE     1024
  33 #define EXT2_NDIR_BLOCKS        12
  34 #define EXT2_IND_BLOCK          EXT2_NDIR_BLOCKS
  35 #define EXT2_DIND_BLOCK         (EXT2_IND_BLOCK + 1)
  36 #define EXT2_TIND_BLOCK         (EXT2_DIND_BLOCK + 1)
  37 #define EXT2_N_BLOCKS           (EXT2_TIND_BLOCK + 1)
  38 #define EXT2_VALID_FS           0x0001
  39 #define EXT2_ERROR_FS           0x0002
  40 #define EXT2_RESERVED_INODE_COUNT       11
  41 
  42 /*
  43  * Codes for operating systems
  44  */
  45 #define EXT2_OS_LINUX           0
  46 #define EXT2_OS_HURD            1
  47 #define EXT2_OS_MASIX           2
  48 #define EXT2_OS_FREEBSD         3
  49 #define EXT2_OS_LITES           4
  50 
  51 /*
  52  * Feature set definitions
  53  */
  54 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL         0x0004
  55 #define EXT2_FEATURE_COMPAT_HAS_DIR_INDEX       0x0020
  56 
  57 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER     0x0001
  58 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE       0x0002
  59 
  60 #define EXT2_FEATURE_INCOMPAT_FILETYPE          0x0002
  61 #define EXT3_FEATURE_INCOMPAT_RECOVER           0x0004
  62 
  63 /*
  64  * Special inodes numbers
  65  */
  66 #define EXT2_BAD_INO             1      /* Bad blocks inode */
  67 #define EXT2_ROOT_INO            2      /* Root inode */
  68 #define EXT2_ACL_IDX_INO         3      /* ACL inode */
  69 #define EXT2_ACL_DATA_INO        4      /* ACL inode */
  70 #define EXT2_BOOT_LOADER_INO     5      /* Boot loader inode */
  71 #define EXT2_UNDEL_DIR_INO       6      /* Undelete directory inode */
  72 
  73 /*
  74  * Ext2 directory file types.  Only the low 3 bits are used.  The
  75  * other bits are reserved for now.
  76  */
  77 #define EXT2_FT_UNKNOWN         0
  78 #define EXT2_FT_REG_FILE        1
  79 #define EXT2_FT_DIR             2
  80 #define EXT2_FT_CHRDEV          3
  81 #define EXT2_FT_BLKDEV          4
  82 #define EXT2_FT_FIFO            5
  83 #define EXT2_FT_SOCK            6
  84 #define EXT2_FT_SYMLINK         7
  85 
  86 /*
  87  * Behaviour when detecting errors
  88  */
  89 #define EXT2_ERRORS_CONTINUE            1       /* Continue execution */
  90 #define EXT2_ERRORS_RO                  2       /* Remount fs read-only */
  91 #define EXT2_ERRORS_PANIC               3       /* Panic */
  92 #define EXT2_ERRORS_DEFAULT             EXT2_ERRORS_CONTINUE
  93 
  94 struct ext2_dir_entry_2
  95 {
  96         uint32_t        inode;
  97         uint16_t        rec_len;
  98         uint8_t         name_len;
  99         uint8_t         file_type;
 100         char            name[255];
 101 };
 102 
 103 struct ext2_group_desc
 104 {
 105         uint32_t        bg_block_bitmap;
 106         uint32_t        bg_inode_bitmap;
 107         uint32_t        bg_inode_table;
 108         uint16_t        bg_free_blocks_count;
 109         uint16_t        bg_free_inodes_count;
 110         uint16_t        bg_used_dirs_count;
 111         uint16_t        bg_pad;
 112         uint32_t        bg_reserved[3];
 113 };
 114 
 115 struct ext2_inode
 116 {
 117         uint16_t        i_mode;         /* File mode */
 118         uint16_t        i_uid;          /* Owner Uid */
 119         uint32_t        i_size;         /* Size in bytes */
 120         uint32_t        i_atime;        /* Access time */
 121         uint32_t        i_ctime;        /* Creation time */
 122         uint32_t        i_mtime;        /* Modification time */
 123         uint32_t        i_dtime;        /* Deletion Time */
 124         uint16_t        i_gid;          /* Group Id */
 125         uint16_t        i_links_count;  /* Links count */
 126         uint32_t        i_blocks;       /* Blocks count */
 127         uint32_t        i_flags;        /* File flags */
 128         union {
 129                 struct {
 130                         uint32_t        l_i_reserved1;
 131                 } linux1;
 132                 struct {
 133                         uint32_t        h_i_translator;
 134                 } hurd1;
 135                 struct {
 136                         uint32_t        m_i_reserved1;
 137                 } masix1;
 138         } osd1;                 /* OS dependent 1 */
 139         uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
 140         uint32_t        i_generation;   /* File version (for NFS) */
 141         uint32_t        i_file_acl;     /* File ACL */
 142         uint32_t        i_dir_acl;      /* Directory ACL */
 143         uint32_t        i_faddr;        /* Fragment address */
 144         union {
 145                 struct {
 146                         uint8_t         l_i_frag;       /* Fragment number */
 147                         uint8_t         l_i_fsize;      /* Fragment size */
 148                         uint16_t        i_pad1;
 149                         uint32_t        l_i_reserved2[2];
 150                 } linux2;
 151                 struct {
 152                         uint8_t         h_i_frag;       /* Fragment number */
 153                         uint8_t         h_i_fsize;      /* Fragment size */
 154                         uint16_t        h_i_mode_high;
 155                         uint16_t        h_i_uid_high;
 156                         uint16_t        h_i_gid_high;
 157                         uint32_t        h_i_author;
 158                 } hurd2;
 159                 struct {
 160                         uint8_t         m_i_frag;       /* Fragment number */
 161                         uint8_t         m_i_fsize;      /* Fragment size */
 162                         uint16_t        m_pad1;
 163                         uint32_t        m_i_reserved2[2];
 164                 } masix2;
 165         } osd2;                                 /* OS dependent 2 */
 166 };
 167 
 168 #define i_size_high     i_dir_acl
 169 
 170 struct ext2_super_block
 171 {
 172         uint32_t        s_inodes_count;         /* Inodes count */
 173         uint32_t        s_blocks_count;         /* Blocks count */
 174         uint32_t        s_r_blocks_count;       /* Reserved blocks count */
 175         uint32_t        s_free_blocks_count;    /* Free blocks count */
 176         uint32_t        s_free_inodes_count;    /* Free inodes count */
 177         uint32_t        s_first_data_block;     /* First Data Block */
 178         uint32_t        s_log_block_size;       /* Block size */
 179         int32_t         s_log_frag_size;        /* Fragment size */
 180         uint32_t        s_blocks_per_group;     /* # Blocks per group */
 181         uint32_t        s_frags_per_group;      /* # Fragments per group */
 182         uint32_t        s_inodes_per_group;     /* # Inodes per group */
 183         uint32_t        s_mtime;                /* Mount time */
 184         uint32_t        s_wtime;                /* Write time */
 185         uint16_t        s_mnt_count;            /* Mount count */
 186         int16_t         s_max_mnt_count;        /* Maximal mount count */
 187         uint16_t        s_magic;                /* Magic signature */
 188         uint16_t        s_state;                /* File system state */
 189         uint16_t        s_errors;               /* Behaviour when detecting errors */
 190         uint16_t        s_minor_rev_level;      /* minor revision level */
 191         uint32_t        s_lastcheck;            /* time of last check */
 192         uint32_t        s_checkinterval;        /* max. time between checks */
 193         uint32_t        s_creator_os;           /* OS */
 194         uint32_t        s_rev_level;            /* Revision level */
 195         uint16_t        s_def_resuid;           /* Default uid for reserved blocks */
 196         uint16_t        s_def_resgid;           /* Default gid for reserved blocks */
 197         /*
 198          * These fields are for EXT2_DYNAMIC_REV superblocks only.
 199          *
 200          * Note: the difference between the compatible feature set and
 201          * the incompatible feature set is that if there is a bit set
 202          * in the incompatible feature set that the kernel doesn't
 203          * know about, it should refuse to mount the file system.
 204          * 
 205          * e2fsck's requirements are more strict; if it doesn't know
 206          * about a feature in either the compatible or incompatible
 207          * feature set, it must abort and not try to meddle with
 208          * things it doesn't understand...
 209          */
 210         uint32_t        s_first_ino;            /* First non-reserved inode */
 211         uint16_t        s_inode_size;           /* size of inode structure */
 212         uint16_t        s_block_group_nr;       /* block group # of this superblock */
 213         uint32_t        s_feature_compat;       /* compatible feature set */
 214         uint32_t        s_feature_incompat;     /* incompatible feature set */
 215         uint32_t        s_feature_ro_compat;    /* readonly-compatible feature set */
 216         uint8_t         s_uuid[16];             /* 128-bit uuid for volume */
 217         char            s_volume_name[16];      /* volume name */
 218         char            s_last_mounted[64];     /* directory where last mounted */
 219         uint32_t        s_algorithm_usage_bitmap;  /* For compression */
 220         /*
 221          * Performance hints.  Directory preallocation should only
 222          * happen if the EXT2_COMPAT_PREALLOC flag is on.
 223          */
 224         uint8_t         s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
 225         uint8_t         s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
 226         uint16_t        s_padding1;
 227         /*
 228          * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
 229          */
 230         uint8_t         s_journal_uuid[16];     /* uuid of journal superblock */
 231         uint32_t        s_journal_inum;         /* inode number of journal file */
 232         uint32_t        s_journal_dev;          /* device number of journal file */
 233         uint32_t        s_last_orphan;          /* start of list of inodes to delete */
 234 
 235         uint32_t        s_reserved[197];        /* Padding to the end of the block */
 236 };
 237 
 238 #define EXT2_DIRENT_INODE(dir_ent)      (PED_LE32_TO_CPU((dir_ent).inode))
 239 #define EXT2_DIRENT_REC_LEN(dir_ent)    (PED_LE16_TO_CPU((dir_ent).rec_len))
 240 #define EXT2_DIRENT_NAME_LEN(dir_ent)   ((dir_ent).name_len)
 241 #define EXT2_DIRENT_FILE_TYPE(dir_ent)  ((dir_ent).file_type)
 242 
 243 #define EXT2_GROUP_BLOCK_BITMAP(gd)     (PED_LE32_TO_CPU((gd).bg_block_bitmap))
 244 #define EXT2_GROUP_INODE_BITMAP(gd)     (PED_LE32_TO_CPU((gd).bg_inode_bitmap))
 245 #define EXT2_GROUP_INODE_TABLE(gd)      (PED_LE32_TO_CPU((gd).bg_inode_table))
 246 #define EXT2_GROUP_FREE_BLOCKS_COUNT(gd) \
 247                 (PED_LE16_TO_CPU((gd).bg_free_blocks_count))
 248 #define EXT2_GROUP_FREE_INODES_COUNT(gd) \
 249                 (PED_LE16_TO_CPU((gd).bg_free_inodes_count))
 250 #define EXT2_GROUP_USED_DIRS_COUNT(gd) \
 251                 (PED_LE16_TO_CPU((gd).bg_used_dirs_count))
 252 
 253 #define EXT2_INODE_MODE(inode)          (PED_LE16_TO_CPU((inode).i_mode))
 254 #define EXT2_INODE_UID(inode)           (PED_LE16_TO_CPU((inode).i_uid))
 255 #define EXT2_INODE_SIZE(inode) \
 256         ((uint64_t) PED_LE32_TO_CPU((inode).i_size) \
 257         + ((uint64_t) PED_LE32_TO_CPU((inode).i_size_high) << 32))
 258 #define EXT2_INODE_ATIME(inode)         (PED_LE32_TO_CPU((inode).i_atime))
 259 #define EXT2_INODE_CTIME(inode)         (PED_LE32_TO_CPU((inode).i_ctime))
 260 #define EXT2_INODE_MTIME(inode)         (PED_LE32_TO_CPU((inode).i_mtime))
 261 #define EXT2_INODE_DTIME(inode)         (PED_LE32_TO_CPU((inode).i_dtime))
 262 #define EXT2_INODE_GID(inode)           (PED_LE16_TO_CPU((inode).i_gid))
 263 #define EXT2_INODE_LINKS_COUNT(inode)   (PED_LE16_TO_CPU((inode).i_links_count))
 264 #define EXT2_INODE_BLOCKS(inode)        (PED_LE32_TO_CPU((inode).i_blocks))
 265 #define EXT2_INODE_FLAGS(inode)         (PED_LE32_TO_CPU((inode).i_flags))
 266 #define EXT2_INODE_TRANSLATOR(inode)    (PED_LE32_TO_CPU((inode).osd1.hurd1.h_i_translator))
 267 #define EXT2_INODE_BLOCK(inode, blk)    (PED_LE32_TO_CPU((inode).i_block[blk]))
 268 
 269 #define EXT2_SUPER_INODES_COUNT(sb)     (PED_LE32_TO_CPU((sb).s_inodes_count))
 270 #define EXT2_SUPER_BLOCKS_COUNT(sb)     (PED_LE32_TO_CPU((sb).s_blocks_count))
 271 #define EXT2_SUPER_R_BLOCKS_COUNT(sb)   (PED_LE32_TO_CPU((sb).s_r_blocks_count))
 272 #define EXT2_SUPER_FREE_BLOCKS_COUNT(sb) \
 273                 (PED_LE32_TO_CPU((sb).s_free_blocks_count))
 274 #define EXT2_SUPER_FREE_INODES_COUNT(sb) \
 275                 (PED_LE32_TO_CPU((sb).s_free_inodes_count))
 276 #define EXT2_SUPER_FIRST_DATA_BLOCK(sb) \
 277                 (PED_LE32_TO_CPU((sb).s_first_data_block))
 278 #define EXT2_SUPER_LOG_BLOCK_SIZE(sb)   (PED_LE32_TO_CPU((sb).s_log_block_size))
 279 #define EXT2_SUPER_LOG_FRAG_SIZE(sb) \
 280                 ((int32_t) PED_LE32_TO_CPU((sb).s_log_frag_size))
 281 #define EXT2_SUPER_BLOCKS_PER_GROUP(sb) \
 282                 (PED_LE32_TO_CPU((sb).s_blocks_per_group))
 283 #define EXT2_SUPER_FRAGS_PER_GROUP(sb) \
 284         (PED_LE32_TO_CPU((sb).s_frags_per_group))
 285 #define EXT2_SUPER_INODES_PER_GROUP(sb) \
 286         (PED_LE32_TO_CPU((sb).s_inodes_per_group))
 287 #define EXT2_SUPER_MTIME(sb)            (PED_LE32_TO_CPU((sb).s_mtime))
 288 #define EXT2_SUPER_WTIME(sb)            (PED_LE32_TO_CPU((sb).s_wtime))
 289 #define EXT2_SUPER_MNT_COUNT(sb)        (PED_LE16_TO_CPU((sb).s_mnt_count))
 290 #define EXT2_SUPER_MAX_MNT_COUNT(sb) \
 291                 ((int16_t) PED_LE16_TO_CPU((sb).s_max_mnt_count))
 292 #define EXT2_SUPER_MAGIC(sb)            (PED_LE16_TO_CPU((sb).s_magic))
 293 #define EXT2_SUPER_STATE(sb)            (PED_LE16_TO_CPU((sb).s_state))
 294 #define EXT2_SUPER_ERRORS(sb)           (PED_LE16_TO_CPU((sb).s_errors))
 295 #define EXT2_SUPER_MINOR_REV_LEVEL(sb) \
 296                 (PED_LE16_TO_CPU((sb).s_minor_rev_level))
 297 #define EXT2_SUPER_LASTCHECK(sb)        (PED_LE32_TO_CPU((sb).s_lastcheck))
 298 #define EXT2_SUPER_CHECKINTERVAL(sb)    (PED_LE32_TO_CPU((sb).s_checkinterval))
 299 #define EXT2_SUPER_CREATOR_OS(sb)       (PED_LE32_TO_CPU((sb).s_creator_os))
 300 #define EXT2_SUPER_REV_LEVEL(sb)        (PED_LE32_TO_CPU((sb).s_rev_level))
 301 #define EXT2_SUPER_DEF_RESUID(sb)       (PED_LE16_TO_CPU((sb).s_def_resuid))
 302 #define EXT2_SUPER_DEF_RESGID(sb)       (PED_LE16_TO_CPU((sb).s_def_resgid))
 303 
 304 #define EXT2_SUPER_FIRST_INO(sb)        (PED_LE32_TO_CPU((sb).s_first_ino))
 305 #define EXT2_SUPER_INODE_SIZE(sb)       (PED_LE16_TO_CPU((sb).s_inode_size))
 306 #define EXT2_SUPER_BLOCK_GROUP_NR(sb)   (PED_LE16_TO_CPU((sb).s_block_group_nr))
 307 #define EXT2_SUPER_FEATURE_COMPAT(sb)   (PED_LE32_TO_CPU((sb).s_feature_compat))
 308 #define EXT2_SUPER_FEATURE_INCOMPAT(sb) \
 309                 (PED_LE32_TO_CPU((sb).s_feature_incompat))
 310 #define EXT2_SUPER_FEATURE_RO_COMPAT(sb) \
 311                 (PED_LE32_TO_CPU((sb).s_feature_ro_compat))
 312 #define EXT2_SUPER_UUID(sb)             ((sb).s_uuid)
 313 #define EXT2_SUPER_VOLUME_NAME(sb)      ((sb).s_volume_name)
 314 #define EXT2_SUPER_LAST_MOUNTED(sb)     ((sb).s_last_mounted)
 315 #define EXT2_SUPER_ALGORITHM_USAGE_BITMAP(sb) \
 316                 (PED_LE32_TO_CPU((sb).s_algorithm_usage_bitmap))
 317 
 318 #define EXT2_SUPER_JOURNAL_UUID(sb)     ((sb).s_journal_uuid)
 319 #define EXT2_SUPER_JOURNAL_INUM(sb)     (PED_LE32_TO_CPU((sb).s_journal_inum))
 320 #define EXT2_SUPER_JOURNAL_DEV(sb)      (PED_LE32_TO_CPU((sb).s_journal_dev))
 321 #define EXT2_SUPER_LAST_ORPHAN(sb)      (PED_LE32_TO_CPU((sb).s_last_orphan))
 322 
 323 #endif