Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fsck(1M)

fsdb(1M)

mkfs(1M)

inode(5)

FS(5)  —  UNIX 3.0

NAME

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 (e.g., RP04 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. Starting from its first word, the format of a super-block is:

/*
 * Structure of the super-block
 */
structfilsys
{
ushorts_isize;/* size in blocks of i-list */
daddr_ts_fsize;/* size in blocks of entire volume */
shorts_nfree;/* number of addresses in s_free */
daddr_ts_free[NICFREE]; /* free block list */
shorts_ninode;/* number of i-nodes in s_inode */
ino_ts_inode[NICINOD]; /* free i-node list */
chars_flock;/* lock during free list manipulation */
chars_ilock;/* lock during i-list manipulation */
char  s_fmod; /* super block modified flag */
chars_ronly;/* mounted read-only flag */
time_ts_time; /* last super block update */
shorts_dinfo[4];/* device information */
daddr_ts_tfree;/* total free blocks*/
ino_ts_tinode;/* total free inodes */
chars_fname[6];/* file system name */
chars_fpack[6];/* file system pack name */
};

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 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 inodes (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 inode is really free or not 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 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 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. 

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 i-nodes begins in block 2.  Also, i-nodes are 64 bytes long, so 8 of them fit into a block.  Therefore, i-node i is located in block (i+15)/8, and begins 64×((i+15) (mod 8)) bytes from its start. 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 inode and its flags, see inode(5).

FILES

/usr/include/sys/filsys.h
/usr/include/sys/stat.h

SEE ALSO

fsck(1M), fsdb(1M), mkfs(1M), inode(5). 

May 16, 1980

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026