fs(4S5) (S5) fs(4S5)
NAME
fs (s5) - format of s5 file system volume
SYNOPSIS
#include <sys/types.h>
#include <sys/param.h>
#include <sys/fs/s5filsys.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 super-block. 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 i-nodes in s_inode */
o_ino_t s_inode[NICINOD]; /* free i-node 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*/
o_ino_t s_tinode; /* total free i-nodes */
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 */
Copyright 1994 Novell, Inc. Page 1
fs(4S5) (S5) fs(4S5)
#define Fs4b 3 /* 2048-byte block */
#define FsOKAY 0x7c269d38 /* s_state: clean */
#define FsACTIVE 0x5e72d81a /* s_state: active */
#define FsBAD 0xcb096f43 /* s_state: bad root */
#define FsBADBLK 0xbadbc14b /* s_state: bad block corrupted it */
s_type indicates the file system type. Currently, three types
of file systems are supported: the original 512-byte logical
block, the 1024-byte logical block, and the 2048-byte logical
block. s_magic is used to distinguish the s5 file system from
other FSTypes. The s_type field is used to determine the
blocksize of the file system; 512-bytes, 1K, or 2K. The
operating system takes care of all conversions from logical
block numbers to physical sector numbers.
s_state is unique for each file system and indicates the state
of the file system. The numerical value of the ``file system
state'' is computed as the sum of s_state and s_time and will
ordinarily be one of FsOKAY, FsACTIVE, or FsBAD. A cleanly
unmounted, undamaged file system is indicated by the FsOKAY
state. After a file system had been mounted for update, the
state changes to FsACTIVE. The state reverts to FsOKAY after
a file system has been unmounted. A special case is used for
the root file system. If it appears damaged at boot time, it
is mounted but marked FsBAD.
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 diagnostic 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
Copyright 1994 Novell, Inc. Page 2
fs(4S5) (S5) fs(4S5)
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.
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 i-node: 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 i-nodes (up to
100) into the s_inode array, then try again. To free an i-
node, 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 i-node into any
table. This list of i-nodes is only to speed up the
allocation process; the information as to whether the i-node
is really free or not is maintained in the i-node itself.
s_tinode is the total free i-nodes 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 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 (UTC). 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.
Copyright 1994 Novell, Inc. Page 3
fs(4S5) (S5) fs(4S5)
I-numbers begin at 1, and the storage for i-nodes begins in
block 2. Also, i-nodes are 64 bytes long. I-node 1 is
reserved for future use. I-node 2 is reserved for the root
directory of the file system, but no other i-number has a
built-in meaning. Each i-node represents one file. For the
format of an i-node and its flags, see inode(4S5).
REFERENCES
fsck(1M), fsdb(1M), s5-specific inode(4S5), mkfs(1M), mount(2)
Copyright 1994 Novell, Inc. Page 4