1 /* buf.h 3.4 06/07/80 */ 2 3 /* 4 * Each buffer in the pool is usually doubly linked into 2 lists: 5 * the device with which it is currently associated (always) 6 * and also on a list of blocks available for allocation 7 * for other use (usually). 8 * The latter list is kept in last-used order, and the two 9 * lists are doubly linked to make it easy to remove 10 * a buffer from one list when it was found by 11 * looking through the other. 12 * A buffer is on the available list, and is liable 13 * to be reassigned to another disk block, if and only 14 * if it is not marked BUSY. When a buffer is busy, the 15 * available-list pointers can be used for other purposes. 16 * Most drivers use the forward ptr as a link in their I/O 17 * active queue. 18 * A buffer header contains all the information required 19 * to perform I/O. 20 * Most of the routines which manipulate these things 21 * are in bio.c. 22 */ 23 struct buf 24 { 25 int b_flags; /* see defines below */ 26 struct buf *b_forw; /* headed by d_tab of conf.c */ 27 struct buf *b_back; /* " */ 28 struct buf *av_forw; /* position on free list, */ 29 struct buf *av_back; /* if not BUSY*/ 30 dev_t b_dev; /* major+minor device name */ 31 unsigned b_bcount; /* transfer count */ 32 union { 33 caddr_t b_addr; /* low order core address */ 34 int *b_words; /* words for clearing */ 35 struct filsys *b_filsys; /* superblocks */ 36 struct dinode *b_dino; /* ilist */ 37 daddr_t *b_daddr; /* indirect block */ 38 } b_un; 39 daddr_t b_blkno; /* block # on device */ 40 char b_xmem; /* high order core address */ 41 char b_error; /* returned after I/O */ 42 short b_hlink; /* hash links for buffer cache */ 43 unsigned int b_resid; /* words not transferred after error */ 44 struct proc *b_proc; /* process doing physical or swap I/O */ 45 }; 46 47 #ifdef KERNEL 48 extern struct buf buf[]; /* The buffer pool itself */ 49 extern struct buf swbuf[]; /* swap I/O headers */ 50 extern struct buf bfreelist; /* head of available list */ 51 extern struct buf bswlist; /* head of free swap header list */ 52 extern struct buf *bclnlist; /* head of cleaned page list */ 53 54 struct buf *alloc(); 55 struct buf *baddr(); 56 struct buf *getblk(); 57 struct buf *geteblk(); 58 struct buf *bread(); 59 struct buf *breada(); 60 61 unsigned minphys(); 62 #endif 63 64 #define NSWBUF 48 /* number of swap I/O headers */ 65 66 /* 67 * These flags are kept in b_flags. 68 */ 69 #define B_WRITE 0x0000 /* non-read pseudo-flag */ 70 #define B_READ 0x0001 /* read when I/O occurs */ 71 #define B_DONE 0x0002 /* transaction finished */ 72 #define B_ERROR 0x0004 /* transaction aborted */ 73 #define B_BUSY 0x0008 /* not on av_forw/back list */ 74 #define B_PHYS 0x0010 /* physical IO */ 75 #define B_MAP 0x0020 /* UNIBUS map allocated */ 76 #define B_WANTED 0x0040 /* issue wakeup when BUSY goes off */ 77 #define B_AGE 0x0080 /* delayed write for correct aging */ 78 #define B_ASYNC 0x0100 /* don't wait for I/O completion */ 79 #define B_DELWRI 0x0200 /* write at exit of avail list */ 80 #define B_TAPE 0x0400 /* this is a magtape (no bdwrite) */ 81 #define B_UAREA 0x0800 /* add u-area to a swap operation */ 82 #define B_PAGET 0x1000 /* page in/out of page table space */ 83 #define B_DIRTY 0x2000 /* dirty page to be pushed out async */ 84 #define B_PGIN 0x4000 /* pagein op, so swap() can count it */ 85 #define B_CACHE 0x8000 /* did bread find us in the cache ? */ 86 87 /* 88 * special redeclarations for 89 * the head of the queue per 90 * device driver. 91 */ 92 #define b_actf av_forw 93 #define b_actl av_back 94 #define b_active b_bcount 95 #define b_errcnt b_resid 96 #define b_pfcent b_resid 97