LCOV - code coverage report
Current view: top level - ufs/ext2fs - ext2fs.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 12 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: ext2fs.h,v 1.23 2016/04/27 11:27:24 krw Exp $ */
       2             : /*      $NetBSD: ext2fs.h,v 1.10 2000/01/28 16:00:23 bouyer Exp $       */
       3             : 
       4             : /*
       5             :  * Copyright (c) 1997 Manuel Bouyer.
       6             :  * Copyright (c) 1982, 1986, 1993
       7             :  *      The Regents of the University of California.  All rights reserved.
       8             :  *
       9             :  * Redistribution and use in source and binary forms, with or without
      10             :  * modification, are permitted provided that the following conditions
      11             :  * are met:
      12             :  * 1. Redistributions of source code must retain the above copyright
      13             :  *    notice, this list of conditions and the following disclaimer.
      14             :  * 2. Redistributions in binary form must reproduce the above copyright
      15             :  *    notice, this list of conditions and the following disclaimer in the
      16             :  *    documentation and/or other materials provided with the distribution.
      17             :  * 3. Neither the name of the University nor the names of its contributors
      18             :  *    may be used to endorse or promote products derived from this software
      19             :  *    without specific prior written permission.
      20             :  *
      21             :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      22             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      25             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31             :  * SUCH DAMAGE.
      32             :  *
      33             :  *      @(#)fs.h        8.10 (Berkeley) 10/27/94
      34             :  *  Modified for ext2fs by Manuel Bouyer.
      35             :  */
      36             : 
      37             : #include <sys/endian.h>
      38             : 
      39             : /*
      40             :  * Each disk drive contains some number of file systems.
      41             :  * A file system consists of a number of cylinder groups.
      42             :  * Each cylinder group has inodes and data.
      43             :  *
      44             :  * A file system is described by its super-block, which in turn
      45             :  * describes the cylinder groups.  The super-block is critical
      46             :  * data and is replicated in each cylinder group to protect against
      47             :  * catastrophic loss.  This is done at `newfs' time and the critical
      48             :  * super-block data does not change, so the copies need not be
      49             :  * referenced further unless disaster strikes.
      50             :  *
      51             :  * The first boot and super blocks are given in absolute disk addresses.
      52             :  * The byte-offset forms are preferred, as they don't imply a sector size.
      53             :  */
      54             : #define BBSIZE          1024
      55             : #define SBSIZE          1024
      56             : #define BBOFF           ((off_t)(0))
      57             : #define SBOFF           ((off_t)(BBOFF + BBSIZE))
      58             : #define BBLOCK          ((daddr_t)(0))
      59             : #define SBLOCK          ((daddr_t)(BBLOCK + BBSIZE / DEV_BSIZE))
      60             : 
      61             : /*
      62             :  * Inodes are, like in UFS, 32-bit unsigned integers and therefore ufsino_t.
      63             :  * Disk blocks are 32-bit, if the filesystem isn't operating in 64-bit mode
      64             :  * (the incompatible ext4 64BIT flag).  More work is needed to properly use
      65             :  * daddr_t as the disk block data type on both BE and LE architectures.
      66             :  * XXX disk blocks are simply u_int32_t for now.
      67             :  */
      68             : 
      69             : /*
      70             :  * MINBSIZE is the smallest allowable block size.
      71             :  * MINBSIZE must be big enough to hold a cylinder group block,
      72             :  * thus changes to (struct cg) must keep its size within MINBSIZE.
      73             :  * Note that super blocks are always of size SBSIZE,
      74             :  * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE.
      75             :  * FSIZE means fragment size.
      76             :  */
      77             : #define LOG_MINBSIZE    10
      78             : #define MINBSIZE        (1 << LOG_MINBSIZE)
      79             : #define LOG_MINFSIZE    10
      80             : #define MINFSIZE        (1 << LOG_MINFSIZE)
      81             : 
      82             : /*
      83             :  * The path name on which the file system is mounted is maintained
      84             :  * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in
      85             :  * the super block for this name.
      86             :  */
      87             : #define MAXMNTLEN       512
      88             : 
      89             : /*
      90             :  * MINFREE gives the minimum acceptable percentage of file system
      91             :  * blocks which may be free. If the freelist drops below this level
      92             :  * only the superuser may continue to allocate blocks. This may
      93             :  * be set to 0 if no reserve of free blocks is deemed necessary,
      94             :  * however throughput drops by fifty percent if the file system
      95             :  * is run at between 95% and 100% full; thus the minimum default
      96             :  * value of fs_minfree is 5%. However, to get good clustering
      97             :  * performance, 10% is a better choice. hence we use 10% as our
      98             :  * default value. With 10% free space, fragmentation is not a
      99             :  * problem, so we choose to optimize for time.
     100             :  */
     101             : #define MINFREE         5
     102             : 
     103             : /*
     104             :  * Super block for an ext2fs file system.
     105             :  */
     106             : struct ext2fs {
     107             :         u_int32_t  e2fs_icount;         /* Inode count */
     108             :         u_int32_t  e2fs_bcount;         /* blocks count */
     109             :         u_int32_t  e2fs_rbcount;        /* reserved blocks count */
     110             :         u_int32_t  e2fs_fbcount;        /* free blocks count */
     111             :         u_int32_t  e2fs_ficount;        /* free inodes count */
     112             :         u_int32_t  e2fs_first_dblock;   /* first data block */
     113             :         u_int32_t  e2fs_log_bsize;      /* block size = 1024*(2^e2fs_log_bsize) */
     114             :         u_int32_t  e2fs_log_fsize;      /* fragment size log2 */
     115             :         u_int32_t  e2fs_bpg;            /* blocks per group */
     116             :         u_int32_t  e2fs_fpg;            /* frags per group */
     117             :         u_int32_t  e2fs_ipg;            /* inodes per group */
     118             :         u_int32_t  e2fs_mtime;          /* mount time */
     119             :         u_int32_t  e2fs_wtime;          /* write time */
     120             :         u_int16_t  e2fs_mnt_count;      /* mount count */
     121             :         u_int16_t  e2fs_max_mnt_count;  /* max mount count */
     122             :         u_int16_t  e2fs_magic;          /* magic number */
     123             :         u_int16_t  e2fs_state;          /* file system state */
     124             :         u_int16_t  e2fs_beh;            /* behavior on errors */
     125             :         u_int16_t  e2fs_minrev;         /* minor revision level */
     126             :         u_int32_t  e2fs_lastfsck;       /* time of last fsck */
     127             :         u_int32_t  e2fs_fsckintv;       /* max time between fscks */
     128             :         u_int32_t  e2fs_creator;        /* creator OS */
     129             :         u_int32_t  e2fs_rev;            /* revision level */
     130             :         u_int16_t  e2fs_ruid;           /* default uid for reserved blocks */
     131             :         u_int16_t  e2fs_rgid;           /* default gid for reserved blocks */
     132             :         /* EXT2_DYNAMIC_REV superblocks */
     133             :         u_int32_t  e2fs_first_ino;      /* first non-reserved inode */
     134             :         u_int16_t  e2fs_inode_size;     /* size of inode structure */
     135             :         u_int16_t  e2fs_block_group_nr; /* block grp number of this sblk*/
     136             :         u_int32_t  e2fs_features_compat; /*  compatible feature set */
     137             :         u_int32_t  e2fs_features_incompat; /* incompatible feature set */
     138             :         u_int32_t  e2fs_features_rocompat; /* RO-compatible feature set */
     139             :         u_int8_t   e2fs_uuid[16];       /* 128-bit uuid for volume */
     140             :         char       e2fs_vname[16];      /* volume name */
     141             :         char       e2fs_fsmnt[64];      /* name mounted on */
     142             :         u_int32_t  e2fs_algo;           /* For compression */
     143             :         u_int8_t   e2fs_prealloc;       /* # of blocks to preallocate */
     144             :         u_int8_t   e2fs_dir_prealloc;   /* # of blocks to preallocate for dir */
     145             :         u_int16_t  e2fs_reserved_ngdb;  /* # of reserved gd blocks for resize */
     146             :         /* Ext3 JBD2 journaling. */
     147             :         u_int8_t   e2fs_journal_uuid[16];
     148             :         u_int32_t  e2fs_journal_ino;
     149             :         u_int32_t  e2fs_journal_dev;
     150             :         u_int32_t  e2fs_last_orphan;    /* start of list of inodes to delete */
     151             :         u_int32_t  e2fs_hash_seed[4];   /* htree hash seed */
     152             :         u_int8_t   e2fs_def_hash_version;
     153             :         u_int8_t   e2fs_journal_backup_type;
     154             :         u_int16_t  e2fs_gdesc_size;
     155             :         u_int32_t  e2fs_default_mount_opts;
     156             :         u_int32_t  e2fs_first_meta_bg;
     157             :         u_int32_t  e2fs_mkfs_time;
     158             :         u_int32_t  e2fs_journal_backup[17];
     159             :         u_int32_t  reserved2[172];
     160             : };
     161             : 
     162             : 
     163             : /* in-memory data for ext2fs */
     164             : struct m_ext2fs {
     165             :         struct ext2fs e2fs;
     166             :         u_char  e2fs_fsmnt[MAXMNTLEN];  /* name mounted on */
     167             :         int8_t  e2fs_ronly;     /* mounted read-only flag */
     168             :         int8_t  e2fs_fmod;      /* super block modified flag */
     169             :         int32_t e2fs_fsize;     /* fragment size */
     170             :         int32_t e2fs_bsize;     /* block size */
     171             :         int32_t e2fs_bshift;    /* ``lblkno'' calc of logical blkno */
     172             :         int32_t e2fs_bmask;     /* ``blkoff'' calc of blk offsets */
     173             :         int64_t e2fs_qbmask;    /* ~fs_bmask - for use with quad size */
     174             :         int32_t e2fs_fsbtodb;   /* fsbtodb and dbtofsb shift constant */
     175             :         int32_t e2fs_ncg;       /* number of cylinder groups */
     176             :         int32_t e2fs_ngdb;      /* number of group descriptor block */
     177             :         int32_t e2fs_ipb;       /* number of inodes per block */
     178             :         int32_t e2fs_itpg;      /* number of inode table per group */
     179             :         off_t   e2fs_maxfilesize;       /* depends on LARGE/HUGE flags */
     180             :         struct  ext2_gd *e2fs_gd; /* group descriptors */
     181             : };
     182             : 
     183             : static inline int
     184           0 : e2fs_overflow(struct m_ext2fs *fs, off_t lower, off_t value)
     185             : {
     186           0 :         return (value < lower || value > fs->e2fs_maxfilesize);
     187             : }
     188             : 
     189             : /*
     190             :  * Filesystem identification
     191             :  */
     192             : #define E2FS_MAGIC      0xef53  /* the ext2fs magic number */
     193             : #define E2FS_REV0       0       /* revision levels */
     194             : #define E2FS_REV1       1       /* revision levels */
     195             : 
     196             : /* compatible/imcompatible features */
     197             : #define EXT2F_COMPAT_PREALLOC           0x0001
     198             : #define EXT2F_COMPAT_HASJOURNAL         0x0004
     199             : #define EXT2F_COMPAT_RESIZE             0x0010
     200             : #define EXT2F_COMPAT_DIRHASHINDEX       0x0020
     201             : 
     202             : 
     203             : #define EXT2F_ROCOMPAT_SPARSESUPER      0x0001
     204             : #define EXT2F_ROCOMPAT_LARGEFILE        0x0002
     205             : #define EXT2F_ROCOMPAT_BTREE_DIR        0x0004
     206             : #define EXT2F_ROCOMPAT_HUGE_FILE        0x0008
     207             : 
     208             : #define EXT2F_INCOMPAT_COMP             0x0001
     209             : #define EXT2F_INCOMPAT_FTYPE            0x0002
     210             : #define EXT2F_INCOMPAT_RECOVER          0x0004
     211             : #define EXT2F_INCOMPAT_JOURNAL_DEV      0x0008
     212             : #define EXT2F_INCOMPAT_META_BG          0x0010
     213             : #define EXT2F_INCOMPAT_EXTENTS          0x0040
     214             : #define EXT2F_INCOMPAT_FLEX_BG          0x0200
     215             : 
     216             : /* features supported in this implementation */
     217             : #define EXT2F_COMPAT_SUPP               0x0000
     218             : #define EXT2F_ROCOMPAT_SUPP             (EXT2F_ROCOMPAT_SPARSESUPER | \
     219             :                                          EXT2F_ROCOMPAT_LARGEFILE)
     220             : #define EXT2F_INCOMPAT_SUPP             (EXT2F_INCOMPAT_FTYPE)
     221             : #define EXT4F_RO_INCOMPAT_SUPP          (EXT2F_INCOMPAT_EXTENTS | \
     222             :                                          EXT2F_INCOMPAT_FLEX_BG | \
     223             :                                          EXT2F_INCOMPAT_META_BG | \
     224             :                                          EXT2F_INCOMPAT_RECOVER)
     225             : 
     226             : /*
     227             :  * Definitions of behavior on errors
     228             :  */
     229             : #define E2FS_BEH_CONTINUE       1       /* continue operation */
     230             : #define E2FS_BEH_READONLY       2       /* remount fs read only */
     231             : #define E2FS_BEH_PANIC          3       /* cause panic */
     232             : #define E2FS_BEH_DEFAULT        E2FS_BEH_CONTINUE
     233             : 
     234             : /*
     235             :  * OS identification
     236             :  */
     237             : #define E2FS_OS_LINUX 0
     238             : #define E2FS_OS_HURD  1
     239             : #define E2FS_OS_MASIX 2
     240             : 
     241             : /*
     242             :  * Filesystem clean flags
     243             :  */
     244             : #define E2FS_ISCLEAN    0x01
     245             : #define E2FS_ERRORS     0x02
     246             : 
     247             : /* ext2 file system block group descriptor */
     248             : 
     249             : struct ext2_gd {
     250             :         u_int32_t ext2bgd_b_bitmap;     /* blocks bitmap block */
     251             :         u_int32_t ext2bgd_i_bitmap;     /* inodes bitmap block */
     252             :         u_int32_t ext2bgd_i_tables;     /* inodes table block  */
     253             :         u_int16_t ext2bgd_nbfree;       /* number of free blocks */
     254             :         u_int16_t ext2bgd_nifree;       /* number of free inodes */
     255             :         u_int16_t ext2bgd_ndirs;        /* number of directories */
     256             :         u_int16_t reserved;
     257             :         u_int32_t reserved2[3];
     258             : };
     259             : 
     260             : /*
     261             :  * If the EXT2F_ROCOMPAT_SPARSESUPER flag is set, the cylinder group has a
     262             :  * copy of the super and cylinder group descriptors blocks only if it's
     263             :  * a power of 3, 5 or 7
     264             :  */
     265             : 
     266             : static __inline__ int cg_has_sb(int) __attribute__((__unused__));
     267             : static __inline int
     268           0 : cg_has_sb(i)
     269             :         int i;
     270             : {
     271             :         int a3 ,a5 , a7;
     272             : 
     273           0 :         if (i == 0 || i == 1)
     274           0 :                 return 1;
     275           0 :         for (a3 = 3, a5 = 5, a7 = 7;
     276           0 :             a3 <= i || a5 <= i || a7 <= i;
     277           0 :             a3 *= 3, a5 *= 5, a7 *= 7)
     278           0 :                 if (i == a3 || i == a5 || i == a7)
     279           0 :                         return 1;
     280           0 :         return 0;
     281           0 : }
     282             : 
     283             : /*
     284             :  * Ext2 metadata is stored in little-endian byte order.
     285             :  * JBD2 journal used in ext3 and ext4 is big-endian!
     286             :  */
     287             : #if BYTE_ORDER == LITTLE_ENDIAN
     288             : #define e2fs_sbload(old, new) memcpy((new), (old), SBSIZE);
     289             : #define e2fs_cgload(old, new, size) memcpy((new), (old), (size));
     290             : #define e2fs_sbsave(old, new) memcpy((new), (old), SBSIZE);
     291             : #define e2fs_cgsave(old, new, size) memcpy((new), (old), (size));
     292             : #else
     293             : void e2fs_sb_bswap(struct ext2fs *, struct ext2fs *);
     294             : void e2fs_cg_bswap(struct ext2_gd *, struct ext2_gd *, int);
     295             : #define e2fs_sbload(old, new) e2fs_sb_bswap((old), (new))
     296             : #define e2fs_cgload(old, new, size) e2fs_cg_bswap((old), (new), (size));
     297             : #define e2fs_sbsave(old, new) e2fs_sb_bswap((old), (new))
     298             : #define e2fs_cgsave(old, new, size) e2fs_cg_bswap((old), (new), (size));
     299             : #endif
     300             : 
     301             : /*
     302             :  * Turn file system block numbers into disk block addresses.
     303             :  * This maps file system blocks to device size blocks.
     304             :  */
     305             : #define fsbtodb(fs, b)  ((b) << (fs)->e2fs_fsbtodb)
     306             : #define dbtofsb(fs, b)  ((b) >> (fs)->e2fs_fsbtodb)
     307             : 
     308             : /*
     309             :  * Macros for handling inode numbers:
     310             :  *       inode number to file system block offset.
     311             :  *       inode number to cylinder group number.
     312             :  *       inode number to file system block address.
     313             :  */
     314             : #define ino_to_cg(fs, x)        (((x) - 1) / (fs)->e2fs.e2fs_ipg)
     315             : #define ino_to_fsba(fs, x)                                              \
     316             :         ((fs)->e2fs_gd[ino_to_cg(fs, x)].ext2bgd_i_tables + \
     317             :         (((x)-1) % (fs)->e2fs.e2fs_ipg)/(fs)->e2fs_ipb)
     318             : #define ino_to_fsbo(fs, x)      (((x)-1) % (fs)->e2fs_ipb)
     319             : 
     320             : /*
     321             :  * Give cylinder group number for a file system block.
     322             :  * Give cylinder group block number for a file system block.
     323             :  */
     324             : #define dtog(fs, d) (((d) - (fs)->e2fs.e2fs_first_dblock) / (fs)->e2fs.e2fs_fpg)
     325             : #define dtogd(fs, d) \
     326             :         (((d) - (fs)->e2fs.e2fs_first_dblock) % (fs)->e2fs.e2fs_fpg)
     327             : 
     328             : /*
     329             :  * The following macros optimize certain frequently calculated
     330             :  * quantities by using shifts and masks in place of divisions
     331             :  * modulos and multiplications.
     332             :  */
     333             : #define blkoff(fs, loc)         /* calculates (loc % fs->e2fs_bsize) */ \
     334             :         ((loc) & (fs)->e2fs_qbmask)
     335             : #define lblktosize(fs, blk)     /* calculates (blk * fs->e2fs_bsize) */ \
     336             :         ((blk) << (fs)->e2fs_bshift)
     337             : #define lblkno(fs, loc)         /* calculates (loc / fs->e2fs_bsize) */ \
     338             :         ((loc) >> (fs)->e2fs_bshift)
     339             : #define blkroundup(fs, size)    /* calculates roundup(size, fs->e2fs_bsize) */ \
     340             :         (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask)
     341             : #define fragroundup(fs, size)   /* calculates roundup(size, fs->e2fs_bsize) */ \
     342             :         (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask)
     343             : /*
     344             :  * Determine the number of available frags given a
     345             :  * percentage to hold in reserve.
     346             :  */
     347             : #define freespace(fs) \
     348             :    ((fs)->e2fs.e2fs_fbcount - (fs)->e2fs.e2fs_rbcount)
     349             : 
     350             : /*
     351             :  * Number of indirects in a file system block.
     352             :  */
     353             : #define NINDIR(fs)      ((fs)->e2fs_bsize / sizeof(u_int32_t))

Generated by: LCOV version 1.13