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