struct buf { int flags; uint dev; // 64-bit, because the filesystem's block numbers are. This was a uint, which // capped any device at 2^32 blocks (16 TB at 4 KB) no matter what the format // above it could address -- SchFS is a 64-bit format and was being served by // a 32-bit cache. uint64 blockno; struct sleeplock lock; uint refcnt; struct buf *prev; // LRU cache list struct buf *next; struct buf *qnext; // disk queue struct buf *hnext; // hash chain, by (dev, blockno) struct buf *anext; // every buffer, in the order made; never reordered // BSIZE bytes, a page of its own. A pointer rather than an array since the // cache grows at run time (see bio.c); drivers copy through their own DMA // buffers, so where the page sits does not matter to them. uchar *data; }; #define B_VALID 0x2 // buffer has been read from disk #define B_DIRTY 0x4 // buffer needs to be written to disk // How many buffers the cache holds now, and the most it will grow to. bio.c. void bcache_size(uint *n, uint *max);