Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

mount(2)

inode(4)

fsck(1M)

fsdb(1M)

mkfs(1M)



          FS(4)                INTERACTIVE UNIX System                FS(4)



          NAME
               fs: 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 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 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 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;           /* 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*/
                       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 size of filsys
                                                  be 512; for 80286, array is s_fill[14] */
                       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 */
               #define FsBAD    0xcb096f43        /* s_state: bad root */




          Rev.                                                       Page 1





          FS(4)                INTERACTIVE UNIX System                FS(4)



               #define FsBADBLK 0xbadbc14b        /* s_state: bad block corrupted it */

               S_type indicates the file system type.  Currently, two types
               of file systems are supported:  the original 512-byte logi-
               cal block and the improved 1024-byte logical block.  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 follow-
               ing 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 physi-
               cal sector numbers.

               S_state 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.

               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 diag-
               nostic 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


          Rev.                                                       Page 2





          FS(4)                INTERACTIVE UNIX System                FS(4)



               s_nfree.

               S_tfree is the total free blocks available in the file sys-
               tem.

               S_ninode is the number of free i-numbers in the s_inode
               array.  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 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 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 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(4).

          SEE ALSO
               mount(2), inode(4).
               fsck(1M), fsdb(1M), mkfs(1M) in the INTERACTIVE UNIX System
               User's/System Administrator's Reference Manual.






          Rev.                                                       Page 3



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