]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * This file contains Original Code and/or Modifications of Original Code | |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. The rights granted to you under the License | |
10 | * may not be used to create, or enable the creation or redistribution of, | |
11 | * unlawful or unlicensed copies of an Apple operating system, or to | |
12 | * circumvent, violate, or enable the circumvention or violation of, any | |
13 | * terms of an Apple operating system software license agreement. | |
14 | * | |
15 | * Please obtain a copy of the License at | |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. | |
17 | * | |
18 | * The Original Code and all software distributed under the License are | |
19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
23 | * Please see the License for the specific language governing rights and | |
24 | * limitations under the License. | |
25 | * | |
26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ | |
27 | */ | |
28 | /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ | |
29 | /* | |
30 | * Copyright (c) 1982, 1986, 1989, 1993 | |
31 | * The Regents of the University of California. All rights reserved. | |
32 | * (c) UNIX System Laboratories, Inc. | |
33 | * All or some portions of this file are derived from material licensed | |
34 | * to the University of California by American Telephone and Telegraph | |
35 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with | |
36 | * the permission of UNIX System Laboratories, Inc. | |
37 | * | |
38 | * Redistribution and use in source and binary forms, with or without | |
39 | * modification, are permitted provided that the following conditions | |
40 | * are met: | |
41 | * 1. Redistributions of source code must retain the above copyright | |
42 | * notice, this list of conditions and the following disclaimer. | |
43 | * 2. Redistributions in binary form must reproduce the above copyright | |
44 | * notice, this list of conditions and the following disclaimer in the | |
45 | * documentation and/or other materials provided with the distribution. | |
46 | * 3. All advertising materials mentioning features or use of this software | |
47 | * must display the following acknowledgement: | |
48 | * This product includes software developed by the University of | |
49 | * California, Berkeley and its contributors. | |
50 | * 4. Neither the name of the University nor the names of its contributors | |
51 | * may be used to endorse or promote products derived from this software | |
52 | * without specific prior written permission. | |
53 | * | |
54 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
55 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
56 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
57 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
58 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
59 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
60 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
61 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
62 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
63 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
64 | * SUCH DAMAGE. | |
65 | * | |
66 | * @(#)buf.h 8.9 (Berkeley) 3/30/95 | |
67 | */ | |
68 | ||
69 | #ifndef _SYS_BUF_H_ | |
70 | #define _SYS_BUF_H_ | |
71 | ||
72 | #include <sys/cdefs.h> | |
73 | #include <sys/kernel_types.h> | |
74 | #include <mach/memory_object_types.h> | |
75 | ||
76 | ||
77 | #define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ | |
78 | #define B_READ 0x00000001 /* Read buffer. */ | |
79 | #define B_ASYNC 0x00000002 /* Start I/O, do not wait. */ | |
80 | #define B_NOCACHE 0x00000004 /* Do not cache block after use. */ | |
81 | #define B_DELWRI 0x00000008 /* Delay I/O until buffer reused. */ | |
82 | #define B_LOCKED 0x00000010 /* Locked in core (not reusable). */ | |
83 | #define B_PHYS 0x00000020 /* I/O to user memory. */ | |
84 | #define B_CLUSTER 0x00000040 /* UPL based I/O generated by cluster layer */ | |
85 | #define B_PAGEIO 0x00000080 /* Page in/out */ | |
86 | #define B_META 0x00000100 /* buffer contains meta-data. */ | |
87 | #define B_RAW 0x00000200 /* Set by physio for raw transfers. */ | |
88 | #define B_FUA 0x00000400 /* Write-through disk cache(if supported) */ | |
89 | #define B_PASSIVE 0x00000800 /* PASSIVE I/Os are ignored by THROTTLE I/O */ | |
90 | /* | |
91 | * make sure to check when adding flags that | |
92 | * that the new flags don't overlap the definitions | |
93 | * in buf_internal.h | |
94 | */ | |
95 | ||
96 | __BEGIN_DECLS | |
97 | ||
98 | /* | |
99 | * mark the buffer associated with buf_t | |
100 | * as AGED with respect to the LRU cache | |
101 | */ | |
102 | void buf_markaged(buf_t); | |
103 | ||
104 | /* | |
105 | * mark the buffer associated with buf_t | |
106 | * as invalid... on release, it will go | |
107 | * directly to the free list | |
108 | */ | |
109 | void buf_markinvalid(buf_t); | |
110 | ||
111 | /* | |
112 | * mark the buffer assoicated with buf_t | |
113 | * as a delayed write... | |
114 | */ | |
115 | void buf_markdelayed(buf_t); | |
116 | ||
117 | /* | |
118 | * mark the buffer associated with buf_t | |
119 | * as having been interrupted... EINTR | |
120 | */ | |
121 | void buf_markeintr(buf_t); | |
122 | ||
123 | /* | |
124 | * mark the buffer associated with buf_t | |
125 | * for write through disk cache if device supports | |
126 | */ | |
127 | void buf_markfua(buf_t); | |
128 | ||
129 | /* | |
130 | * returns 1 if the buffer associated with buf_t | |
131 | * is set for write through disk cache... 0 if it does not | |
132 | */ | |
133 | int buf_fua(buf_t); | |
134 | ||
135 | /* | |
136 | * returns 1 if the buffer associated with buf_t | |
137 | * contains valid data... 0 if it does not | |
138 | */ | |
139 | int buf_valid(buf_t); | |
140 | ||
141 | /* | |
142 | * returns 1 if the buffer was already valid | |
143 | * in the cache... i.e. no I/O was performed | |
144 | * returns 0 otherwise | |
145 | */ | |
146 | int buf_fromcache(buf_t); | |
147 | ||
148 | /* | |
149 | * returns the UPL associated with buf_t | |
150 | */ | |
151 | void * buf_upl(buf_t); | |
152 | ||
153 | /* | |
154 | * returns the offset into the UPL | |
155 | * associated with buf_t which is to be | |
156 | * used as the base offset for this I/O | |
157 | */ | |
158 | uint32_t buf_uploffset(buf_t); | |
159 | ||
160 | /* | |
161 | * returns read credential associated with buf_t | |
162 | * a reference is taken which must be explicilty dropped | |
163 | */ | |
164 | ucred_t buf_rcred(buf_t); | |
165 | ||
166 | /* | |
167 | * returns write credential associated with buf_t | |
168 | * a reference is taken which must be explicilty dropped | |
169 | */ | |
170 | ucred_t buf_wcred(buf_t); | |
171 | ||
172 | /* | |
173 | * returns process handle associated with buf_t | |
174 | * i.e identity of task that issued the I/O | |
175 | */ | |
176 | proc_t buf_proc(buf_t); | |
177 | ||
178 | uint32_t buf_dirtyoff(buf_t); | |
179 | uint32_t buf_dirtyend(buf_t); | |
180 | void buf_setdirtyoff(buf_t, uint32_t); | |
181 | void buf_setdirtyend(buf_t, uint32_t); | |
182 | ||
183 | /* | |
184 | * return the errno value associated with buf_t | |
185 | */ | |
186 | errno_t buf_error(buf_t); | |
187 | ||
188 | /* | |
189 | * set errno on buf_t | |
190 | */ | |
191 | void buf_seterror(buf_t, errno_t); | |
192 | ||
193 | /* | |
194 | * set specified flags on buf_t | |
195 | * B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA | |
196 | */ | |
197 | void buf_setflags(buf_t, int32_t); | |
198 | ||
199 | /* | |
200 | * clear specified flags on buf_t | |
201 | * B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA | |
202 | */ | |
203 | void buf_clearflags(buf_t, int32_t); | |
204 | ||
205 | /* | |
206 | * return external flags associated with buf_t | |
207 | * B_CLUSTER/B_PHYS/B_LOCKED/B_DELWRI/B_ASYNC/B_READ/B_WRITE/B_META/B_PAGEIO/B_FUA | |
208 | */ | |
209 | int32_t buf_flags(buf_t); | |
210 | ||
211 | /* | |
212 | * clears I/O related flags (both internal and | |
213 | * external) associated with buf_t and allows | |
214 | * the following to be set... | |
215 | * B_READ/B_WRITE/B_ASYNC/B_NOCACHE | |
216 | */ | |
217 | void buf_reset(buf_t, int32_t); | |
218 | ||
219 | /* | |
220 | * insure that the data storage associated with buf_t | |
221 | * is addressable | |
222 | */ | |
223 | errno_t buf_map(buf_t, caddr_t *); | |
224 | ||
225 | /* | |
226 | * release our need to have the storage associated | |
227 | * with buf_t in an addressable state | |
228 | */ | |
229 | errno_t buf_unmap(buf_t); | |
230 | ||
231 | /* | |
232 | * set driver specific data for buf_t | |
233 | */ | |
234 | void buf_setdrvdata(buf_t, void *); | |
235 | ||
236 | /* | |
237 | * retrieve driver specific data associated with buf_t | |
238 | */ | |
239 | void * buf_drvdata(buf_t); | |
240 | ||
241 | /* | |
242 | * set fs specific data for buf_t | |
243 | */ | |
244 | void buf_setfsprivate(buf_t, void *); | |
245 | ||
246 | /* | |
247 | * retrieve driver specific data associated with buf_t | |
248 | */ | |
249 | void * buf_fsprivate(buf_t); | |
250 | ||
251 | /* | |
252 | * retrieve the phsyical block number associated with buf_t | |
253 | */ | |
254 | daddr64_t buf_blkno(buf_t); | |
255 | ||
256 | /* | |
257 | * retrieve the logical block number associated with buf_t | |
258 | * i.e. the block number derived from the file offset | |
259 | */ | |
260 | daddr64_t buf_lblkno(buf_t); | |
261 | ||
262 | /* | |
263 | * set the phsyical block number associated with buf_t | |
264 | */ | |
265 | void buf_setblkno(buf_t, daddr64_t); | |
266 | ||
267 | /* | |
268 | * set the logical block number associated with buf_t | |
269 | * i.e. the block number derived from the file offset | |
270 | */ | |
271 | void buf_setlblkno(buf_t, daddr64_t); | |
272 | ||
273 | /* | |
274 | * retrieve the count of valid bytes associated with buf_t | |
275 | */ | |
276 | uint32_t buf_count(buf_t); | |
277 | ||
278 | /* | |
279 | * retrieve the size of the data store assoicated with buf_t | |
280 | */ | |
281 | uint32_t buf_size(buf_t); | |
282 | ||
283 | /* | |
284 | * retrieve the residual I/O count assoicated with buf_t | |
285 | * i.e. number of bytes that have not yet been completed | |
286 | */ | |
287 | uint32_t buf_resid(buf_t); | |
288 | ||
289 | /* | |
290 | * set the count of bytes associated with buf_t | |
291 | * typically used to set the size of the I/O to be performed | |
292 | */ | |
293 | void buf_setcount(buf_t, uint32_t); | |
294 | ||
295 | /* | |
296 | * set the size of the buffer store associated with buf_t | |
297 | * typically used when providing private storage to buf_t | |
298 | */ | |
299 | void buf_setsize(buf_t, uint32_t); | |
300 | ||
301 | /* | |
302 | * set the size in bytes of the unfinished I/O associated with buf_t | |
303 | */ | |
304 | void buf_setresid(buf_t, uint32_t); | |
305 | ||
306 | /* | |
307 | * associate kernel addressable storage with buf_t | |
308 | */ | |
309 | void buf_setdataptr(buf_t, uintptr_t); | |
310 | ||
311 | /* | |
312 | * retrieve pointer to buffer associated with buf_t | |
313 | * if non-null, than guaranteed to be kernel addressable | |
314 | * size of buffer can be retrieved via buf_size | |
315 | * size of valid data can be retrieved via buf_count | |
316 | * if NULL, than use buf_map/buf_unmap to manage access to the underlying storage | |
317 | */ | |
318 | uintptr_t buf_dataptr(buf_t); | |
319 | ||
320 | /* | |
321 | * return the vnode_t associated with buf_t | |
322 | */ | |
323 | vnode_t buf_vnode(buf_t); | |
324 | ||
325 | /* | |
326 | * assign vnode_t to buf_t... the | |
327 | * device currently associated with | |
328 | * but_t is not changed. | |
329 | */ | |
330 | void buf_setvnode(buf_t, vnode_t); | |
331 | ||
332 | /* | |
333 | * return the dev_t associated with buf_t | |
334 | */ | |
335 | dev_t buf_device(buf_t); | |
336 | ||
337 | /* | |
338 | * assign the dev_t associated with vnode_t | |
339 | * to buf_t | |
340 | */ | |
341 | errno_t buf_setdevice(buf_t, vnode_t); | |
342 | ||
343 | errno_t buf_strategy(vnode_t, void *); | |
344 | ||
345 | /* | |
346 | * flags for buf_invalblkno | |
347 | */ | |
348 | #define BUF_WAIT 0x01 | |
349 | ||
350 | errno_t buf_invalblkno(vnode_t, daddr64_t, int); | |
351 | ||
352 | ||
353 | /* | |
354 | * return the callback function pointer | |
355 | * if the callback is still valid | |
356 | * returns NULL if a buffer that was not | |
357 | * allocated via buf_alloc is specified | |
358 | * or if a callback has not been set or | |
359 | * it has already fired... | |
360 | */ | |
361 | void * buf_callback(buf_t); | |
362 | ||
363 | /* | |
364 | * assign a one-shot callback function (driven from biodone) | |
365 | * to a buf_t allocated via buf_alloc... a caller specified | |
366 | * arg is passed to the callback function | |
367 | */ | |
368 | errno_t buf_setcallback(buf_t, void (*)(buf_t, void *), void *); | |
369 | ||
370 | /* | |
371 | * add a upl_t to a buffer allocated via buf_alloc | |
372 | * and set the offset into the upl_t (must be page | |
373 | * aligned). | |
374 | */ | |
375 | errno_t buf_setupl(buf_t, upl_t, uint32_t); | |
376 | ||
377 | /* | |
378 | * allocate a buf_t that is a clone of the buf_t | |
379 | * passed in, but whose I/O range is a subset... | |
380 | * if a callback routine is specified, it will | |
381 | * be called from buf_biodone with the bp and | |
382 | * arg specified. | |
383 | * it must be freed via buf_free | |
384 | */ | |
385 | buf_t buf_clone(buf_t, int, int, void (*)(buf_t, void *), void *); | |
386 | ||
387 | /* | |
388 | * allocate a buf_t associated with vnode_t | |
389 | * that has NO storage associated with it | |
390 | * but is suitable for use in issuing I/Os | |
391 | * after storage has been assigned via buf_setdataptr | |
392 | * or buf_addupl | |
393 | */ | |
394 | buf_t buf_alloc(vnode_t); | |
395 | ||
396 | /* | |
397 | * free a buf_t that was allocated via buf_alloc | |
398 | * any private storage associated with buf_t is the | |
399 | * responsiblity of the caller to release | |
400 | */ | |
401 | void buf_free(buf_t); | |
402 | ||
403 | /* | |
404 | * flags for buf_invalidateblks | |
405 | */ | |
406 | #define BUF_WRITE_DATA 0x0001 /* write data blocks first */ | |
407 | #define BUF_SKIP_META 0x0002 /* skip over metadata blocks */ | |
408 | ||
409 | int buf_invalidateblks(vnode_t, int, int, int); | |
410 | /* | |
411 | * flags for buf_flushdirtyblks and buf_iterate | |
412 | */ | |
413 | #define BUF_SKIP_NONLOCKED 0x01 | |
414 | #define BUF_SKIP_LOCKED 0x02 | |
415 | #define BUF_SCAN_CLEAN 0x04 /* scan only the clean buffers */ | |
416 | #define BUF_SCAN_DIRTY 0x08 /* scan only the dirty buffers */ | |
417 | #define BUF_NOTIFY_BUSY 0x10 /* notify the caller about the busy pages during the scan */ | |
418 | ||
419 | void buf_flushdirtyblks(vnode_t, int, int, const char *); | |
420 | void buf_iterate(vnode_t, int (*)(buf_t, void *), int, void *); | |
421 | ||
422 | #define BUF_RETURNED 0 | |
423 | #define BUF_RETURNED_DONE 1 | |
424 | #define BUF_CLAIMED 2 | |
425 | #define BUF_CLAIMED_DONE 3 | |
426 | ||
427 | /* | |
428 | * zero the storage associated with buf_t | |
429 | */ | |
430 | void buf_clear(buf_t); | |
431 | ||
432 | errno_t buf_bawrite(buf_t); | |
433 | errno_t buf_bdwrite(buf_t); | |
434 | errno_t buf_bwrite(buf_t); | |
435 | ||
436 | void buf_biodone(buf_t); | |
437 | errno_t buf_biowait(buf_t); | |
438 | void buf_brelse(buf_t); | |
439 | ||
440 | errno_t buf_bread(vnode_t, daddr64_t, int, ucred_t, buf_t *); | |
441 | errno_t buf_breadn(vnode_t, daddr64_t, int, daddr64_t *, int *, int, ucred_t, buf_t *); | |
442 | errno_t buf_meta_bread(vnode_t, daddr64_t, int, ucred_t, buf_t *); | |
443 | errno_t buf_meta_breadn(vnode_t, daddr64_t, int, daddr64_t *, int *, int, ucred_t, buf_t *); | |
444 | ||
445 | u_int minphys(buf_t bp); | |
446 | int physio(void (*)(buf_t), buf_t, dev_t, int , u_int (*)(buf_t), struct uio *, int ); | |
447 | ||
448 | ||
449 | /* | |
450 | * Flags for operation type in getblk() | |
451 | */ | |
452 | #define BLK_READ 0x01 /* buffer for read */ | |
453 | #define BLK_WRITE 0x02 /* buffer for write */ | |
454 | #define BLK_META 0x10 /* buffer for metadata */ | |
455 | /* | |
456 | * modifier for above flags... if set, getblk will only return | |
457 | * a bp that is already valid... i.e. found in the cache | |
458 | */ | |
459 | #define BLK_ONLYVALID 0x80000000 | |
460 | ||
461 | /* timeout is in msecs */ | |
462 | buf_t buf_getblk(vnode_t, daddr64_t, int, int, int, int); | |
463 | buf_t buf_geteblk(int); | |
464 | ||
465 | __END_DECLS | |
466 | ||
467 | ||
468 | /* Macros to clear/set/test flags. */ | |
469 | #define SET(t, f) (t) |= (f) | |
470 | #define CLR(t, f) (t) &= ~(f) | |
471 | #define ISSET(t, f) ((t) & (f)) | |
472 | ||
473 | ||
474 | #endif /* !_SYS_BUF_H_ */ |