1 #ifndef __MFS_BUF_H__ 2 #define __MFS_BUF_H__ 3 4 #include "clean.h" 5 6 /* Buffer (block) cache. To acquire a block, a routine calls get_block(), 7 * telling which block it wants. The block is then regarded as "in use" 8 * and has its 'b_count' field incremented. All the blocks that are not 9 * in use are chained together in an LRU list, with 'front' pointing 10 * to the least recently used block, and 'rear' to the most recently used 11 * block. A reverse chain, using the field b_prev is also maintained. 12 * Usage for LRU is measured by the time the put_block() is done. The second 13 * parameter to put_block() can violate the LRU order and put a block on the 14 * front of the list, if it will probably not be needed soon. If a block 15 * is modified, the modifying routine must set b_dirt to DIRTY, so the block 16 * will eventually be rewritten to the disk. 17 */ 18 19 #include <sys/dirent.h> 20 21 union fsdata_u { 22 char b__data[1]; /* ordinary user data */ 23 /* directory block */ 24 struct direct b__dir[1]; 25 /* V2 indirect block */ 26 zone_t b__v2_ind[1]; 27 /* V2 inode block */ 28 d2_inode b__v2_ino[1]; 29 /* bit map block */ 30 bitchunk_t b__bitmap[1]; 31 }; 32 33 /* A block is free if b_dev == NO_DEV. */ 34 35 36 /* These defs make it possible to use to bp->b_data instead of bp->b.b__data */ 37 #define b_data(b) ((union fsdata_u *) b->data)->b__data 38 #define b_dir(b) ((union fsdata_u *) b->data)->b__dir 39 #define b_v2_ind(b) ((union fsdata_u *) b->data)->b__v2_ind 40 #define b_v2_ino(b) ((union fsdata_u *) b->data)->b__v2_ino 41 #define b_bitmap(b) ((union fsdata_u *) b->data)->b__bitmap 42 43 #endif 44 45