FILESYSTEM(F) XENIX System V FILESYSTEM(F)
Name
file system - Format of a system volume.
Syntax
#include <sys/filsys.h>
#include <sys/types.h>
#include <sys/param.h>
Description
Every file system storage volume (for example, a hard disk)
has a common format for certain vital information. Every
such volume is divided into a certain number of 256 word
(512 byte) blocks. Block 0 is unused and is available to
contain a bootstrap program or other information.
Block 1 is the super-block. The format of a super-block is
described in /usr/include/sys/filesys.h. In that include
file, S_isize is the address of the first data block after
the i-list. The i-list starts just after the super-block in
block 2; thus the i-list is s_isize-2 blocks long. S_fsize
is the first block not potentially available for allocation
to a file. These numbers are used by the system to check
for bad block numbers. If an ``impossible'' block number is
allocated from the free list or is freed, a diagnostic is
written on the console. Moreover, the free array is cleared
so as to prevent further allocation from a presumably
corrupted free list.
The free list for each volume is maintained as follows. The
s_free array contains, in s_free[1], ..., s_free[s_nfree-1],
up to 49 numbers of free blocks. S_free[0] is the block
number of the head of a chain of blocks constituting the
free list. The first long in each free-chain block is the
number (up to 50) of free-block numbers listed in the next
50 longs of this chain member. The first of these 50 blocks
is the link to the next member of the chain. To allocate a
block: decrement s_nfree, and the new block is
s_free[s_nfree]. If the new block number is 0, there are no
blocks left, so give an error. If s_nfree becomes 0, read
in the block named by the new block number, replace s_nfree
by its first word, and copy the block numbers in the next 50
longs into the s_free array. To free a block, check if
s_nfree is 50; if so, copy s_nfree and the s_free array into
it, write it out, and set s_nfree to 0. In any event set
s_free[s_nfree] to the freed block's number and increment
s_nfree.
S_tfree is the total free blocks available in the file
system.
S_ninode is the number of free i-numbers in the s_inode
array. To allocate an inode: if s_ninode is greater than 0,
Page 1 (printed 8/7/87)
FILESYSTEM(F) XENIX System V FILESYSTEM(F)
decrement it and return s_inode[s_ninode]. If it was 0,
read the i-list and place the numbers of all free inodes (up
to 100) into the s_inode array, then try again. To free an
inode, provided s_ninode is less than 100, place its number
into s_inode[s_ninode] and increment s_ninode. If s_ninode
is already 100, do not bother to enter the freed inode into
any table. This list of inodes only speeds up the
allocation process. The information about whether the inode
is really free is maintained in the inode itself.
S_tinode is the total free inodes available in the file
system.
S_flock and s_ilock are flags maintained in the core copy of
the file system while it is mounted and their values on disk
are immaterial. The value of s_fmod on disk is also
immaterial, and is used as a flag to indicate that the
super-block has changed and should be copied to the disk
during the next periodic update of file system information.
S_ronly is a read-only flag to indicate write-protection.
S_time is the last time the super-block of the file system
was changed, and is a double precision representation of the
number of seconds that have elapsed since 00:00 Jan. 1, 1970
(GMT). During a reboot, the s_time of the super-block for
the root file system is used to set the system's idea of the
time.
I-numbers begin at 1, and the storage for inodes begins in
block 2. Also, inodes are 64 bytes long, so 8 of them fit
into a block. Therefore, inode i is located in block
(i+15)/8, and begins 64x((i+15) (mod 8)) bytes from its
start. Inode 1 is reserved for future use. Inode 2 is
reserved for the root directory of the file system, but no
other i-number has a built-in meaning. Each inode
represents one file. For the format of an inode and its
flags, see inode(F).
Files
/usr/include/sys/filsys.h
/usr/include/sys/stat.h
See Also
fsck(C), mkfs(C), inode(F)
Page 2 (printed 8/7/87)