Commit | Line | Data |
---|---|---|
c43e2192 C |
1 | /* buf.h 4.13 81/05/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 0x000000 /* non-read pseudo-flag */ | |
90 | #define B_READ 0x000001 /* read when I/O occurs */ | |
91 | #define B_DONE 0x000002 /* transaction finished */ | |
92 | #define B_ERROR 0x000004 /* transaction aborted */ | |
93 | #define B_BUSY 0x000008 /* not on av_forw/back list */ | |
94 | #define B_PHYS 0x000010 /* physical IO */ | |
95 | #define B_XXX 0x000020 /* was B_MAP, alloc UNIBUS on pdp-11 */ | |
96 | #define B_WANTED 0x000040 /* issue wakeup when BUSY goes off */ | |
97 | #define B_AGE 0x000080 /* delayed write for correct aging */ | |
98 | #define B_ASYNC 0x000100 /* don't wait for I/O completion */ | |
99 | #define B_DELWRI 0x000200 /* write at exit of avail list */ | |
100 | #define B_TAPE 0x000400 /* this is a magtape (no bdwrite) */ | |
101 | #define B_UAREA 0x000800 /* add u-area to a swap operation */ | |
102 | #define B_PAGET 0x001000 /* page in/out of page table space */ | |
103 | #define B_DIRTY 0x002000 /* dirty page to be pushed out async */ | |
104 | #define B_PGIN 0x004000 /* pagein op, so swap() can count it */ | |
105 | #define B_CACHE 0x008000 /* did bread find us in the cache ? */ | |
106 | #define B_INVAL 0x010000 /* does not contain valid info */ | |
107 | #define B_LOCKED 0x020000 /* locked in core (not reusable) */ | |
108 | #define B_HEAD 0x040000 /* a buffer header, not a buffer */ | |
109 | #define B_BAD 0x100000 /* bad block revectoring in progress */ |