BSD 4_1_snap development
[unix-history] / sys / h / buf.h
CommitLineData
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 */
29struct bufhd
30{
31 long b_flags; /* see defines below */
32 struct buf *b_forw, *b_back; /* fwd/bkwd pointer in chain */
33};
34struct 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
65struct buf *buf; /* the buffer pool itself */
66char *buffers;
67int nbuf;
68struct buf *swbuf; /* swap I/O headers */
69int nswbuf;
70short *swsize;
71int *swpf;
72struct buf bfreelist[BQUEUES]; /* heads of available lists */
73struct buf bswlist; /* head of free swap header list */
74struct buf *bclnlist; /* head of cleaned page list */
75
76struct buf *alloc();
77struct buf *baddr();
78struct buf *getblk();
79struct buf *geteblk();
80struct buf *bread();
81struct buf *breada();
82
83unsigned 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 */