1 /* buf.h 4.12 81/03/09 */ 2 3 /* 4 * The header for buffers in the buffer pool and otherwise used 5 * to describe a block i/o request is given here. The routines 6 * which manipulate these things are given in bio.c. 7 * 8 * Each buffer in the pool is usually doubly linked into 2 lists: 9 * hashed into a chain by <dev,blkno> so it can be located in the cache, 10 * and (usually) on (one of several) queues. These lists are circular and 11 * doubly linked for easy removal. 12 * 13 * There are currently three queues for buffers: 14 * one for buffers which must be kept permanently (super blocks) 15 * one for buffers containing ``useful'' information (the cache) 16 * one for buffers containing ``non-useful'' information 17 * (and empty buffers, pushed onto the front) 18 * The latter two queues contain the buffers which are available for 19 * reallocation, are kept in lru order. When not on one of these queues, 20 * the buffers are ``checked out'' to drivers which use the available list 21 * pointers to keep track of them in their i/o active queues. 22 */ 23 24 /* 25 * Bufhd structures used at the head of the hashed buffer queues. 26 * We only need three words for these, so this abbreviated 27 * definition saves some space. 28 */ 29 struct bufhd 30 { 31 long b_flags; /* see defines below */ 32 struct buf *b_forw, *b_back; /* fwd/bkwd pointer in chain */ 33 }; 34 struct buf 35 { 36 long b_flags; /* too much goes here to describe */ 37 struct buf *b_forw, *b_back; /* hash chain (2 way street) */ 38 struct buf *av_forw, *av_back; /* position on free list if not BUSY */ 39 #define b_actf av_forw /* alternate names for driver queue */ 40 #define b_actl av_back /* head - isn't history wonderful */ 41 long b_bcount; /* transfer count */ 42 #define b_active b_bcount /* driver queue head: drive active */ 43 short b_error; /* returned after I/O */ 44 dev_t b_dev; /* major+minor device name */ 45 union { 46 caddr_t b_addr; /* low order core address */ 47 int *b_words; /* words for clearing */ 48 struct filsys *b_filsys; /* superblocks */ 49 struct dinode *b_dino; /* ilist */ 50 daddr_t *b_daddr; /* indirect block */ 51 } b_un; 52 daddr_t b_blkno; /* block # on device */ 53 long b_resid; /* words not transferred after error */ 54 #define b_errcnt b_resid /* while i/o in progress: # retries */ 55 #define b_pfcent b_resid /* garbage: don't ask */ 56 struct proc *b_proc; /* proc doing physical or swap I/O */ 57 }; 58 59 #define BQUEUES 3 /* number of free buffer queues */ 60 #define BQ_LOCKED 0 /* super-blocks &c */ 61 #define BQ_LRU 1 /* lru, useful buffers */ 62 #define BQ_AGE 2 /* rubbish */ 63 64 #ifdef KERNEL 65 struct buf *buf; /* the buffer pool itself */ 66 char *buffers; 67 int nbuf; 68 struct buf *swbuf; /* swap I/O headers */ 69 int nswbuf; 70 short *swsize; 71 int *swpf; 72 struct buf bfreelist[BQUEUES]; /* heads of available lists */ 73 struct buf bswlist; /* head of free swap header list */ 74 struct buf *bclnlist; /* head of cleaned page list */ 75 76 struct buf *alloc(); 77 struct buf *baddr(); 78 struct buf *getblk(); 79 struct buf *geteblk(); 80 struct buf *bread(); 81 struct buf *breada(); 82 83 unsigned minphys(); 84 #endif 85 86 /* 87 * These flags are kept in b_flags. 88 */ 89 #define B_WRITE 0x00000 /* non-read pseudo-flag */ 90 #define B_READ 0x00001 /* read when I/O occurs */ 91 #define B_DONE 0x00002 /* transaction finished */ 92 #define B_ERROR 0x00004 /* transaction aborted */ 93 #define B_BUSY 0x00008 /* not on av_forw/back list */ 94 #define B_PHYS 0x00010 /* physical IO */ 95 #define B_XXX 0x00020 /* was B_MAP, alloc UNIBUS on pdp-11 */ 96 #define B_WANTED 0x00040 /* issue wakeup when BUSY goes off */ 97 #define B_AGE 0x00080 /* delayed write for correct aging */ 98 #define B_ASYNC 0x00100 /* don't wait for I/O completion */ 99 #define B_DELWRI 0x00200 /* write at exit of avail list */ 100 #define B_TAPE 0x00400 /* this is a magtape (no bdwrite) */ 101 #define B_UAREA 0x00800 /* add u-area to a swap operation */ 102 #define B_PAGET 0x01000 /* page in/out of page table space */ 103 #define B_DIRTY 0x02000 /* dirty page to be pushed out async */ 104 #define B_PGIN 0x04000 /* pagein op, so swap() can count it */ 105 #define B_CACHE 0x08000 /* did bread find us in the cache ? */ 106 #define B_INVAL 0x10000 /* does not contain valid info */ 107 #define B_LOCKED 0x20000 /* locked in core (not reusable) */ 108 #define B_HEAD 0x40000 /* a buffer header, not a buffer */ 109