glenda.party
term% ls -F
term% cat index.txt
FILSYS(5)                     File Formats Manual                    FILSYS(5)



NAME
       filsys, flblk, ino - format of file system volume

SYNOPSIS
       #include <sys/types.h>
       #include <sys/flbk.h>
       #include <sys/filsys.h>
       #include <sys/ino.h>

DESCRIPTION
       Every  file system storage volume (e.g. RF disk, RK disk, RP disk, DEC‐
       tape reel) has a common format for certain  vital  information.   Every
       such volume is divided into a certain number of 512-byte blocks.  Block
       0 is unused and is available to contain a bootstrap program,  pack  la‐
       bel, or other information.

       Block  1  is the super block.  The layout of the super block as defined
       by the include file <sys/filsys.h> is:

       S_isize is the address of the  first  block  after  the  i-list,  which
       starts  just  after  the  super-block,  in  block 2.  Thus is i-list is
       s_isize-2 blocks long.  S_fsize is the address of the first  block  not
       potentially available for allocation to a file.  These numbers are used
       by the system to check for bad  block  addresses;  if  an  `impossible'
       block address 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 cor‐
       rupted free list.

       The free list for each volume is maintained as follows.  The s_free ar‐
       ray contains, in s_free[1], ... , s_free[s_nfree-1], up to NICFREE free
       block numbers.  NICFREE is a configuration constant.  S_free[0] is  the
       block  address  of  the head of a chain of blocks constituting the free
       list.  The layout of each block of the free chain as defined in the in‐
       clude file <sys/fblk.h> is:

       The  fields  df_nfree and df_free in a free block are used exactly like
       s_nfree and s_free in the super block.  To allocate a block:  decrement
       s_nfree, and the new block number is s_free[s_nfree].  If the new block
       address is 0, there are no blocks left, so give an error.   If  s_nfree
       became 0, read the new block into s_nfree and s_free.  To free a block,
       check if s_nfree is NICFREE; 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 address and increment s_nfree.

       S_ninode is the number of free i-numbers in the s_inode array.  To  al‐
       locate  an  i-node: if s_ninode is greater than 0, decrement it and re‐
       turn s_inode[s_ninode].  If it was 0, read the  i-list  and  place  the
       numbers of all free inodes (up to NICINOD) into the s_inode array, then
       try again.  To free an i-node, provided s_ninode is less than NICINODE,
       place  its  number  into  s_inode[s_ninode] and increment s_ninode.  If
       s_ninode is already NICINODE, don't bother to enter  the  freed  i-node
       into  any  table.  This list of i-nodes is only to speed up the alloca‐
       tion process; the information as to whether the inode is really free or
       not is maintained in the inode itself.

       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 write-protection indicator; its disk value is also immate‐
       rial.

       S_time is the last time the super-block of the file system was changed.
       During a reboot, s_time of the super-block for the root file system  is
       used to set the system's idea of the time.

       The  fields  s_tfree,  s_tinode,  s_fname and s_fpack are not currently
       maintained.

       I-numbers begin at 1, and the storage for i-nodes begins  in  block  2.
       I-nodes  are 64 bytes long, so 8 of them fit into a block.  I-node 2 is
       reserved for the root directory of the file system, but no other i-num‐
       ber has a built-in meaning.  Each i-node represents one file.  The for‐
       mat of an i-node as given in the include file <sys/ino.h> is:

       Di_mode tells the kind of  file;  it  is  encoded  identically  to  the
       st_mode  field of stat(2).  Di_nlink is the number of directory entries
       (links) that refer to this i-node.  Di_uid and di_gid are  the  owner's
       user and group IDs.  Size is the number of bytes in the file.  Di_atime
       and di_mtime are the times of last access and modification of the  file
       contents  (read,  write or create) (see times(2)); Di_ctime records the
       time of last modification to the inode or to the file, and is  used  to
       determine whether it should be dumped.

       Special  files  are  recognized  by their modes and not by i-number.  A
       block-type special file is one which can potentially be  mounted  as  a
       file  system;  a  character-type  special file cannot, though it is not
       necessarily character-oriented.  For special files, the  di_addr  field
       is  occupied  by  the  device code (see types(5)).  The device codes of
       block and character special files overlap.

       Disk addresses of plain files and directories are  kept  in  the  array
       di_addr  packed  into 3 bytes each.  The first 10 addresses specify de‐
       vice blocks directly.  The last 3 addresses  are  singly,  doubly,  and
       triply indirect and point to blocks of 128 block pointers.  Pointers in
       indirect blocks have the type daddr_t (see types(5)).

       For block b in a file to exist, it is not  necessary  that  all  blocks
       less  than b exist.  A zero block number either in the address words of
       the i-node or in an indirect block  indicates  that  the  corresponding
       block  has  never  been allocated.  Such a missing block reads as if it
       contained all zero words.

SEE ALSO
       icheck(1), dcheck(1), dir(5), mount(1), stat(2), types(5)



                                                                     FILSYS(5)