svfs(4) svfs(4)NAME svfs - format of a System V system volume SYNOPSIS #include <sys/types.h> #include <sys/param.h> #include <svfs/filsys.h> DESCRIPTION Every SVFS file-system storage volume has a common format for certain vital information. Each volume is divided into a certain number of 512-byte sectors. Sector 0 contains the disk partition map. See dpme(4) for further information on its structure. Sector 1 is the superblock. The format of a superblock is /* * Structure of the superblock */ 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 */ ino_t 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 */ 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[13]; /* ADJUST size of filsys to 512 */ long s_state; /* file-system state */ ino_t s_lasti; /* start place for April, 1990 1
svfs(4) svfs(4)circular search */ ino_t s_nbehind; /* est # free inodes before s_lasti */ long s_magic; /* magic number to indicate new filesys */ long s_type; /* type of new filesys */ }; #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 block system and the new improved 1024-byte block system. s_magic is used to distinguish the original 512-byte block file sys- tems 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 fol- lowing description, a block is then determined by the type. For the original 512-byte block file system, a block is 512 bytes. For the 1024-byte block file system, a block is 1024 bytes or two sectors. The operating system takes care of all conversions from logical block numbers to physical sec- tor numbers. s_isize is the address of the first data block after the inode list. The i-list starts just after the superblock, namely in block 2; thus the i-list is s_isize-2 blocks long. s_fsize is the first block not potentially available for al- location 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 online console. Moreover, the free array is cleared, 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 2 April, 1990
svfs(4) svfs(4)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 number of the freed block and increment s_nfree. s_tfree is the total free blocks available in the file sys- tem. s_ninode is the number of free inumbers in the s_inode ar- ray. To allocate an inode, if s_ninode is greater than 0, decrement it and return s_inode[s_ninode]. To allocate an inode, if s_ninode is 0, read the i-list, place the numbers of all free inodes (up to 100) into the s_inode array, and then try again. To free an inode, provided s_ninode is less than 100, place its number into s_inode[s_ninode] and incre- ment 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 memory copy of the file system while it is mounted, and their values on disk are immaterial. The value of s_fmod on disk is like- wise immaterial because 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 informa- tion. s_ronly is a read-only flag to indicate write-protection. s_time is the last time the superblock of the file system was changed and is the number of seconds that have elapsed since 00:00 January 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. s_fname is the name of the file system, and s_fpack is the name of the pack. Inumbers 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 inumber has a built-in meaning. Each inode represents one file. For the format of an inode and its flags, see inode(4). April, 1990 3
svfs(4) svfs(4)FILES /usr/include/svfs/filsys.h /usr/include/sys/stat.h SEE ALSO fsck(1M), fsdb(1M), mkfs(1M), dpme(4), ufs(4), inode(4). 4 April, 1990