ufs_fs.h

来自「BIOS Open Platform!」· C头文件 代码 · 共 636 行 · 第 1/2 页

H
636
字号
/*- * Copyright (c) 1982, 1986, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)fs.h	8.13 (Berkeley) 3/21/95 * $FreeBSD: src/sys/ufs/ffs/fs.h,v 1.43.2.3 2005/02/28 16:04:53 delphij Exp $ */#ifndef _UFS_FFS_FS_H_#define _UFS_FFS_FS_H_/* * Each disk drive contains some number of filesystems. * A filesystem consists of a number of cylinder groups. * Each cylinder group has inodes and data. * * A filesystem is described by its super-block, which in turn * describes the cylinder groups.  The super-block is critical * data and is replicated in each cylinder group to protect against * catastrophic loss.  This is done at `newfs' time and the critical * super-block data does not change, so the copies need not be * referenced further unless disaster strikes. * * For filesystem fs, the offsets of the various blocks of interest * are given in the super block as: *	[fs->fs_sblkno]		Super-block *	[fs->fs_cblkno]		Cylinder group block *	[fs->fs_iblkno]		Inode blocks *	[fs->fs_dblkno]		Data blocks * The beginning of cylinder group cg in fs, is given by * the ``cgbase(fs, cg)'' macro. * * Depending on the architecture and the media, the superblock may * reside in any one of four places. For tiny media where every block  * counts, it is placed at the very front of the partition. Historically, * UFS1 placed it 8K from the front to leave room for the disk label and * a small bootstrap. For UFS2 it got moved to 64K from the front to leave * room for the disk label and a bigger bootstrap, and for really piggy * systems we check at 256K from the front if the first three fail. In * all cases the size of the superblock will be SBLOCKSIZE. All values are * given in byte-offset form, so they do not imply a sector size. The * SBLOCKSEARCH specifies the order in which the locations should be searched. */#define SBLOCK_FLOPPY	     0#define SBLOCK_UFS1	  8192#define SBLOCK_UFS2	 65536#define SBLOCK_PIGGY	262144#define SBLOCKSIZE	  8192#define SBLOCKSEARCH \	{ SBLOCK_UFS2, SBLOCK_UFS1, SBLOCK_FLOPPY, SBLOCK_PIGGY, -1 }/* * Max number of fragments per block. This value is NOT tweakable. */#define MAXFRAG 	8/* * Addresses stored in inodes are capable of addressing fragments * of `blocks'. File system blocks of at most size MAXBSIZE can * be optionally broken into 2, 4, or 8 pieces, each of which is * addressable; these pieces may be DEV_BSIZE, or some multiple of * a DEV_BSIZE unit. * * Large files consist of exclusively large data blocks.  To avoid * undue wasted disk space, the last data block of a small file may be * allocated as only as many fragments of a large block as are * necessary.  The filesystem format retains only a single pointer * to such a fragment, which is a piece of a single large block that * has been divided.  The size of such a fragment is determinable from * information in the inode, using the ``blksize(fs, ip, lbn)'' macro. * * The filesystem records space availability at the fragment level; * to determine block availability, aligned fragments are examined. *//* * MINBSIZE is the smallest allowable block size. * In order to insure that it is possible to create files of size * 2^32 with only two levels of indirection, MINBSIZE is set to 4096. * MINBSIZE must be big enough to hold a cylinder group block, * thus changes to (struct cg) must keep its size within MINBSIZE. * Note that super blocks are always of size SBSIZE, * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE. */#define MINBSIZE	4096/* * The path name on which the filesystem is mounted is maintained * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in * the super block for this name. */#define MAXMNTLEN	468/* * The volume name for this filesystem is maintained in fs_volname. * MAXVOLLEN defines the length of the buffer allocated. */#define MAXVOLLEN	32/* * There is a 128-byte region in the superblock reserved for in-core * pointers to summary information. Originally this included an array * of pointers to blocks of struct csum; now there are just a few * pointers and the remaining space is padded with fs_ocsp[]. * * NOCSPTRS determines the size of this padding. One pointer (fs_csp) * is taken away to point to a contiguous array of struct csum for * all cylinder groups; a second (fs_maxcluster) points to an array * of cluster sizes that is computed as cylinder groups are inspected, * and the third points to an array that tracks the creation of new * directories. A fourth pointer, fs_active, is used when creating * snapshots; it points to a bitmap of cylinder groups for which the * free-block bitmap has changed since the snapshot operation began. */#define	NOCSPTRS	((128 / sizeof(void *)) - 4)/* * A summary of contiguous blocks of various sizes is maintained * in each cylinder group. Normally this is set by the initial * value of fs_maxcontig. To conserve space, a maximum summary size * is set by FS_MAXCONTIG. */#define FS_MAXCONTIG	16/* * MINFREE gives the minimum acceptable percentage of filesystem * blocks which may be free. If the freelist drops below this level * only the superuser may continue to allocate blocks. This may * be set to 0 if no reserve of free blocks is deemed necessary, * however throughput drops by fifty percent if the filesystem * is run at between 95% and 100% full; thus the minimum default * value of fs_minfree is 5%. However, to get good clustering * performance, 10% is a better choice. hence we use 10% as our * default value. With 10% free space, fragmentation is not a * problem, so we choose to optimize for time. */#define MINFREE		8#define DEFAULTOPT	FS_OPTTIME/* * Grigoriy Orlov <gluk@ptci.ru> has done some extensive work to fine * tune the layout preferences for directories within a filesystem. * His algorithm can be tuned by adjusting the following parameters * which tell the system the average file size and the average number * of files per directory. These defaults are well selected for typical * filesystems, but may need to be tuned for odd cases like filesystems * being used for squid caches or news spools. */#define AVFILESIZ	16384	/* expected average file size */#define AFPDIR		64	/* expected number of files per directory *//* * The maximum number of snapshot nodes that can be associated * with each filesystem. This limit affects only the number of * snapshot files that can be recorded within the superblock so * that they can be found when the filesystem is mounted. However, * maintaining too many will slow the filesystem performance, so * having this limit is a good idea. */#define FSMAXSNAP 20/* * Used to identify special blocks in snapshots: * * BLK_NOCOPY - A block that was unallocated at the time the snapshot *	was taken, hence does not need to be copied when written. * BLK_SNAP - A block held by another snapshot that is not needed by this *	snapshot. When the other snapshot is freed, the BLK_SNAP entries *	are converted to BLK_NOCOPY. These are needed to allow fsck to *	identify blocks that are in use by other snapshots (which are *	expunged from this snapshot). */#define BLK_NOCOPY ((ufs2_daddr_t)(1))#define BLK_SNAP ((ufs2_daddr_t)(2))/* * Sysctl values for the fast filesystem. */#define	FFS_ADJ_REFCNT		 1	/* adjust inode reference count */#define	FFS_ADJ_BLKCNT		 2	/* adjust inode used block count */#define	FFS_BLK_FREE		 3	/* free range of blocks in map */#define	FFS_DIR_FREE		 4	/* free specified dir inodes in map */#define	FFS_FILE_FREE		 5	/* free specified file inodes in map */#define	FFS_SET_FLAGS		 6	/* set filesystem flags */#define	FFS_ADJ_NDIR		 7	/* adjust number of directories */#define	FFS_ADJ_NBFREE		 8	/* adjust number of free blocks */#define	FFS_ADJ_NIFREE		 9	/* adjust number of free inodes */#define	FFS_ADJ_NFFREE		10 	/* adjust number of free frags */#define	FFS_ADJ_NUMCLUSTERS	11	/* adjust number of free clusters */#define	FFS_MAXID		12	/* number of valid ffs ids *//* * Command structure passed in to the filesystem to adjust filesystem values. */#define	FFS_CMD_VERSION		0x19790518	/* version ID */struct fsck_cmd {	int32_t	version;	/* version of command structure */	int32_t	handle;		/* reference to filesystem to be changed */	int64_t	value;		/* inode or block number to be affected */	int64_t	size;		/* amount or range to be adjusted */	int64_t	spare;		/* reserved for future use */};/* * Per cylinder group information; summarized in blocks allocated * from first cylinder group data blocks.  These blocks have to be * read in from fs_csaddr (size fs_cssize) in addition to the * super block. */struct csum {	int32_t	cs_ndir;		/* number of directories */	int32_t	cs_nbfree;		/* number of free blocks */	int32_t	cs_nifree;		/* number of free inodes */	int32_t	cs_nffree;		/* number of free frags */};struct csum_total {	int64_t	cs_ndir;		/* number of directories */	int64_t	cs_nbfree;		/* number of free blocks */	int64_t	cs_nifree;		/* number of free inodes */	int64_t	cs_nffree;		/* number of free frags */	int64_t	cs_numclusters;		/* number of free clusters */	int64_t	cs_spare[3];		/* future expansion */};/* * Super block for an FFS filesystem. */struct fs {	int32_t	 fs_firstfield;		/* historic filesystem linked list, */	int32_t	 fs_unused_1;		/*     used for incore super blocks */	int32_t	 fs_sblkno;		/* offset of super-block in filesys */	int32_t	 fs_cblkno;		/* offset of cyl-block in filesys */	int32_t	 fs_iblkno;		/* offset of inode-blocks in filesys */	int32_t	 fs_dblkno;		/* offset of first data after cg */	int32_t	 fs_old_cgoffset;	/* cylinder group offset in cylinder */	int32_t	 fs_old_cgmask;		/* used to calc mod fs_ntrak */	int32_t  fs_old_time;		/* last time written */	int32_t	 fs_old_size;		/* number of blocks in fs */	int32_t	 fs_old_dsize;		/* number of data blocks in fs */	int32_t	 fs_ncg;		/* number of cylinder groups */	int32_t	 fs_bsize;		/* size of basic blocks in fs */	int32_t	 fs_fsize;		/* size of frag blocks in fs */	int32_t	 fs_frag;		/* number of frags in a block in fs *//* these are configuration parameters */	int32_t	 fs_minfree;		/* minimum percentage of free blocks */	int32_t	 fs_old_rotdelay;	/* num of ms for optimal next block */	int32_t	 fs_old_rps;		/* disk revolutions per second *//* these fields can be computed from the others */	int32_t	 fs_bmask;		/* ``blkoff'' calc of blk offsets */	int32_t	 fs_fmask;		/* ``fragoff'' calc of frag offsets */	int32_t	 fs_bshift;		/* ``lblkno'' calc of logical blkno */	int32_t	 fs_fshift;		/* ``numfrags'' calc number of frags *//* these are configuration parameters */	int32_t	 fs_maxcontig;		/* max number of contiguous blks */	int32_t	 fs_maxbpg;		/* max number of blks per cyl group *//* these fields can be computed from the others */	int32_t	 fs_fragshift;		/* block to frag shift */	int32_t	 fs_fsbtodb;		/* fsbtodb and dbtofsb shift constant */	int32_t	 fs_sbsize;		/* actual size of super block */	int32_t	 fs_spare1[2];		/* old fs_csmask */					/* old fs_csshift */	int32_t	 fs_nindir;		/* value of NINDIR */	int32_t	 fs_inopb;		/* value of INOPB */	int32_t	 fs_old_nspf;		/* value of NSPF *//* yet another configuration parameter */	int32_t	 fs_optim;		/* optimization preference, see below */	int32_t	 fs_old_npsect;		/* # sectors/track including spares */	int32_t	 fs_old_interleave;	/* hardware sector interleave */	int32_t	 fs_old_trackskew;	/* sector 0 skew, per track */	int32_t	 fs_id[2];		/* unique filesystem id *//* sizes determined by number of cylinder groups and their sizes */	int32_t	 fs_old_csaddr;		/* blk addr of cyl grp summary area */	int32_t	 fs_cssize;		/* size of cyl grp summary area */	int32_t	 fs_cgsize;		/* cylinder group size */	int32_t	 fs_spare2;		/* old fs_ntrak */	int32_t	 fs_old_nsect;		/* sectors per track */	int32_t  fs_old_spc;		/* sectors per cylinder */	int32_t	 fs_old_ncyl;		/* cylinders in filesystem */	int32_t	 fs_old_cpg;		/* cylinders per group */	int32_t	 fs_ipg;		/* inodes per group */	int32_t	 fs_fpg;		/* blocks per group * fs_frag *//* this data must be re-computed after crashes */	struct	csum fs_old_cstotal;	/* cylinder summary information *//* these fields are cleared at mount time */	int8_t   fs_fmod;		/* super block modified flag */	int8_t   fs_clean;		/* filesystem is clean flag */	int8_t 	 fs_ronly;		/* mounted read-only flag */	int8_t   fs_old_flags;		/* old FS_ flags */	char	 fs_fsmnt[MAXMNTLEN];	/* name mounted on */	char	 fs_volname[MAXVOLLEN];	/* volume name */	uint64_t fs_swuid;		/* system-wide uid */	int32_t  fs_pad;		/* due to alignment of fs_swuid *//* these fields retain the current block allocation info */	int32_t	 fs_cgrotor;		/* last cg searched */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?