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)