]>
git.saurik.com Git - apple/xnu.git/blob - bsd/sys/buf.h
2 * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
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.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
28 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
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.
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
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.
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
66 * @(#)buf.h 8.9 (Berkeley) 3/30/95
72 #include <sys/cdefs.h>
73 #include <sys/kernel_types.h>
74 #include <mach/memory_object_types.h>
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 */
91 * make sure to check when adding flags that
92 * that the new flags don't overlap the definitions
99 * mark the buffer associated with buf_t
100 * as AGED with respect to the LRU cache
102 void buf_markaged(buf_t
);
105 * mark the buffer associated with buf_t
106 * as invalid... on release, it will go
107 * directly to the free list
109 void buf_markinvalid(buf_t
);
112 * mark the buffer assoicated with buf_t
113 * as a delayed write...
115 void buf_markdelayed(buf_t
);
118 * mark the buffer associated with buf_t
119 * as having been interrupted... EINTR
121 void buf_markeintr(buf_t
);
124 * mark the buffer associated with buf_t
125 * for write through disk cache if device supports
127 void buf_markfua(buf_t
);
130 * returns 1 if the buffer associated with buf_t
131 * is set for write through disk cache... 0 if it does not
136 * returns 1 if the buffer associated with buf_t
137 * contains valid data... 0 if it does not
139 int buf_valid(buf_t
);
142 * returns 1 if the buffer was already valid
143 * in the cache... i.e. no I/O was performed
144 * returns 0 otherwise
146 int buf_fromcache(buf_t
);
149 * returns the UPL associated with buf_t
151 void * buf_upl(buf_t
);
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
158 uint32_t buf_uploffset(buf_t
);
161 * returns read credential associated with buf_t
162 * a reference is taken which must be explicilty dropped
164 ucred_t
buf_rcred(buf_t
);
167 * returns write credential associated with buf_t
168 * a reference is taken which must be explicilty dropped
170 ucred_t
buf_wcred(buf_t
);
173 * returns process handle associated with buf_t
174 * i.e identity of task that issued the I/O
176 proc_t
buf_proc(buf_t
);
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);
184 * return the errno value associated with buf_t
186 errno_t
buf_error(buf_t
);
191 void buf_seterror(buf_t
, errno_t
);
194 * set specified flags on buf_t
195 * B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA
197 void buf_setflags(buf_t
, int32_t);
200 * clear specified flags on buf_t
201 * B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA
203 void buf_clearflags(buf_t
, int32_t);
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
209 int32_t buf_flags(buf_t
);
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
217 void buf_reset(buf_t
, int32_t);
220 * insure that the data storage associated with buf_t
223 errno_t
buf_map(buf_t
, caddr_t
*);
226 * release our need to have the storage associated
227 * with buf_t in an addressable state
229 errno_t
buf_unmap(buf_t
);
232 * set driver specific data for buf_t
234 void buf_setdrvdata(buf_t
, void *);
237 * retrieve driver specific data associated with buf_t
239 void * buf_drvdata(buf_t
);
242 * set fs specific data for buf_t
244 void buf_setfsprivate(buf_t
, void *);
247 * retrieve driver specific data associated with buf_t
249 void * buf_fsprivate(buf_t
);
252 * retrieve the phsyical block number associated with buf_t
254 daddr64_t
buf_blkno(buf_t
);
257 * retrieve the logical block number associated with buf_t
258 * i.e. the block number derived from the file offset
260 daddr64_t
buf_lblkno(buf_t
);
263 * set the phsyical block number associated with buf_t
265 void buf_setblkno(buf_t
, daddr64_t
);
268 * set the logical block number associated with buf_t
269 * i.e. the block number derived from the file offset
271 void buf_setlblkno(buf_t
, daddr64_t
);
274 * retrieve the count of valid bytes associated with buf_t
276 uint32_t buf_count(buf_t
);
279 * retrieve the size of the data store assoicated with buf_t
281 uint32_t buf_size(buf_t
);
284 * retrieve the residual I/O count assoicated with buf_t
285 * i.e. number of bytes that have not yet been completed
287 uint32_t buf_resid(buf_t
);
290 * set the count of bytes associated with buf_t
291 * typically used to set the size of the I/O to be performed
293 void buf_setcount(buf_t
, uint32_t);
296 * set the size of the buffer store associated with buf_t
297 * typically used when providing private storage to buf_t
299 void buf_setsize(buf_t
, uint32_t);
302 * set the size in bytes of the unfinished I/O associated with buf_t
304 void buf_setresid(buf_t
, uint32_t);
307 * associate kernel addressable storage with buf_t
309 void buf_setdataptr(buf_t
, uintptr_t);
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
318 uintptr_t buf_dataptr(buf_t
);
321 * return the vnode_t associated with buf_t
323 vnode_t
buf_vnode(buf_t
);
326 * assign vnode_t to buf_t... the
327 * device currently associated with
328 * but_t is not changed.
330 void buf_setvnode(buf_t
, vnode_t
);
333 * return the dev_t associated with buf_t
335 dev_t
buf_device(buf_t
);
338 * assign the dev_t associated with vnode_t
341 errno_t
buf_setdevice(buf_t
, vnode_t
);
343 errno_t
buf_strategy(vnode_t
, void *);
346 * flags for buf_invalblkno
348 #define BUF_WAIT 0x01
350 errno_t
buf_invalblkno(vnode_t
, daddr64_t
, int);
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...
361 void * buf_callback(buf_t
);
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
368 errno_t
buf_setcallback(buf_t
, void (*)(buf_t
, void *), void *);
371 * add a upl_t to a buffer allocated via buf_alloc
372 * and set the offset into the upl_t (must be page
375 errno_t
buf_setupl(buf_t
, upl_t
, uint32_t);
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
383 * it must be freed via buf_free
385 buf_t
buf_clone(buf_t
, int, int, void (*)(buf_t
, void *), void *);
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
394 buf_t
buf_alloc(vnode_t
);
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
401 void buf_free(buf_t
);
404 * flags for buf_invalidateblks
406 #define BUF_WRITE_DATA 0x0001 /* write data blocks first */
407 #define BUF_SKIP_META 0x0002 /* skip over metadata blocks */
409 int buf_invalidateblks(vnode_t
, int, int, int);
411 * flags for buf_flushdirtyblks and buf_iterate
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 */
419 void buf_flushdirtyblks(vnode_t
, int, int, const char *);
420 void buf_iterate(vnode_t
, int (*)(buf_t
, void *), int, void *);
422 #define BUF_RETURNED 0
423 #define BUF_RETURNED_DONE 1
424 #define BUF_CLAIMED 2
425 #define BUF_CLAIMED_DONE 3
428 * zero the storage associated with buf_t
430 void buf_clear(buf_t
);
432 errno_t
buf_bawrite(buf_t
);
433 errno_t
buf_bdwrite(buf_t
);
434 errno_t
buf_bwrite(buf_t
);
436 void buf_biodone(buf_t
);
437 errno_t
buf_biowait(buf_t
);
438 void buf_brelse(buf_t
);
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
*);
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 );
450 * Flags for operation type in getblk()
452 #define BLK_READ 0x01 /* buffer for read */
453 #define BLK_WRITE 0x02 /* buffer for write */
454 #define BLK_META 0x10 /* buffer for metadata */
456 * modifier for above flags... if set, getblk will only return
457 * a bp that is already valid... i.e. found in the cache
459 #define BLK_ONLYVALID 0x80000000
461 /* timeout is in msecs */
462 buf_t
buf_getblk(vnode_t
, daddr64_t
, int, int, int, int);
463 buf_t
buf_geteblk(int);
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))
474 #endif /* !_SYS_BUF_H_ */