|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
1.1.1.3 ! root 33: * from: @(#)buf.h 7.11 (Berkeley) 5/9/90
! 34: * buf.h,v 1.9 1993/07/19 16:39:23 cgd Exp
1.1 root 35: */
36:
1.1.1.3 ! root 37: #ifndef _SYS_BUF_H_
! 38: #define _SYS_BUF_H_
! 39:
1.1 root 40: /*
41: * The header for buffers in the buffer pool and otherwise used
42: * to describe a block i/o request is given here.
43: *
44: * Each buffer in the pool is usually doubly linked into 2 lists:
45: * hashed into a chain by <dev,blkno> so it can be located in the cache,
46: * and (usually) on (one of several) queues. These lists are circular and
47: * doubly linked for easy removal.
48: *
49: * There are currently three queues for buffers:
50: * one for buffers which must be kept permanently (super blocks)
51: * one for buffers containing ``useful'' information (the cache)
52: * one for buffers containing ``non-useful'' information
53: * (and empty buffers, pushed onto the front)
54: * The latter two queues contain the buffers which are available for
55: * reallocation, are kept in lru order. When not on one of these queues,
56: * the buffers are ``checked out'' to drivers which use the available list
57: * pointers to keep track of them in their i/o active queues.
58: */
59:
60: /*
61: * Bufhd structures used at the head of the hashed buffer queues.
62: * We only need three words for these, so this abbreviated
63: * definition saves some space.
64: */
65: struct bufhd
66: {
67: long b_flags; /* see defines below */
68: struct buf *b_forw, *b_back; /* fwd/bkwd pointer in chain */
69: };
70: struct buf
71: {
72: long b_flags; /* too much goes here to describe */
73: struct buf *b_forw, *b_back; /* hash chain (2 way street) */
74: struct buf *av_forw, *av_back; /* position on free list if not BUSY */
75: struct buf *b_blockf, **b_blockb;/* associated vnode */
76: #define b_actf av_forw /* alternate names for driver queue */
77: #define b_actl av_back /* head - isn't history wonderful */
78: long b_bcount; /* transfer count */
79: long b_bufsize; /* size of allocated buffer */
80: #define b_active b_bcount /* driver queue head: drive active */
81: short b_error; /* returned after I/O */
82: dev_t b_dev; /* major+minor device name */
83: union {
84: caddr_t b_addr; /* low order core address */
85: int *b_words; /* words for clearing */
86: struct fs *b_fs; /* superblocks */
87: struct csum *b_cs; /* superblock summary information */
88: struct cg *b_cg; /* cylinder group block */
89: struct dinode *b_dino; /* ilist */
90: daddr_t *b_daddr; /* indirect block */
91: } b_un;
92: daddr_t b_lblkno; /* logical block number */
93: daddr_t b_blkno; /* block # on device */
94: long b_resid; /* words not transferred after error */
95: #define b_errcnt b_resid /* while i/o in progress: # retries */
96: struct proc *b_proc; /* proc doing physical or swap I/O */
97: int (*b_iodone)(); /* function called by iodone */
98: struct vnode *b_vp; /* vnode for dev */
99: int b_pfcent; /* center page when swapping cluster */
100: struct ucred *b_rcred; /* ref to read credentials */
101: struct ucred *b_wcred; /* ref to write credendtials */
102: int b_dirtyoff; /* offset in buffer of dirty region */
103: int b_dirtyend; /* offset of end of dirty region */
104: caddr_t b_saveaddr; /* original b_addr for PHYSIO */
105: };
106:
107: #define BQUEUES 4 /* number of free buffer queues */
108:
109: #define BQ_LOCKED 0 /* super-blocks &c */
110: #define BQ_LRU 1 /* lru, useful buffers */
111: #define BQ_AGE 2 /* rubbish */
112: #define BQ_EMPTY 3 /* buffer headers with no memory */
113:
114: #ifdef KERNEL
115: #define BUFHSZ 512
116: #define RND (MAXBSIZE/DEV_BSIZE)
1.1.1.2 root 117: /* 20 Aug 92 BUFHASH*/
1.1 root 118: #if ((BUFHSZ&(BUFHSZ-1)) == 0)
119: #define BUFHASH(dvp, dblkno) \
1.1.1.2 root 120: ((struct buf *)&bufhash[((int)(dvp)/sizeof(struct vnode)+(int)(dblkno))&(BUFHSZ-1)])
1.1 root 121: #else
122: #define BUFHASH(dvp, dblkno) \
1.1.1.2 root 123: ((struct buf *)&bufhash[((int)(dvp)/sizeof(struct vnode)+(int)(dblkno)) % BUFHSZ])
1.1 root 124: #endif
125:
1.1.1.3 ! root 126: extern struct buf *buf; /* the buffer pool itself */
! 127: extern char *buffers;
! 128: extern int nbuf; /* number of buffer headers */
! 129: extern int bufpages; /* number of memory pages in the buffer pool */
! 130: extern struct buf *swbuf; /* swap I/O headers */
! 131: extern int nswbuf;
! 132: extern struct bufhd bufhash[BUFHSZ]; /* heads of hash lists */
! 133: extern struct buf bfreelist[BQUEUES]; /* heads of available lists */
! 134: extern struct buf bswlist; /* head of free swap header list */
! 135: extern struct buf *bclnlist; /* head of cleaned page list */
! 136:
! 137: void bufinit __P((void));
! 138: int bread __P((struct vnode *, daddr_t, int, struct ucred *,
! 139: struct buf **));
! 140: int breada __P((struct vnode *, daddr_t, int, daddr_t, int,
! 141: struct ucred *, struct buf **));
! 142: int bwrite __P((struct buf *));
! 143: void bdwrite __P((struct buf *));
! 144: void bawrite __P((struct buf *));
! 145: void brelse __P((struct buf *));
! 146: struct buf *incore __P((struct vnode *, daddr_t));
! 147: struct buf *getblk __P((struct vnode *, daddr_t, int));
! 148: struct buf *geteblk __P((int));
! 149: void allocbuf __P((struct buf *, int));
! 150: int biowait __P((struct buf *));
! 151: void biodone __P((struct buf *));
1.1 root 152:
1.1.1.3 ! root 153: u_int minphys __P((struct buf *));
1.1 root 154: #endif
155:
156: /*
157: * These flags are kept in b_flags.
158: */
159: #define B_WRITE 0x000000 /* non-read pseudo-flag */
160: #define B_READ 0x000001 /* read when I/O occurs */
161: #define B_DONE 0x000002 /* transaction finished */
162: #define B_ERROR 0x000004 /* transaction aborted */
163: #define B_BUSY 0x000008 /* not on av_forw/back list */
164: #define B_PHYS 0x000010 /* physical IO */
165: #define B_XXX 0x000020 /* was B_MAP, alloc UNIBUS on pdp-11 */
166: #define B_WANTED 0x000040 /* issue wakeup when BUSY goes off */
167: #define B_AGE 0x000080 /* delayed write for correct aging */
168: #define B_ASYNC 0x000100 /* don't wait for I/O completion */
169: #define B_DELWRI 0x000200 /* write at exit of avail list */
170: #define B_TAPE 0x000400 /* this is a magtape (no bdwrite) */
1.1.1.2 root 171: #define B_VMPAGE 0x000800 /* buffer from virtual memory */
172: #define B_MALLOC 0x001000 /* buffer from malloc space */
1.1 root 173: #define B_DIRTY 0x002000 /* dirty page to be pushed out async */
174: #define B_PGIN 0x004000 /* pagein op, so swap() can count it */
175: #define B_CACHE 0x008000 /* did bread find us in the cache ? */
176: #define B_INVAL 0x010000 /* does not contain valid info */
177: #define B_LOCKED 0x020000 /* locked in core (not reusable) */
178: #define B_HEAD 0x040000 /* a buffer header, not a buffer */
179: #define B_BAD 0x100000 /* bad block revectoring in progress */
180: #define B_CALL 0x200000 /* call b_iodone from iodone */
181: #define B_RAW 0x400000 /* set by physio for raw transfers */
182: #define B_NOCACHE 0x800000 /* do not cache block after use */
183:
184: /*
185: * Insq/Remq for the buffer hash lists.
186: */
187: #define bremhash(bp) { \
188: (bp)->b_back->b_forw = (bp)->b_forw; \
189: (bp)->b_forw->b_back = (bp)->b_back; \
190: }
191: #define binshash(bp, dp) { \
192: (bp)->b_forw = (dp)->b_forw; \
193: (bp)->b_back = (dp); \
194: (dp)->b_forw->b_back = (bp); \
195: (dp)->b_forw = (bp); \
196: }
197:
198: /*
199: * Insq/Remq for the buffer free lists.
200: */
201: #define bremfree(bp) { \
202: (bp)->av_back->av_forw = (bp)->av_forw; \
203: (bp)->av_forw->av_back = (bp)->av_back; \
204: }
205: #define binsheadfree(bp, dp) { \
206: (dp)->av_forw->av_back = (bp); \
207: (bp)->av_forw = (dp)->av_forw; \
208: (dp)->av_forw = (bp); \
209: (bp)->av_back = (dp); \
210: }
211: #define binstailfree(bp, dp) { \
212: (dp)->av_back->av_forw = (bp); \
213: (bp)->av_back = (dp)->av_back; \
214: (dp)->av_back = (bp); \
215: (bp)->av_forw = (dp); \
216: }
217:
218: #define iodone biodone
219: #define iowait biowait
220:
221: /*
222: * Zero out a buffer's data portion.
223: */
224: #define clrbuf(bp) { \
1.1.1.2 root 225: bzero((bp)->b_un.b_addr, (unsigned)(bp)->b_bcount); \
1.1 root 226: (bp)->b_resid = 0; \
227: }
228: #define B_CLRBUF 0x1 /* request allocated buffer be cleared */
229: #define B_SYNC 0x2 /* do all allocations synchronously */
1.1.1.3 ! root 230:
! 231: #endif /* !_SYS_BUF_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.