1 | /* |
---|
2 | * Copyright (c) 1982, 1986, 1989, 1993 |
---|
3 | * The Regents of the University of California. All rights reserved. |
---|
4 | * (c) UNIX System Laboratories, Inc. |
---|
5 | * All or some portions of this file are derived from material licensed |
---|
6 | * to the University of California by American Telephone and Telegraph |
---|
7 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with |
---|
8 | * the permission of UNIX System Laboratories, Inc. |
---|
9 | * |
---|
10 | * Redistribution and use in source and binary forms, with or without |
---|
11 | * modification, are permitted provided that the following conditions |
---|
12 | * are met: |
---|
13 | * 1. Redistributions of source code must retain the above copyright |
---|
14 | * notice, this list of conditions and the following disclaimer. |
---|
15 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
16 | * notice, this list of conditions and the following disclaimer in the |
---|
17 | * documentation and/or other materials provided with the distribution. |
---|
18 | * 3. All advertising materials mentioning features or use of this software |
---|
19 | * must display the following acknowledgement: |
---|
20 | * This product includes software developed by the University of |
---|
21 | * California, Berkeley and its contributors. |
---|
22 | * 4. Neither the name of the University nor the names of its contributors |
---|
23 | * may be used to endorse or promote products derived from this software |
---|
24 | * without specific prior written permission. |
---|
25 | * |
---|
26 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
---|
27 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
28 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
29 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
---|
30 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
31 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
32 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
33 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
34 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
35 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
36 | * SUCH DAMAGE. |
---|
37 | * |
---|
38 | * @(#)buf.h 8.9 (Berkeley) 3/30/95 |
---|
39 | * $Id$ |
---|
40 | */ |
---|
41 | |
---|
42 | #ifndef _SYS_BUF_H_ |
---|
43 | #define _SYS_BUF_H_ |
---|
44 | |
---|
45 | #include <sys/queue.h> |
---|
46 | |
---|
47 | #define NOLIST ((struct buf *)0x87654321) |
---|
48 | |
---|
49 | struct buf; |
---|
50 | |
---|
51 | struct iodone_chain { |
---|
52 | long ic_prev_flags; |
---|
53 | void (*ic_prev_iodone) __P((struct buf *)); |
---|
54 | void *ic_prev_iodone_chain; |
---|
55 | struct { |
---|
56 | long ia_long; |
---|
57 | void *ia_ptr; |
---|
58 | } ic_args[5]; |
---|
59 | }; |
---|
60 | |
---|
61 | typedef TAILQ_HEAD(buf_queue_head, buf) buf_queue_head, *buf_queue_head_t; |
---|
62 | |
---|
63 | /* |
---|
64 | * The buffer header describes an I/O operation in the kernel. |
---|
65 | */ |
---|
66 | struct buf { |
---|
67 | LIST_ENTRY(buf) b_hash; /* Hash chain. */ |
---|
68 | LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */ |
---|
69 | TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */ |
---|
70 | TAILQ_ENTRY(buf) b_act; /* Device driver queue when active. *new* */ |
---|
71 | struct proc *b_proc; /* Associated proc; NULL if kernel. */ |
---|
72 | long b_flags; /* B_* flags. */ |
---|
73 | unsigned short b_qindex; /* buffer queue index */ |
---|
74 | unsigned char b_usecount; /* buffer use count */ |
---|
75 | int b_error; /* Errno value. */ |
---|
76 | long b_bufsize; /* Allocated buffer size. */ |
---|
77 | long b_bcount; /* Valid bytes in buffer. */ |
---|
78 | long b_resid; /* Remaining I/O. */ |
---|
79 | dev_t b_dev; /* Device associated with buffer. */ |
---|
80 | struct { |
---|
81 | caddr_t b_addr; /* Memory, superblocks, indirect etc. */ |
---|
82 | } b_un; |
---|
83 | caddr_t b_kvabase; /* base kva for buffer */ |
---|
84 | int b_kvasize; /* size of kva for buffer */ |
---|
85 | void *b_saveaddr; /* Original b_addr for physio. */ |
---|
86 | daddr_t b_lblkno; /* Logical block number. */ |
---|
87 | daddr_t b_blkno; /* Underlying physical block number. */ |
---|
88 | /* Function to call upon completion. */ |
---|
89 | void (*b_iodone) __P((struct buf *)); |
---|
90 | /* For nested b_iodone's. */ |
---|
91 | struct iodone_chain *b_iodone_chain; |
---|
92 | struct vnode *b_vp; /* Device vnode. */ |
---|
93 | int b_dirtyoff; /* Offset in buffer of dirty region. */ |
---|
94 | int b_dirtyend; /* Offset of end of dirty region. */ |
---|
95 | struct ucred *b_rcred; /* Read credentials reference. */ |
---|
96 | struct ucred *b_wcred; /* Write credentials reference. */ |
---|
97 | int b_validoff; /* Offset in buffer of valid region. */ |
---|
98 | int b_validend; /* Offset of end of valid region. */ |
---|
99 | daddr_t b_pblkno; /* physical block number */ |
---|
100 | caddr_t b_savekva; /* saved kva for transfer while bouncing */ |
---|
101 | void *b_driver1; /* for private use by the driver */ |
---|
102 | void *b_driver2; /* for private use by the driver */ |
---|
103 | void *b_spc; |
---|
104 | union cluster_info { |
---|
105 | TAILQ_HEAD(cluster_list_head, buf) cluster_head; |
---|
106 | TAILQ_ENTRY(buf) cluster_entry; |
---|
107 | } b_cluster; |
---|
108 | struct vm_page *b_pages[btoc(MAXPHYS)]; |
---|
109 | int b_npages; |
---|
110 | }; |
---|
111 | |
---|
112 | /* Device driver compatibility definitions. */ |
---|
113 | #define b_data b_un.b_addr /* b_un.b_addr is not changeable. */ |
---|
114 | |
---|
115 | /* |
---|
116 | * These flags are kept in b_flags. |
---|
117 | */ |
---|
118 | #define B_AGE 0x00000001 /* Move to age queue when I/O done. */ |
---|
119 | #define B_NEEDCOMMIT 0x00000002 /* Append-write in progress. */ |
---|
120 | #define B_ASYNC 0x00000004 /* Start I/O, do not wait. */ |
---|
121 | #define B_BAD 0x00000008 /* Bad block revectoring in progress. */ |
---|
122 | #define B_BUSY 0x00000010 /* I/O in progress. */ |
---|
123 | #define B_CACHE 0x00000020 /* Bread found us in the cache. */ |
---|
124 | #define B_CALL 0x00000040 /* Call b_iodone from biodone. */ |
---|
125 | #define B_DELWRI 0x00000080 /* Delay I/O until buffer reused. */ |
---|
126 | #define B_DIRTY 0x00000100 /* Dirty page to be pushed out async. */ |
---|
127 | #define B_DONE 0x00000200 /* I/O completed. */ |
---|
128 | #define B_EINTR 0x00000400 /* I/O was interrupted */ |
---|
129 | #define B_ERROR 0x00000800 /* I/O error occurred. */ |
---|
130 | #define B_GATHERED 0x00001000 /* LFS: already in a segment. */ |
---|
131 | #define B_INVAL 0x00002000 /* Does not contain valid info. */ |
---|
132 | #define B_LOCKED 0x00004000 /* Locked in core (not reusable). */ |
---|
133 | #define B_NOCACHE 0x00008000 /* Do not cache block after use. */ |
---|
134 | #define B_MALLOC 0x00010000 /* malloced b_data */ |
---|
135 | #define B_CLUSTEROK 0x00020000 /* Pagein op, so swap() can count it. */ |
---|
136 | #define B_PHYS 0x00040000 /* I/O to user memory. */ |
---|
137 | #define B_RAW 0x00080000 /* Set by physio for raw transfers. */ |
---|
138 | #define B_READ 0x00100000 /* Read buffer. */ |
---|
139 | #define B_TAPE 0x00200000 /* Magnetic tape I/O. */ |
---|
140 | #define B_RELBUF 0x00400000 /* Release VMIO buffer. */ |
---|
141 | #define B_WANTED 0x00800000 /* Process wants this buffer. */ |
---|
142 | #define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ |
---|
143 | #define B_WRITEINPROG 0x01000000 /* Write in progress. */ |
---|
144 | #define B_XXX 0x02000000 /* Debugging flag. */ |
---|
145 | #define B_PAGING 0x04000000 /* volatile paging I/O -- bypass VMIO */ |
---|
146 | #define B_ORDERED 0x08000000 /* Must guarantee I/O ordering */ |
---|
147 | #define B_VMIO 0x20000000 /* VMIO flag */ |
---|
148 | #define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ |
---|
149 | #define B_BOUNCE 0x80000000 /* bounce buffer flag */ |
---|
150 | |
---|
151 | /* |
---|
152 | * number of buffer hash entries |
---|
153 | */ |
---|
154 | #define BUFHSZ 512 |
---|
155 | |
---|
156 | /* |
---|
157 | * buffer hash table calculation, originally by David Greenman |
---|
158 | */ |
---|
159 | #define BUFHASH(vnp, bn) \ |
---|
160 | (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ]) |
---|
161 | |
---|
162 | /* |
---|
163 | * Definitions for the buffer free lists. |
---|
164 | */ |
---|
165 | #define BUFFER_QUEUES 6 /* number of free buffer queues */ |
---|
166 | |
---|
167 | extern LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash; |
---|
168 | extern TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES]; |
---|
169 | |
---|
170 | #define QUEUE_NONE 0 /* on no queue */ |
---|
171 | #define QUEUE_LOCKED 1 /* locked buffers */ |
---|
172 | #define QUEUE_LRU 2 /* useful buffers */ |
---|
173 | #define QUEUE_VMIO 3 /* VMIO buffers */ |
---|
174 | #define QUEUE_AGE 4 /* not-useful buffers */ |
---|
175 | #define QUEUE_EMPTY 5 /* empty buffer headers*/ |
---|
176 | |
---|
177 | /* |
---|
178 | * Zero out the buffer's data area. |
---|
179 | */ |
---|
180 | #define clrbuf(bp) { \ |
---|
181 | bzero((bp)->b_data, (u_int)(bp)->b_bcount); \ |
---|
182 | (bp)->b_resid = 0; \ |
---|
183 | } |
---|
184 | |
---|
185 | /* Flags to low-level allocation routines. */ |
---|
186 | #define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ |
---|
187 | #define B_SYNC 0x02 /* Do all allocations synchronously. */ |
---|
188 | |
---|
189 | #ifdef KERNEL |
---|
190 | extern int nbuf; /* The number of buffer headers */ |
---|
191 | extern struct buf *buf; /* The buffer headers. */ |
---|
192 | extern char *buffers; /* The buffer contents. */ |
---|
193 | extern int bufpages; /* Number of memory pages in the buffer pool. */ |
---|
194 | extern struct buf *swbuf; /* Swap I/O buffer headers. */ |
---|
195 | extern int nswbuf; /* Number of swap I/O buffer headers. */ |
---|
196 | extern TAILQ_HEAD(swqueue, buf) bswlist; |
---|
197 | |
---|
198 | void bufinit __P((void)); |
---|
199 | void bremfree __P((struct buf *)); |
---|
200 | int bread __P((struct vnode *, daddr_t, int, |
---|
201 | struct ucred *, struct buf **)); |
---|
202 | int breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int, |
---|
203 | struct ucred *, struct buf **)); |
---|
204 | int bwrite __P((struct buf *)); |
---|
205 | void bdwrite __P((struct buf *)); |
---|
206 | void bawrite __P((struct buf *)); |
---|
207 | int bowrite __P((struct buf *)); |
---|
208 | void brelse __P((struct buf *)); |
---|
209 | void bqrelse __P((struct buf *)); |
---|
210 | int vfs_bio_awrite __P((struct buf *)); |
---|
211 | struct buf * getpbuf __P((void)); |
---|
212 | struct buf *incore __P((struct vnode *, daddr_t)); |
---|
213 | struct buf *gbincore __P((struct vnode *, daddr_t)); |
---|
214 | int inmem __P((struct vnode *, daddr_t)); |
---|
215 | struct buf *getblk __P((struct vnode *, daddr_t, int, int, int)); |
---|
216 | struct buf *geteblk __P((int)); |
---|
217 | int allocbuf __P((struct buf *, int)); |
---|
218 | int biowait __P((struct buf *)); |
---|
219 | void biodone __P((struct buf *)); |
---|
220 | |
---|
221 | void cluster_callback __P((struct buf *)); |
---|
222 | int cluster_read __P((struct vnode *, u_quad_t, daddr_t, long, |
---|
223 | struct ucred *, struct buf **)); |
---|
224 | int cluster_wbuild __P((struct vnode *, long, daddr_t, int)); |
---|
225 | void cluster_write __P((struct buf *, u_quad_t)); |
---|
226 | int physio __P((void (*)(struct buf *), struct buf *, dev_t, |
---|
227 | int, u_int (*)(struct buf *), struct uio *)); |
---|
228 | u_int minphys __P((struct buf *)); |
---|
229 | void vfs_bio_clrbuf __P((struct buf *)); |
---|
230 | void vfs_busy_pages __P((struct buf *, int clear_modify)); |
---|
231 | void vfs_unbusy_pages(struct buf *); |
---|
232 | void vwakeup __P((struct buf *)); |
---|
233 | void vmapbuf __P((struct buf *)); |
---|
234 | void vunmapbuf __P((struct buf *)); |
---|
235 | void relpbuf __P((struct buf *)); |
---|
236 | void brelvp __P((struct buf *)); |
---|
237 | void bgetvp __P((struct vnode *, struct buf *)); |
---|
238 | void pbgetvp __P((struct vnode *, struct buf *)); |
---|
239 | void pbrelvp __P((struct buf *)); |
---|
240 | void reassignbuf __P((struct buf *, struct vnode *)); |
---|
241 | struct buf *trypbuf __P((void)); |
---|
242 | void vm_bounce_alloc __P((struct buf *)); |
---|
243 | void vm_bounce_free __P((struct buf *)); |
---|
244 | vm_offset_t vm_bounce_kva_alloc __P((int)); |
---|
245 | void vm_bounce_kva_alloc_free __P((vm_offset_t, int)); |
---|
246 | #endif /* KERNEL */ |
---|
247 | |
---|
248 | #endif /* !_SYS_BUF_H_ */ |
---|