xref: /original-bsd/sys/sys/buf.h (revision 56abee86)
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