fs(0) CLIX fs(0)
NAME
fs - Format of system volume
SYNOPSIS
#include <sys/fs/s5filsys.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 superblock is as follows:
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; /* superblock modified flag */
char s_ronly; /* mounted read-only flag */
time_t s_time; /* last superblock 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 sizeof filsys be 512 */
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 */
2/94 - Intergraph Corporation 1
fs(0) CLIX fs(0)
#define FsBAD 0xcb096f43 /* s_state: bad root */
#define FsBADBLK 0xbadbc14b /* s_state: bad block corrupted it */
The s_type member indicates the file system type. Currently, two types of
file systems are supported: the original 512-byte logical block and the
improved 1024-byte logical block. The s_magic member is used to
distinguish the original 512-byte oriented file systems from the newer
file systems. If this member is not equal to the magic number, fsMAGIC,
the type is assumed to be fs1b. Otherwise, the s_type member is used. In
the following 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 physical sector numbers.
The s_state member 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.
The s_isize member is the address of the first data block after the i-
list; the i-list starts just after the superblock, namely in block 2; thus
the i-list is s_isize-2 blocks long. The s_fsize member 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 online 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. The 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 s_nfree.
The s_tfree member is the total free blocks available in the file system.
The s_ninode member is the number of free i-numbers in the s_inode array.
2 Intergraph Corporation - 2/94
fs(0) CLIX fs(0)
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 1000, 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.
The s_tinode member is the total free inodes available in the file system.
The s_flock and s_ilock members 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 superblock has changed and should be
copied to the disk during the next periodic update of file system
information.
The s_ronly member is a read-only flag to indicate write-protection.
The s_time member is the last time the superblock 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 superblock for the root
file system is used to set the system's idea of the time.
The s_fname member 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(0).
RELATED INFORMATION
Commands: fsck(8), fsdb(8), mkfs(8)
Functions: mount(2)
Files: inode(0)
2/94 - Intergraph Corporation 3