Can also keep a linked list of free blocks for the free list. Lots of seeking, even in sequential access. Allocate an array to hold pointers to all the blocks, but don't allocate the blocks. Then fill in the pointers dynamically using a free list. In file descriptor, keep pointer to first block.
Most files are small.
Much of the disk is allocated to large files. Thus, the per-file cost must be low, but the performance of large files must be good. Must allow reasonably fast random access, extensibility.