The storage of a file on disk
differs from the view the programmer has of the file in two ways:
blocks can be scattered around the disk (although the filesystem
tries hard to keep blocks sequential to improve access time), and
files may appear to a programmer to be bigger than they really are
because a program can introduce holes into them (through the
lseek( ) system call).
In this section, we explain how the Ext2 filesystem manages the disk space — how it allocates and deallocates inodes and data blocks. Two main problems must be addressed:
Space management must make every effort to avoid file fragmentation — the physical storage of a file in several, small pieces located in nonadjacent disk blocks. File fragmentation increases the average time of sequential read operations on the files, since the disk heads must be frequently repositioned during the read operation. This problem is similar to the external fragmentation of RAM discussed in Section 7.1.7.
Space management must be time-efficient; that is, the kernel should be able to quickly derive from a file offset the corresponding logical block number in the Ext2 partition. In doing so, the kernel should limit as much as possible the number of accesses to addressing tables stored on disk, since each such intermediate access considerably increases the average file access time.
ext2_new_inode( ) function creates an Ext2 disk inode, returning the address of the corresponding inode ...