CHECK(VIII)                  8/31/73                  CHECK(VIII)







NAME

     check - file system consistency check



SYNOPSIS

     check [ -lsib [ numbers ] ] [ filesystem ]



DESCRIPTION

     Check examines a file system,  builds  a  bit  map  of  used

     blocks,  and  compares  this  bit  map against the free list

     maintained on the file system.  It  also  reads  directories

     and  compares  the link-count in each i-node with the number

     of directory entries by which it is referenced.  If the file

     system is not specified, a check of a default file system is

     performed.  The normal output of check includes a report of



         The number of blocks missing; i.e. not in any  file  nor

         in the free list,

         The number of special files,

         The total number of files,

         The number of large files,

         The number of directories,

         The number of indirect blocks,

         The number of blocks used in files,

         The highest-numbered block appearing in a file,

         The number of free blocks.



     The -l flag causes check to produce as part  of  its  output

     report a list of the all the path names of files on the file

     system.  The list is in i-number order; the first  name  for

     each  file  gives  the i-number while subsequent names (i.e.

     links) have the i-number suppressed.  The entries ``.''  and

     ``..''  for directories are also suppressed.



     The -s flag causes check to ignore the actual free list  and

     reconstruct  a  new  one by rewriting the super-block of the

     file system.  The file system  should  be  dismounted  while

     this  is  done;  if this is not possible (for example if the

     root file system has to be salvaged) care  should  be  taken

     that  the  system  is  quiescent  and  that  it  is rebooted

     immediately afterwards so that the old, bad in-core copy  of

     the  super-block  will not continue to be used.  Notice also

     that the words in the super-block which indicate the size of

     the  free  list  and  of  the  i-list  are believed.  If the

     super-block has been curdled these words  will  have  to  be

     patched.  The -s flag causes the normal output reports to be

     suppressed.



     The occurrence of i n  times  in  a  flag  argument  -ii...i

     causes  check  to  store away the next n arguments which are

     taken to be i-numbers.   When  any  of  these  i-numbers  is

     encountered  in  a  directory  a  diagnostic is produced, as

     described below, which  indicates  among  other  things  the

     entry name.



     Likewise, n appearances of b in a flag  like  -bb...b  cause

     the  next n arguments to be taken as block numbers which are

     remembered; whenever any of the named blocks turns up  in  a

     file, a diagnostic is produced.





FILES

     Currently, /dev/rp0 is the default file system.



SEE ALSO

     fs (V)



DIAGNOSTICS

     There are some self-evident diagnostics  like  ``can't  open

     ...'', ``can't write ....''  If a read error is encountered,

     the block number of the  bad  block  is  printed  and  check

     exits.   ``Bad freeblock'' means that a block number outside

     the available space was encountered in the free  list.   ``n

     dups  in  free''  means that n blocks were found in the free

     list which duplicate blocks either in some file  or  in  the

     earlier part of the free list.



     An important class of diagnostics is produced by  a  routine

     which  is  called  for each block which is encountered in an

     i-node corresponding  to  an  ordinary  file  or  directory.

     These have the form



             b# complaint ; i= i# (class )



     Here b# is the block number being considered;  complaint  is

     the diagnostic itself.  It may be



        blk   if the block number was mentioned  as  an  argument

             after -b;

        bad   if the block number has  a  value  not  inside  the

             allocatable space on the device, as indicated by the

             devices's super-block;

        dup   if the block number has  already  been  seen  in  a

             file;

        din   if the block is a member of a directory, and if  an

             entry is found therein whose i-number is outside the

             range of the i-list on the device, as  indicated  by

             the   i-list  size  specified  by  the  super-block.

             Unfortunately this diagnostic does not indicate  the

             offending  entry name, but since the i-number of the

             directory itself is given (see  below)  the  problem

             can be tracked down.



     The i# in the form above is the i-number in which the  named

     block  was found.  The class is an indicator of what type of

     block was involved in the difficulty:



        sdir  indicates that the block is a data block in a small

             file;

        ldir  indicates that the block is a data block in a large

             file (the indirect block number is not available);

        idir  indicates that  the  block  is  an  indirect  block

             (pointing to data blocks) in a large file;

        free  indicates that the block was mentioned after -b and

             is free;

        urk   indicates a malfunction in check.



     When an i-number specified after  -i  is  encountered  while

     reading a directory, a report in the form



           # ino; i= d# (class ) name



     where i# is the requested i-number.  d# is the  i-number  of

     the  directory, class is the class of the directory block as

     discussed above (virtually always ``sdir'') and name is  the

     entry  name.   This  diagnostic  gives enough information to

     find a full path name for an i-number without using  the  -l

     option:  use  -b n to find an entry name and the i-number of

     the  directory  containing  the   reference   to   n,   then

     recursively  use -b on the i-number of the directory to find

     its name.



     Another important class of file system diseases indicated by

     check  is  files  for  which the number of directory entries

     does not agree with the link-count field of the i-node.  The

     diagnostic is hard to interpret.  It has the form



             i#  delta



     Here i# is the i-number affected.  Delta is an octal  number

     accumulated in a byte, and thus can have the value 0 through

     377(8).  The easiest way (short of rewriting the routine) of

     explaining  the  significance of delta is to describe how it

     is computed.



     If the associated i-node is  allocated  (that  is,  has  the

     allocated  bit  on)  add 100 to delta.  If its link-count is

     non-zero, add another 100 plus the link-count.  Each time  a

     directory   entry  specifying  the  associated  i-number  is

     encountered, subtract 1 from delta.   At  the  end,  the  i-

     number  and delta are printed if delta is neither 0 nor 200.

     The first case indicates that the i-node was unallocated and

     no  entries  for it appear; the second that it was allocated

     and that the link-count and the number of directory  entries

     agree.



     Therefore (to  explain  the  symptoms  of  the  most  common

     difficulties)  delta  =  377  (-1  in  8-bit, 2's complement

     octal)  means  that  there  is  a  directory  entry  for  an

     unallocated  i-node.  This is somewhat serious and the entry

     should be be found  and  removed  forthwith.   Delta  =  201

     usually  means  that  a  normal,  allocated  i-node  has  no

     directory entry.  This  difficulty  is  much  less  serious.

     Whatever  blocks  there are in the file are unavailable, but

     no further damage will occur if nothing  is  done.   A  clri

     followed  by  a  check  -s  will  restore  the lost space at

     leisure.



     In general, values of delta equal to or  somewhat  above  0,

     100,  or  200  are  relatively  innocuous;  just below these

     numbers there is danger of spreading infection.



BUGS

     Unfortunately, check -l on file systems with more than  3000

     or so files does not work because it runs out of core.



     Since check is inherently  two-pass  in  nature,  extraneous

     diagnostics  may  be  produced  if  applied  to  active file

     systems.



     It believes even preposterous super-blocks and  consequently

     can get core images.