8.7 Code: Block allocator
File and directory content is stored in disk blocks,
which must be allocated from a free pool.
Xv6’s block allocator
maintains a free bitmap on disk, with one bit per block.
A zero bit indicates that the corresponding block is free;
a one bit indicates that it is in use.
The program
mkfs
sets the bits corresponding to the boot sector, superblock, log blocks, inode
blocks, and bitmap blocks.
The block allocator provides two functions:
balloc
allocates a new disk block, and
bfree
frees a block.
balloc
The loop in
balloc
at
(kernel/fs.c:72)
considers every block, starting at block 0 up to
sb.size
,
the number of blocks in the file system.
It looks for a block whose bitmap bit is zero,
indicating that it is free.
If
balloc
finds such a block, it updates the bitmap
and returns the block.
For efficiency, the loop is split into two
pieces.
The outer loop reads each block of bitmap bits.
The inner loop checks all
Bits-Per-Block (BPB
)
bits in a single bitmap block.
The race that might occur if two processes try to allocate
a block at the same time is prevented by the fact that
the buffer cache only lets one process use any one bitmap block at a time.
bfree
(kernel/fs.c:92)
finds the right bitmap block and clears the right bit.
Again the exclusive use implied by
bread
and
brelse
avoids the need for explicit locking.
As with much of the code described in the remainder of this chapter,
balloc
and
bfree
must be called inside a transaction.