Annotation of 43BSDTahoe/man/man5/fs.5, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1983 Regents of the University of California.
        !             2: .\" All rights reserved.  The Berkeley software License Agreement
        !             3: .\" specifies the terms and conditions for redistribution.
        !             4: .\"
        !             5: .\"    @(#)fs.5        6.3 (Berkeley) 5/2/88
        !             6: .\"
        !             7: .TH FS 5 "May 2, 1988"
        !             8: .UC 5
        !             9: .SH NAME
        !            10: fs, inode \- format of file system volume
        !            11: .SH SYNOPSIS
        !            12: .B #include <sys/types.h>
        !            13: .br
        !            14: .B #include <sys/fs.h>
        !            15: .br
        !            16: .B #include <sys/inode.h>
        !            17: .SH DESCRIPTION
        !            18: Every file system storage volume (disk, nine-track tape, for instance)
        !            19: has a common format for certain vital information.
        !            20: Every such volume is divided into a certain number of blocks.
        !            21: The block size is a parameter of the file system.
        !            22: Sectors beginning at BBLOCK and continuing for BBSIZE are used to
        !            23: contain a label and for some hardware
        !            24: primary and secondary bootstrapping programs.
        !            25: .PP
        !            26: The actual file system begins at sector SBLOCK with the
        !            27: .I "super block"
        !            28: that is of size SBSIZE.
        !            29: The layout of the super block as defined by the include file
        !            30: .RI < sys/fs.h >
        !            31: is:
        !            32: .PP
        !            33: .nf
        !            34: .ta \w'\ \ \ \ 'u +\w'daddr_t\ \ 'u +\w'fs_fsmnt[MAXMNTLEN];\ \ 'u
        !            35: #define        FS_MAGIC 0x011954
        !            36: struct fs {
        !            37:        struct  fs *fs_link;    /* linked list of file systems */
        !            38:        struct  fs *fs_rlink;   /*     used for incore super blocks */
        !            39:        daddr_t fs_sblkno;      /* addr of super-block in filesys */
        !            40:        daddr_t fs_cblkno;      /* offset of cyl-block in filesys */
        !            41:        daddr_t fs_iblkno;      /* offset of inode-blocks in filesys */
        !            42:        daddr_t fs_dblkno;      /* offset of first data after cg */
        !            43:        long    fs_cgoffset;    /* cylinder group offset in cylinder */
        !            44:        long    fs_cgmask;      /* used to calc mod fs_ntrak */
        !            45:        time_t  fs_time;        /* last time written */
        !            46:        long    fs_size;        /* number of blocks in fs */
        !            47:        long    fs_dsize;       /* number of data blocks in fs */
        !            48:        long    fs_ncg; /* number of cylinder groups */
        !            49:        long    fs_bsize;       /* size of basic blocks in fs */
        !            50:        long    fs_fsize;       /* size of frag blocks in fs */
        !            51:        long    fs_frag;        /* number of frags in a block in fs */
        !            52: /* these are configuration parameters */
        !            53:        long    fs_minfree;     /* minimum percentage of free blocks */
        !            54:        long    fs_rotdelay;    /* num of ms for optimal next block */
        !            55:        long    fs_rps; /* disk revolutions per second */
        !            56: /* these fields can be computed from the others */
        !            57:        long    fs_bmask;       /* ``blkoff'' calc of blk offsets */
        !            58:        long    fs_fmask;       /* ``fragoff'' calc of frag offsets */
        !            59:        long    fs_bshift;      /* ``lblkno'' calc of logical blkno */
        !            60:        long    fs_fshift;      /* ``numfrags'' calc number of frags */
        !            61: /* these are configuration parameters */
        !            62:        long    fs_maxcontig;   /* max number of contiguous blks */
        !            63:        long    fs_maxbpg;      /* max number of blks per cyl group */
        !            64: /* these fields can be computed from the others */
        !            65:        long    fs_fragshift;   /* block to frag shift */
        !            66:        long    fs_fsbtodb;     /* fsbtodb and dbtofsb shift constant */
        !            67:        long    fs_sbsize;      /* actual size of super block */
        !            68:        long    fs_csmask;      /* csum block offset */
        !            69:        long    fs_csshift;     /* csum block number */
        !            70:        long    fs_nindir;      /* value of NINDIR */
        !            71:        long    fs_inopb;       /* value of INOPB */
        !            72:        long    fs_nspf;        /* value of NSPF */
        !            73: /* yet another configuration parameter */
        !            74:        long    fs_optim;       /* optimization preference, see below */
        !            75: /* these fields are derived from the hardware */
        !            76:        long    fs_npsect;      /* # sectors/track including spares */
        !            77:        long    fs_interleave;  /* hardware sector interleave */
        !            78:        long    fs_trackskew;   /* sector 0 skew, per track */
        !            79:        long    fs_headswitch;  /* head switch time, usec */
        !            80:        long    fs_trkseek;     /* track-to-track seek, usec */
        !            81: /* sizes determined by number of cylinder groups and their sizes */
        !            82:        daddr_t fs_csaddr;      /* blk addr of cyl grp summary area */
        !            83:        long    fs_cssize;      /* size of cyl grp summary area */
        !            84:        long    fs_cgsize;      /* cylinder group size */
        !            85: /* these fields are derived from the hardware */
        !            86:        long    fs_ntrak;       /* tracks per cylinder */
        !            87:        long    fs_nsect;       /* sectors per track */
        !            88:        long    fs_spc;         /* sectors per cylinder */
        !            89: /* this comes from the disk driver partitioning */
        !            90:        long    fs_ncyl;        /* cylinders in file system */
        !            91: /* these fields can be computed from the others */
        !            92:        long    fs_cpg; /* cylinders per group */
        !            93:        long    fs_ipg; /* inodes per group */
        !            94:        long    fs_fpg; /* blocks per group * fs_frag */
        !            95: /* this data must be re-computed after crashes */
        !            96:        struct  csum fs_cstotal;        /* cylinder summary information */
        !            97: /* these fields are cleared at mount time */
        !            98:        char    fs_fmod;        /* super block modified flag */
        !            99:        char    fs_clean;       /* file system is clean flag */
        !           100:        char    fs_ronly;       /* mounted read-only flag */
        !           101:        char    fs_flags;       /* currently unused flag */
        !           102:        char    fs_fsmnt[MAXMNTLEN];    /* name mounted on */
        !           103: /* these fields retain the current block allocation info */
        !           104:        long    fs_cgrotor;     /* last cg searched */
        !           105:        struct  csum *fs_csp[MAXCSBUFS]; /* list of fs_cs info buffers */
        !           106:        long    fs_cpc; /* cyl per cycle in postbl */
        !           107:        short   fs_opostbl[16][8];      /* old rotation block list head */
        !           108:        long    fs_sparecon[56];        /* reserved for future constants */
        !           109:        quad    fs_qbmask;      /* ~fs_bmask - for use with quad size */
        !           110:        quad    fs_qfmask;      /* ~fs_fmask - for use with quad size */
        !           111:        long    fs_postblformat;        /* format of positional layout tables */
        !           112:        long    fs_nrpos;       /* number of rotaional positions */
        !           113:        long    fs_postbloff;   /* (short) rotation block list head */
        !           114:        long    fs_rotbloff;    /* (u_char) blocks for each rotation */
        !           115:        long    fs_magic;       /* magic number */
        !           116:        u_char  fs_space[1];    /* list of blocks for each rotation */
        !           117: /* actually longer */
        !           118: };
        !           119: .fi
        !           120: .LP
        !           121: Each disk drive contains some number of file systems.
        !           122: A file system consists of a number of cylinder groups.
        !           123: Each cylinder group has inodes and data.
        !           124: .LP
        !           125: A file system is described by its super-block, which in turn
        !           126: describes the cylinder groups.  The super-block is critical
        !           127: data and is replicated in each cylinder group to protect against
        !           128: catastrophic loss.  This is done at file system creation
        !           129: time and the critical
        !           130: super-block data does not change, so the copies need not be
        !           131: referenced further unless disaster strikes.
        !           132: .LP
        !           133: Addresses stored in inodes are capable of addressing fragments
        !           134: of `blocks'. File system blocks of at most size MAXBSIZE can 
        !           135: be optionally broken into 2, 4, or 8 pieces, each of which is
        !           136: addressable; these pieces may be DEV_BSIZE, or some multiple of
        !           137: a DEV_BSIZE unit.
        !           138: .LP
        !           139: Large files consist of exclusively large data blocks.  To avoid
        !           140: undue wasted disk space, the last data block of a small file is
        !           141: allocated as only as many fragments of a large block as are
        !           142: necessary.  The file system format retains only a single pointer
        !           143: to such a fragment, which is a piece of a single large block that
        !           144: has been divided.  The size of such a fragment is determinable from
        !           145: information in the inode, using the ``blksize(fs, ip, lbn)'' macro.
        !           146: .LP
        !           147: The file system records space availability at the fragment level;
        !           148: to determine block availability, aligned fragments are examined.
        !           149: .LP
        !           150: The root inode is the root of the file system.
        !           151: Inode 0 can't be used for normal purposes and
        !           152: historically bad blocks were linked to inode 1,
        !           153: thus the root inode is 2 (inode 1 is no longer used for
        !           154: this purpose, however numerous dump tapes make this
        !           155: assumption, so we are stuck with it).
        !           156: .LP
        !           157: .I fs_minfree
        !           158: gives the minimum acceptable percentage of file system
        !           159: blocks that may be free. If the freelist drops below this level
        !           160: only the super-user may continue to allocate blocks.
        !           161: .I Fs_minfree
        !           162: may be set to 0 if no reserve of free blocks is deemed necessary,
        !           163: however severe performance degradations will be observed if the
        !           164: file system is run at greater than 90% full; thus the default
        !           165: value of
        !           166: .I fs_minfree
        !           167: is 10%.
        !           168: .LP
        !           169: Empirically the best trade-off between block fragmentation and
        !           170: overall disk utilization at a loading of 90% comes with a
        !           171: fragmentation of 8, thus the default fragment size is an eighth
        !           172: of the block size.
        !           173: .LP
        !           174: .I fs_optim
        !           175: specifies whether the file system should try to minimize the time spent
        !           176: allocating blocks, or if it should attempt to minimize the space
        !           177: fragmentation on the disk.
        !           178: If the value of fs_minfree (see above) is less than 10%,
        !           179: then the file system defaults to optimizing for space to avoid
        !           180: running out of full sized blocks.
        !           181: If the value of minfree is greater than or equal to 10%,
        !           182: fragmentation is unlikely to be problematical, and
        !           183: the file system defaults to optimizing for time.
        !           184: .LP
        !           185: .I Cylinder group related
        !           186: .IR limits :
        !           187: Each cylinder keeps track of the availability of blocks at different
        !           188: rotational positions, so that sequential blocks can be laid out
        !           189: with minimum rotational latency. With the default of 8 distinguished
        !           190: rotational positions, the resolution of the
        !           191: summary information is 2ms for a typical 3600 rpm drive.
        !           192: .LP
        !           193: .I fs_rotdelay
        !           194: gives the minimum number of milliseconds to initiate
        !           195: another disk transfer on the same cylinder.  It is used in
        !           196: determining the rotationally optimal layout for disk blocks
        !           197: within a file; the default value for
        !           198: .I fs_rotdelay
        !           199: is 2ms.
        !           200: .LP
        !           201: Each file system has a statically allocated number of inodes.
        !           202: An inode is allocated for each NBPI bytes of disk space.
        !           203: The inode allocation strategy is extremely conservative.
        !           204: .LP
        !           205: MINBSIZE is the smallest allowable block size.
        !           206: With a MINBSIZE of 4096
        !           207: it is possible to create files of size
        !           208: 2^32 with only two levels of indirection.
        !           209: MINBSIZE must be big enough to hold a cylinder group block,
        !           210: thus changes to (struct cg) must keep its size within MINBSIZE.
        !           211: Note that super blocks are never more than size SBSIZE.
        !           212: .LP
        !           213: The path name on which the file system is mounted is maintained in
        !           214: .IR fs_fsmnt .
        !           215: MAXMNTLEN defines the amount of space allocated in 
        !           216: the super block for this name.
        !           217: The limit on the amount of summary information per file system
        !           218: is defined by MAXCSBUFS.
        !           219: For a 4096 byte block size, it is currently parameterized for a
        !           220: maximum of two million cylinders.
        !           221: .LP
        !           222: Per cylinder group information is summarized in blocks allocated
        !           223: from the first cylinder group's data blocks. 
        !           224: These blocks are read in from
        !           225: .I fs_csaddr
        !           226: (size
        !           227: .IR fs_cssize )
        !           228: in addition to the super block.
        !           229: .LP
        !           230: .B N.B.:
        !           231: sizeof (struct csum) must be a power of two in order for
        !           232: the ``fs_cs'' macro to work.
        !           233: .LP
        !           234: .I Super block for a file
        !           235: .IR system :
        !           236: The size of the rotational layout tables
        !           237: is limited by the fact that the super block is of size SBSIZE.
        !           238: The size of these tables is
        !           239: .B inversely
        !           240: proportional to the block
        !           241: size of the file system. The size of the tables is
        !           242: increased when sector sizes are not powers of two,
        !           243: as this increases the number of cylinders
        !           244: included before the rotational pattern repeats (
        !           245: .IR fs_cpc ).
        !           246: The size of the rotational layout
        !           247: tables is derived from the number of bytes remaining in (struct fs).
        !           248: .LP
        !           249: The number of blocks of data per cylinder group
        !           250: is limited because cylinder groups are at most one block.
        !           251: The inode and free block tables
        !           252: must fit into a single block after deducting space for
        !           253: the cylinder group structure (struct cg).
        !           254: .LP
        !           255: .IR Inode :
        !           256: The inode is the focus of all file activity in the
        !           257: UNIX file system.  There is a unique inode allocated
        !           258: for each active file,
        !           259: each current directory, each mounted-on file,
        !           260: text file, and the root.
        !           261: An inode is `named' by its device/i-number pair.
        !           262: For further information, see the include file
        !           263: .RI < sys/inode.h >.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.