A defragmentation technique determines the extent to which data blocks of a file
are fragmented on disks of a computer and, in response, efficiently relocates those
blocks if such relocation improves the on-disk layout of the file. Each indirect
block of the file is examined and the current layout of the range of pointers referencing
the data blocks is determined. In addition, the number of operations needed to
retrieve those data blocks from disks is calculated. A potential new layout is
then estimated based on an average fullness of the file system. If the potential
new layout improves the fragmentation of the current layout, then the data blocks
for that range are relocated, if there is sufficient free space on disk. Otherwise,
the blocks are not relocated and the current on-disk layout of the file is maintained.