BELLFS(4) — Silicon Graphics
NAME
Bell file system − format of Bell file system volume
SYNOPSIS
#include <sys/param.h>
#include <sys/filsys.h>
DESCRIPTION
Every Bell file system (formerly known as “the” UNIX System V 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:
/*
*Structure of the super-block
*/
| 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 */ | |
| 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*/ | |
| ino_t | s_tinode; | /* total free inodes */ | |
| char | s_fname[6]; | /* file system name */ | |
| char | s_fpack[6]; | /* file system pack name */ | |
| long | s_fill[14]; | /* ADJUST to make sizeof filsys be 512 */ | |
| ino_t | s_lasti; | /* start place for circular search */ | |
| ino_t | s_nbehind; | /* est # free inodes before s_lasti */ | |
| long | s_magic; | /* magic number to indicate 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 | Fs4b | 4 | /* 2048 byte block */ |
s_type indicates the file system type. Currently, two types of file systems are supported: the original 512-byte oriented and the new improved 1024-byte oriented. 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 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.
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 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. 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(4).
FILES
/usr/include/sys/param.h
/usr/include/sys/filsys.h
/usr/include/sys/stat.h
SEE ALSO
fsck(1M), mkfs(1M), inode(4), fs(4).
Version 2.4 — May 08, 1986