root/ufs/ext2fs/ext2fs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. cg_has_sb

    1 /*      $OpenBSD: ext2fs.h,v 1.12 2007/06/02 00:45:50 pedro 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 <machine/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  * Addresses stored in inodes are capable of addressing blocks
   63  * XXX
   64  */
   65 
   66 /*
   67  * MINBSIZE is the smallest allowable block size.
   68  * MINBSIZE must be big enough to hold a cylinder group block,
   69  * thus changes to (struct cg) must keep its size within MINBSIZE.
   70  * Note that super blocks are always of size SBSIZE,
   71  * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE.
   72  */
   73 #define LOG_MINBSIZE 10
   74 #define MINBSIZE        (1 << LOG_MINBSIZE)
   75 
   76 /*
   77  * The path name on which the file system is mounted is maintained
   78  * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in
   79  * the super block for this name.
   80  */
   81 #define MAXMNTLEN       512
   82 
   83 /*
   84  * MINFREE gives the minimum acceptable percentage of file system
   85  * blocks which may be free. If the freelist drops below this level
   86  * only the superuser may continue to allocate blocks. This may
   87  * be set to 0 if no reserve of free blocks is deemed necessary,
   88  * however throughput drops by fifty percent if the file system
   89  * is run at between 95% and 100% full; thus the minimum default
   90  * value of fs_minfree is 5%. However, to get good clustering
   91  * performance, 10% is a better choice. hence we use 10% as our
   92  * default value. With 10% free space, fragmentation is not a
   93  * problem, so we choose to optimize for time.
   94  */
   95 #define MINFREE         5
   96 
   97 /*
   98  * Super block for an ext2fs file system.
   99  */
  100 struct ext2fs {
  101         u_int32_t  e2fs_icount;         /* Inode count */
  102         u_int32_t  e2fs_bcount;         /* blocks count */
  103         u_int32_t  e2fs_rbcount;        /* reserved blocks count */
  104         u_int32_t  e2fs_fbcount;        /* free blocks count */
  105         u_int32_t  e2fs_ficount;        /* free inodes count */
  106         u_int32_t  e2fs_first_dblock;   /* first data block */
  107         u_int32_t  e2fs_log_bsize;      /* block size = 1024*(2^e2fs_log_bsize) */
  108         u_int32_t  e2fs_fsize;          /* fragment size */
  109         u_int32_t  e2fs_bpg;            /* blocks per group */
  110         u_int32_t  e2fs_fpg;            /* frags per group */
  111         u_int32_t  e2fs_ipg;            /* inodes per group */
  112         u_int32_t  e2fs_mtime;          /* mount time */
  113         u_int32_t  e2fs_wtime;          /* write time */
  114         u_int16_t  e2fs_mnt_count;      /* mount count */
  115         u_int16_t  e2fs_max_mnt_count;  /* max mount count */
  116         u_int16_t  e2fs_magic;          /* magic number */
  117         u_int16_t  e2fs_state;          /* file system state */
  118         u_int16_t  e2fs_beh;            /* behavior on errors */
  119         u_int16_t  e2fs_minrev;         /* minor revision level */
  120         u_int32_t  e2fs_lastfsck;       /* time of last fsck */
  121         u_int32_t  e2fs_fsckintv;       /* max time between fscks */
  122         u_int32_t  e2fs_creator;        /* creator OS */
  123         u_int32_t  e2fs_rev;            /* revision level */
  124         u_int16_t  e2fs_ruid;           /* default uid for reserved blocks */
  125         u_int16_t  e2fs_rgid;           /* default gid for reserved blocks */
  126         /* EXT2_DYNAMIC_REV superblocks */
  127         u_int32_t  e2fs_first_ino;      /* first non-reserved inode */
  128         u_int16_t  e2fs_inode_size;     /* size of inode structure */
  129         u_int16_t  e2fs_block_group_nr; /* block grp number of this sblk*/
  130         u_int32_t  e2fs_features_compat; /*  compatible feature set */
  131         u_int32_t  e2fs_features_incompat; /* incompatible feature set */
  132         u_int32_t  e2fs_features_rocompat; /* RO-compatible feature set */
  133         u_int8_t   e2fs_uuid[16];       /* 128-bit uuid for volume */
  134         char       e2fs_vname[16];      /* volume name */
  135         char       e2fs_fsmnt[64];      /* name mounted on */
  136         u_int32_t  e2fs_algo;           /* For compression */
  137         u_int8_t   e2fs_prealloc;       /* # of blocks to preallocate */
  138         u_int8_t   e2fs_dir_prealloc;   /* # of blocks to preallocate for dir */
  139         u_int16_t  pad1;
  140         u_int32_t  reserved2[204];
  141 };
  142 
  143 
  144 /* in-memory data for ext2fs */
  145 struct m_ext2fs {
  146         struct ext2fs e2fs;
  147         u_char  e2fs_fsmnt[MAXMNTLEN];  /* name mounted on */
  148         int8_t  e2fs_ronly;     /* mounted read-only flag */
  149         int8_t  e2fs_fmod;      /* super block modified flag */
  150         int32_t e2fs_bsize;     /* block size */
  151         int32_t e2fs_bshift;    /* ``lblkno'' calc of logical blkno */
  152         int32_t e2fs_bmask;     /* ``blkoff'' calc of blk offsets */
  153         int64_t e2fs_qbmask;    /* ~fs_bmask - for use with quad size */
  154         int32_t e2fs_fsbtodb;   /* fsbtodb and dbtofsb shift constant */
  155         int32_t e2fs_ncg;       /* number of cylinder groups */
  156         int32_t e2fs_ngdb;      /* number of group descriptor block */
  157         int32_t e2fs_ipb;       /* number of inodes per block */
  158         int32_t e2fs_itpg;      /* number of inode table per group */
  159         struct  ext2_gd *e2fs_gd; /* group descriptors */
  160 };
  161 
  162 
  163 
  164 /*
  165  * Filesystem identification
  166  */
  167 #define E2FS_MAGIC      0xef53  /* the ext2fs magic number */
  168 #define E2FS_REV0       0       /* revision levels */
  169 #define E2FS_REV1       1       /* revision levels */
  170 
  171 /* compatible/imcompatible features */
  172 #define EXT2F_COMPAT_PREALLOC           0x0001
  173 
  174 #define EXT2F_ROCOMPAT_SPARSESUPER      0x0001
  175 #define EXT2F_ROCOMPAT_LARGEFILE        0x0002
  176 #define EXT2F_ROCOMPAT_BTREE_DIR        0x0004
  177 
  178 #define EXT2F_INCOMPAT_COMP             0x0001
  179 #define EXT2F_INCOMPAT_FTYPE            0x0002
  180 #define EXT2F_INCOMPAT_RECOVER          0x0004
  181 #define EXT2F_INCOMPAT_JOURNAL_DEV      0x0008
  182 
  183 /* features supported in this implementation */
  184 #define EXT2F_COMPAT_SUPP               0x0000
  185 #define EXT2F_ROCOMPAT_SUPP             (EXT2F_ROCOMPAT_SPARSESUPER \
  186                                         | EXT2F_ROCOMPAT_LARGEFILE)
  187 #define EXT2F_INCOMPAT_SUPP             EXT2F_INCOMPAT_FTYPE
  188 
  189 /*
  190  * OS identification
  191  */
  192 #define E2FS_OS_LINUX 0
  193 #define E2FS_OS_HURD  1
  194 #define E2FS_OS_MASIX 2
  195 
  196 /*
  197  * Filesystem clean flags
  198  */
  199 #define E2FS_ISCLEAN    0x01
  200 #define E2FS_ERRORS     0x02
  201 
  202 /* ext2 file system block group descriptor */
  203 
  204 struct ext2_gd {
  205         u_int32_t ext2bgd_b_bitmap;     /* blocks bitmap block */
  206         u_int32_t ext2bgd_i_bitmap;     /* inodes bitmap block */
  207         u_int32_t ext2bgd_i_tables;     /* inodes table block  */
  208         u_int16_t ext2bgd_nbfree;       /* number of free blocks */
  209         u_int16_t ext2bgd_nifree;       /* number of free inodes */
  210         u_int16_t ext2bgd_ndirs;        /* number of directories */
  211         u_int16_t reserved;
  212         u_int32_t reserved2[3];
  213 };
  214 
  215 /*
  216  * If the EXT2F_ROCOMPAT_SPARSESUPER flag is set, the cylinder group has a
  217  * copy of the super and cylinder group descriptors blocks only if it's
  218  * a power of 3, 5 or 7
  219  */
  220 
  221 static __inline__ int cg_has_sb(int) __attribute__((__unused__));
  222 static __inline int
  223 cg_has_sb(i)
  224         int i;
  225 {
  226         int a3 ,a5 , a7;
  227 
  228         if (i == 0 || i == 1)
  229                 return 1;
  230         for (a3 = 3, a5 = 5, a7 = 7;
  231             a3 <= i || a5 <= i || a7 <= i;
  232             a3 *= 3, a5 *= 5, a7 *= 7)
  233                 if (i == a3 || i == a5 || i == a7)
  234                         return 1;
  235         return 0;
  236 }
  237 
  238 /*
  239  * EXT2FS metadatas are stored in little-endian byte order. These macros
  240  * helps reading theses metadatas
  241  */
  242 
  243 #define h2fs16(x) htole16(x)
  244 #define h2fs32(x) htole32(x)
  245 #define fs2h16(x) letoh16(x)
  246 #define fs2h32(x) letoh32(x)
  247 #if BYTE_ORDER == LITTLE_ENDIAN
  248 #define e2fs_sbload(old, new) memcpy((new), (old), SBSIZE);
  249 #define e2fs_cgload(old, new, size) memcpy((new), (old), (size));
  250 #define e2fs_sbsave(old, new) memcpy((new), (old), SBSIZE);
  251 #define e2fs_cgsave(old, new, size) memcpy((new), (old), (size));
  252 #else
  253 void e2fs_sb_bswap(struct ext2fs *, struct ext2fs *);
  254 void e2fs_cg_bswap(struct ext2_gd *, struct ext2_gd *, int);
  255 #define e2fs_sbload(old, new) e2fs_sb_bswap((old), (new))
  256 #define e2fs_cgload(old, new, size) e2fs_cg_bswap((old), (new), (size));
  257 #define e2fs_sbsave(old, new) e2fs_sb_bswap((old), (new))
  258 #define e2fs_cgsave(old, new, size) e2fs_cg_bswap((old), (new), (size));
  259 #endif
  260 
  261 /*
  262  * Turn file system block numbers into disk block addresses.
  263  * This maps file system blocks to device size blocks.
  264  */
  265 #define fsbtodb(fs, b)  ((b) << (fs)->e2fs_fsbtodb)
  266 #define dbtofsb(fs, b)  ((b) >> (fs)->e2fs_fsbtodb)
  267 
  268 /*
  269  * Macros for handling inode numbers:
  270  *       inode number to file system block offset.
  271  *       inode number to cylinder group number.
  272  *       inode number to file system block address.
  273  */
  274 #define ino_to_cg(fs, x)        (((x) - 1) / (fs)->e2fs.e2fs_ipg)
  275 #define ino_to_fsba(fs, x)                                              \
  276         ((fs)->e2fs_gd[ino_to_cg(fs, x)].ext2bgd_i_tables + \
  277         (((x)-1) % (fs)->e2fs.e2fs_ipg)/(fs)->e2fs_ipb)
  278 #define ino_to_fsbo(fs, x)      (((x)-1) % (fs)->e2fs_ipb)
  279 
  280 /*
  281  * Give cylinder group number for a file system block.
  282  * Give cylinder group block number for a file system block.
  283  */
  284 #define dtog(fs, d) (((d) - (fs)->e2fs.e2fs_first_dblock) / (fs)->e2fs.e2fs_fpg)
  285 #define dtogd(fs, d) \
  286         (((d) - (fs)->e2fs.e2fs_first_dblock) % (fs)->e2fs.e2fs_fpg)
  287 
  288 /*
  289  * The following macros optimize certain frequently calculated
  290  * quantities by using shifts and masks in place of divisions
  291  * modulos and multiplications.
  292  */
  293 #define blkoff(fs, loc)         /* calculates (loc % fs->e2fs_bsize) */ \
  294         ((loc) & (fs)->e2fs_qbmask)
  295 #define lblktosize(fs, blk)     /* calculates (blk * fs->e2fs_bsize) */ \
  296         ((blk) << (fs)->e2fs_bshift)
  297 #define lblkno(fs, loc)         /* calculates (loc / fs->e2fs_bsize) */ \
  298         ((loc) >> (fs)->e2fs_bshift)
  299 #define blkroundup(fs, size)    /* calculates roundup(size, fs->e2fs_bsize) */ \
  300         (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask)
  301 #define fragroundup(fs, size)   /* calculates roundup(size, fs->e2fs_bsize) */ \
  302         (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask)
  303 /* 
  304  * Determine the number of available frags given a
  305  * percentage to hold in reserve.
  306  */   
  307 #define freespace(fs) \
  308    ((fs)->e2fs.e2fs_fbcount - (fs)->e2fs.e2fs_rbcount) 
  309 
  310 /*
  311  * Number of indirects in a file system block.
  312  */
  313 #define NINDIR(fs)      ((fs)->e2fs_bsize / sizeof(u_int32_t))

/* [<][>][^][v][top][bottom][index][help] */