The inode cache isn't really a cache. The main purpose of it is to
allow for synchronization (locking individual inodes), providing
long-lived references to inodes, and ensuring that there is only inode
in memory.
in main.c and don't make it disk specific; the icache is shared. This
doesn't matter since we have only one disk, but conceptually cleaner
and maybe helpful to students for mount lab.
locking plan, which is a difficult to understand because ptable lock
protects many invariants. This implementation has a bug: once in a
while xv6 unlocks a proc lock that is locked by another core.