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.