|
|
The list of inodes is checked sequentially starting with inode 1 (there is no inode 0). Each inode is checked for inconsistencies involving:
Each inode contains a mode word. This mode word describes the type and state of the inode. Inodes can be one of six types:
Inodes can be in one of three states: unallocated, allocated, and partially allocated. This last state means the inode is incorrectly formatted. An inode can get into this state if, for example, bad data are written into the inode list because of a hardware failure. The only corrective action fsck can take is to clear the inode.
Each inode contains a count of the number of directory entries linked to it. The fsck program verifies the link count of each inode by examining the entire directory structure, starting from the root directory, and calculating an actual link count for each inode.
Discrepancies between the link count stored in the inode and the actual link count as determined by fsck can be due to one of the following:
This can occur if no directory entry appears for the inode. In this case, fsck can link the disconnected file to the lost+found directory.
This can occur if a directory entry has been removed but the inode has not been updated. In this case, fsck can replace the stored link count by the actual link count.
In this case, fsck can change the link count of inode to the actual count.
Each inode contains a list of all the blocks claimed by the inode. The fsck program compares each block number claimed by an inode to a list of allocated blocks. If a block number claimed by an inode is on the list of allocated blocks, it is put on a list of duplicate blocks. If it is not on the list of allocated blocks, it is put on it.
If this process produces a list of duplicate blocks, fsck makes a second pass of the inode list to find the other inode that claims each duplicate block. (A large number of duplicate blocks in an inode might be caused by an indirect block not being written to the filesystem.)
Although it is not possible to determine with certainty which inode is in error, in most cases the inode with the most recent modification time is correct. The fsck program prompts the user to clear both inodes.
The fsck program checks each block number claimed by an inode to see that its value is higher than that of the first data block and lower than that of the last block in the filesystem. If the block number is outside this range, it is considered a bad block number.
Bad block numbers in an inode can be caused by an indirect block not being written to the filesystem. The fsck program prompts the user to clear the inode.
Each inode contains a 32-bit (4-byte) size field. This field shows the number of characters in the file associated with the inode. A directory inode within the filesystem has the directory bit set in the inode mode word.
If the directory size is not a multiple of 16, fsck warns of directory misalignment and prompts for corrective action.
For a regular file, a rough check of the consistency of the size field of an inode can be performed by using the number of characters shown in the size field to calculate how many blocks to associate with the inode and comparing that to the actual number of blocks claimed by the inode.
When fsck detects an incorrect file size, it prompts you to choose whether to truncate the file or expand the file to match the number of blocks allocated. Increasing the file size might produce unwanted data at the end of your file; truncating the file might destroy data in the last few blocks.