FS(4) INTERACTIVE UNIX System FS(4)
NAME
fs: file system - format of system volume
SYNOPSIS
#include <sys/filsys.h>
#include <sys/types.h>
#include <sys/param.h>
DESCRIPTION
Every file system storage volume has a common format for
certain vital information. Every such volume is divided
into a certain number of 512-byte long sectors. Sector 0 is
unused and is available to contain a bootstrap program or
other information.
Sector 1 is the superblock. The format of a super block is:
struct filsys
{
ushort s_isize; /* size in blocks of i-list */
daddr_t s_fsize; /* size in blocks of entire volume */
short s_nfree; /* number of addresses in s_free */
daddr_t s_free[NICFREE]; /* free block list */
short s_ninode; /* number of inodes in s_inode */
ushort s_inode[NICINOD]; /* free inode list */
char s_flock; /* lock during free list manipulation */
char s_ilock; /* lock during i-list manipulation */
char s_fmod; /* super block modified flag */
char s_ronly; /* mounted read-only flag */
time_t s_time; /* last super block update */
short s_dinfo[4]; /* device information */
daddr_t s_tfree; /* total free blocks*/
ushort s_tinode; /* total free inodes */
char s_fname[6]; /* file system name */
char s_fpack[6]; /* file system pack name */
long s_fill[12]; /* ADJUST to make size of filsys
be 512; for 80286, array is s_fill[14] */
long s_state; /* file system state */
long s_magic; /* magic number to denote new
file system */
long s_type; /* type of new file system */
};
#define FsMAGIC 0xfd187e20 /* s_magic number */
#define Fs1b 1 /* 512-byte block */
#define Fs2b 2 /* 1024-byte block */
#define FsOKAY 0x7c269d38 /* s_state: clean */
#define FsACTIVE 0x5e72d81a /* s_state: active */
#define FsBAD 0xcb096f43 /* s_state: bad root */
Rev. Page 1
FS(4) INTERACTIVE UNIX System FS(4)
#define FsBADBLK 0xbadbc14b /* s_state: bad block corrupted it */
S_type indicates the file system type. Currently, two types
of file systems are supported: the original 512-byte logi-
cal block and the improved 1024-byte logical block. S_magic
is used to distinguish the original 512-byte oriented file
systems from the newer file systems. If this field is not
equal to the magic number, fsMAGIC, the type is assumed to
be fs1b, otherwise the s_type field is used. In the follow-
ing description, a block is then determined by the type.
For the original 512-byte oriented file system, a block is
512-bytes. For the 1024-byte oriented file system, a block
is 1024-bytes or two sectors. The operating system takes
care of all conversions from logical block numbers to physi-
cal sector numbers.
S_state indicates the state of the file system. A cleanly
unmounted, not damaged file system is indicated by the
FsOKAY state. After a file system has been mounted for
update, the state changes to FsACTIVE. A special case is
used for the root file system. If the root file system
appears damaged at boot time, it is mounted but marked
FsBAD. Lastly, after a file system has been unmounted, the
state reverts to FsOKAY.
S_isize is the address of the first data block after the i-
list; the i-list starts just after the super block, namely
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 diag-
nostic is written on the on-line 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 became 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
Rev. Page 2
FS(4) INTERACTIVE UNIX System FS(4)
s_nfree.
S_tfree is the total free blocks available in the file sys-
tem.
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, 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 is only to speed up the
allocation process; the information as to whether the inode
is really free or not is maintained in the inode itself.
S_tinode is the total free inodes available in the file sys-
tem.
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 likewise
immaterial; it 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 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.
S_fname is the name of the file system and s_fpack is the
name of the pack.
I-numbers begin at 1, and the storage for inodes begins in
block 2. Also, inodes are 64 bytes long. 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(4).
SEE ALSO
mount(2), inode(4).
fsck(1M), fsdb(1M), mkfs(1M) in the INTERACTIVE UNIX System
User's/System Administrator's Reference Manual.
Rev. Page 3