Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fsck(8)

fsdb(8)

mkfs(8)

mount(2)

inode(0)



  fs(0)                               CLIX                               fs(0)



  NAME

    fs - Format of system volume

  SYNOPSIS

    #include <sys/fs/s5filsys.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 superblock is as follows:

    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;           /* 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*/
         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 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 */

    #define FsOKAY   0x7c269d38    /* s_state: clean */
    #define FsACTIVE 0x5e72d81a    /* s_state: active */



  2/94 - Intergraph Corporation                                              1






  fs(0)                               CLIX                               fs(0)



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

    The s_type member indicates the file system type.  Currently, two types of
    file systems are supported: the original 512-byte logical block and the
    improved 1024-byte logical block.  The s_magic member is used to
    distinguish the original 512-byte oriented file systems from the newer
    file systems.  If this member is not equal to the magic number, fsMAGIC,
    the type is assumed to be fs1b.  Otherwise, the s_type member 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.

    The s_state member 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.

    The s_isize member is the address of the first data block after the i-
    list; the i-list starts just after the superblock, namely in block 2; thus
    the i-list is s_isize-2 blocks long.  The s_fsize member 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 online 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.  The 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.

    The s_tfree member is the total free blocks available in the file system.

    The s_ninode member is the number of free i-numbers in the s_inode array.



  2                                              Intergraph Corporation - 2/94






  fs(0)                               CLIX                               fs(0)



    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 1000, 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.

    The s_tinode member is the total free inodes available in the file system.

    The s_flock and s_ilock members 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 superblock has changed and should be
    copied to the disk during the next periodic update of file system
    information.

    The s_ronly member is a read-only flag to indicate write-protection.

    The s_time member is the last time the superblock 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 superblock for the root
    file system is used to set the system's idea of the time.

    The s_fname member 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(0).

  RELATED INFORMATION

    Commands:  fsck(8), fsdb(8), mkfs(8)

    Functions:  mount(2)

    Files:  inode(0)












  2/94 - Intergraph Corporation                                              3




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