buf.h |
Includes: |
<sys/cdefs.h> <sys/kernel_types.h> <sys/ucred.h> <mach/memory_object_types.h> |
Use the links in the table of contents to the left to access the documentation.
Allocate an uninitialized buffer.
Start an asychronous write on a buffer.
Mark a buffer for delayed write.
Mark an I/O as completed.
Wait for I/O on a buffer to complete.
Get physical block number associated with a buffer, in the sense of VNOP_BLOCKMAP.
Synchronously read a block of a file.
Read a block from a file with read-ahead.
Release any claim to a buffer, sending it back to free lists.
Write a buffer's data to backing store.
Get the function set to be called when I/O on a buffer completes.
Zero out the storage associated with a buffer.
Clear flags on a buffer. @discussion: buffer_flags &= ~flags
Clone a buffer with a restricted range and an optional callback.
Get count of valid bytes in a buffer. This may be less than the space allocated to the buffer.
Get the address at which a buffer's data is stored; for iobufs, this must be set with buf_setdataptr(). See buf_map().
Get the device ID associated with a buffer.
Get the ending offset of the dirty region associated with a buffer.
Get the starting offset of the dirty region associated with a buffer.
Get driver-specific data from a buffer.
Get the error value associated with a buffer.
Get flags set on a buffer.
Write dirty file blocks to disk.
Free a buffer that was allocated with buf_alloc().
Check if a buffer's data was found in core.
Get filesystem-specific data from a buffer.
Check if a buffer is marked for write through disk caches.
Traditional buffer cache routine to get a buffer corresponding to a logical block in a file.
Get a metadata buffer which is marked invalid and not associated with any vnode.
Invalidate a filesystem logical block in a file.
Invalidate all the blocks associated with a vnode.
Perform some operation on all buffers associated with a vnode.
Get logical block number associated with a buffer.
Get virtual mappings for buffer data.
Mark a buffer as "aged," i.e. as a good candidate to be discarded and reused after buf_brelse().
Mark a buffer as a delayed write: mark it dirty without actually scheduling I/O.
Mark a buffer as having been interrupted during I/O.
Mark a buffer for write through disk cache, if disk supports it.
Mark a buffer as not having valid data and being ready for immediate reuse after buf_brelse().
Synchronously read a metadata block of a file.
Read a metadata block from a file with read-ahead.
Get the process associated with this buffer.
Get the credential associated with a buffer for reading.
Reset I/O flag state on a buffer.
Get a count of bytes which were not consumed by an I/O on a buffer.
Set physical block number associated with a buffer.
Set a function to be called once when I/O on a buffer completes.
Set count of valid bytes in a buffer. This may be less than the space allocated to the buffer.
Set the address at which a buffer's data will be stored.
Set the device associated with a buffer.
Set the ending offset of the dirty region associated with a buffer.
Set the starting offset of the dirty region associated with a buffer.
Get driver-specific data from a buffer.
Set driver-specific data on a buffer.
Set an error value on a buffer.
Set flags on a buffer. @discussion: buffer_flags |= flags
Set filesystem-specific data on a buffer.
Set logical block number associated with a buffer.
Set a count of bytes outstanding for I/O in a buffer.
Set size of data region allocated to a buffer.
Set the UPL (Universal Page List), and offset therein, on a buffer.
Set the vnode associated with a buffer.
Get size of data region allocated to a buffer.
Pass an I/O request for a buffer down to the device layer.
Release mappings for buffer data.
Get the upl (Universal Page List) associated with a buffer.
Get the offset into a UPL at which this buffer begins.
Check if a buffer contains valid data.
Get the vnode associated with a buffer.
Get the credential associated with a buffer for writing.
Adjust a buffer's count to be no more than maximum physical I/O transfer size for the host architecture.
Perform I/O on a device to/from target memory described by a uio.
buf_alloc |
Allocate an uninitialized buffer.
buf_t buf_alloc( vnode_t);
vp
vnode to associate with the buffer: optionally NULL. If vp is a device file, then the buffer's associated device will be set. If vp is NULL, it can be set later with buf_setvnode().
New buffer.
A buffer returned by buf_alloc() is marked as busy and as an iobuf; it has no storage set up and must be set up using buf_setdataptr() or buf_setupl()/buf_map().
buf_bawrite |
Start an asychronous write on a buffer.
errno_t buf_bawrite( buf_t);
bp
The buffer on which to initiate I/O.
throttle
If "throttle" is nonzero and more than VNODE_ASYNC_THROTTLE writes are in progress on this file, buf_bawrite() will block until the write count drops below VNODE_ASYNC_THROTTLE. If "throttle" is zero and the write count is high, it will fail with EWOULDBLOCK; the caller can decide whether to make a blocking call or pursue other opportunities.
EWOULDBLOCK if write count is high and "throttle" is zero; otherwise, errors from VNOP_BWRITE.
Calls VNOP_BWRITE to start the process of propagating an asynchronous write down to the device layer. Callers can wait for writes to complete at their discretion using buf_biowait(). When this function is called, data should already have been written to the buffer's data region.
buf_bdwrite |
Mark a buffer for delayed write.
errno_t buf_bdwrite( buf_t);
bp
The buffer to mark for delayed write.
return_error
If the number of pending delayed writes systemwide is larger than an internal limit, return EAGAIN rather than doing an asynchronous write.
EAGAIN for return_error != 0 case, 0 for succeess, errors from buf_bawrite.
Marks a buffer as waiting for delayed write and the current I/O as complete; data will be written to backing store before the buffer is reused, but it will not be queued for I/O immediately. Note that for buffers allocated with buf_alloc(), there are no such guarantees; you must take care of your own flushing to disk. If the number of delayed writes pending on the system is greater than an internal limit and the caller has not requested otherwise [see return_error] , buf_bdwrite() will unilaterally launch an asynchronous I/O with buf_bawrite() to keep the pile of delayed writes from getting too large.
buf_biodone |
Mark an I/O as completed.
void buf_biodone( buf_t);
bp
The buffer to mark as done with I/O.
void.
buf_biodone() should be called by whosoever decides that an I/O on a buffer is complete; for example, IOStorageFamily. It clears the dirty flag on a buffer and signals on the vnode that a write has completed with vnode_writedone(). If a callout or filter has been set on the buffer, that function is called. In the case of a callout, that function is expected to take care of cleaning up and freeing the buffer. Otherwise, if the buffer is marked B_ASYNC (e.g. it was passed to buf_bawrite()), then buf_biodone() considers itself justified in calling buf_brelse() to return it to free lists--no one is waiting for it. Finally, waiters on the bp (e.g. in buf_biowait()) are woken up.
buf_biowait |
Wait for I/O on a buffer to complete.
errno_t buf_biowait( buf_t);
bp
The buffer to wait on.
0 for a successful wait; nonzero the buffer has been marked as EINTR or had an error set on it.
Waits for I/O on a buffer to finish, as marked by a buf_biodone() call.
buf_blkno |
Get physical block number associated with a buffer, in the sense of VNOP_BLOCKMAP.
daddr64_t buf_blkno( buf_t);
bp
Buffer whose physical block number to get.
Block number.
When a buffer's physical block number is the same is its logical block number, then the physical block number is considered uninitialized. A physical block number of -1 indicates that there is no valid physical mapping (e.g. the logical block is invalid or corresponds to a sparse region in a file). Physical block number is normally set by the cluster layer or by buf_getblk().
buf_bread |
Synchronously read a block of a file.
errno_t buf_bread( vnode_t, daddr64_t, int, kauth_cred_t, buf_t *);
vp
The file from which to read.
blkno
The logical (filesystem) block number to read.
size
Size of block; do not use for sizes > 4K.
cred
Credential to store and use for reading from disk if data are not already in core.
bpp
Destination pointer for buffer.
0 for success, or an error from buf_biowait().
buf_bread() is the traditional way to read a single logical block of a file through the buffer cache. It tries to find the buffer and corresponding page(s) in core, calls VNOP_STRATEGY if necessary to bring the data into memory, and waits for I/O to complete. It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster routines for large reads. Indeed, the cluster layer is a more efficient choice for reading DATA unless you need some finely-tuned semantics that it cannot provide.
buf_breadn |
Read a block from a file with read-ahead.
errno_t buf_breadn( vnode_t, daddr64_t, int, daddr64_t *, int *, int, kauth_cred_t, buf_t *);
vp
The file from which to read.
blkno
The logical (filesystem) block number to read synchronously.
size
Size of block; do not use for sizes > 4K.
rablks
Array of logical block numbers for asynchronous read-aheads.
rasizes
Array of block sizes for asynchronous read-aheads, each index corresponding to same index in "rablks."
nrablks
Number of entries in read-ahead arrays.
cred
Credential to store and use for reading from disk if data are not already in core.
bpp
Destination pointer for buffer.
0 for success, or an error from buf_biowait().
buf_breadn() reads one block synchronously in the style of buf_bread() and fires off a specified set of asynchronous reads to improve the likelihood of future cache hits. It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster routines for large reads. Indeed, the cluster layer is a more efficient choice for reading DATA unless you need some finely-tuned semantics that it cannot provide.
buf_brelse |
Release any claim to a buffer, sending it back to free lists.
void buf_brelse( buf_t);
bp
The buffer to release. @retrn void.
buf_brelse() cleans up buffer state and releases a buffer to the free lists. If the buffer is not marked invalid and its pages are dirty (e.g. a delayed write was made), its data will be commited to backing store. If it is marked invalid, its data will be discarded completely. A valid, cacheable buffer will be put on a list and kept in the buffer hash so it can be found again; otherwise, it will be dissociated from its vnode and treated as empty. Which list a valid buffer is placed on depends on the use of buf_markaged(), whether it is metadata, and the B_LOCKED flag. A B_LOCKED buffer will not be available for reuse by other files, though its data may be paged out. Note that buf_brelse() is intended for use with traditionally allocated buffers.
buf_bwrite |
Write a buffer's data to backing store.
errno_t buf_bwrite( buf_t);
bp
The buffer to write to disk.
0 for success; errors from buf_biowait().
Once the data in a buffer has been modified, buf_bwrite() starts sending it to disk by calling VNOP_STRATEGY. Unless B_ASYNC has been set on the buffer (by buf_setflags() or otherwise), data will have been written to disk when buf_bwrite() returns. See Bach (p 56).
buf_callback |
Get the function set to be called when I/O on a buffer completes.
void * buf_callback( buf_t);
bp
Buffer whose callback to get.
0 for success, or errors from filesystem or device layers.
A function returned by buf_callback was originally set with buf_setcallback().
buf_clear |
Zero out the storage associated with a buffer.
bp
The buffer to zero out.
void.
Calls buf_map() to get the buffer's data address; for a B_CLUSTER buffer (one which has had buf_setupl() called on it), it tries to map the buffer's UPL into memory; should only be called once during the life cycle of an iobuf (one allocated with buf_alloc()).
buf_clearflags |
Clear flags on a buffer. @discussion: buffer_flags &= ~flags
void buf_clearflags( buf_t, int32_t);
bp
Buffer whose flags to clear.
flags
Flags to remove from buffer's mask. B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA
void.
buf_clone |
Clone a buffer with a restricted range and an optional callback.
bp
Buffer to clone.
io_offset
Offset, relative to start of data in original buffer, at which new buffer's data will begin.
io_size
Size of buffer region in new buffer, in the sense of buf_count().
iodone
Callback to be called from buf_biodone() when I/O completes, in the sense of buf_setcallback().
arg
Argument to pass to iodone() callback.
NULL if io_offset/io_size combination is invalid for the buffer to be cloned; otherwise, the new buffer.
Generates a buffer which is identical to its "bp" argument except that it spans a subset of the data of the original. The buffer to be cloned should have been allocated with buf_alloc(). Checks its arguments to make sure that the data subset is coherent. Optionally, adds a callback function and argument to it to be called when I/O completes (as with buf_setcallback(), but B_ASYNC is not set). If the original buffer had a upl set through buf_setupl(), this upl is copied to the new buffer; otherwise, the original's data pointer is used raw. The buffer must be released with buf_free().
buf_count |
Get count of valid bytes in a buffer. This may be less than the space allocated to the buffer.
uint32_t buf_count( buf_t);
bp
Buffer whose byte count to get.
Byte count.
buf_dataptr |
Get the address at which a buffer's data is stored; for iobufs, this must be set with buf_setdataptr(). See buf_map().
uintptr_t buf_dataptr( buf_t);
bp
Buffer whose data pointer to retrieve.
Data pointer; NULL if unset.
buf_device |
Get the device ID associated with a buffer.
dev_t buf_device( buf_t);
bp
Buffer whose device ID to retrieve.
Device id.
In traditional buffer use, this value is NODEV until buf_strategy() is called unless buf_getblk() was passed a device vnode. It is set on an iobuf if buf_alloc() is passed a device vnode or if buf_setdevice() is called.
buf_dirtyend |
Get the ending offset of the dirty region associated with a buffer.
uint32_t buf_dirtyend( buf_t);
bp
Buffer whose dirty end to get.
0 if buffer is found clean; size of buffer if found dirty. Can be set to any value by callers of buf_setdirtyend().
If the buffer's data was found incore and dirty, the dirty end is the size of the block; otherwise, unless someone outside of xnu explicitly changes it by calling buf_setdirtyend(), it will be zero.
buf_dirtyoff |
Get the starting offset of the dirty region associated with a buffer.
uint32_t buf_dirtyoff( buf_t);
bp
Buffer whose dirty offset to get.
Dirty offset (0 if not explicitly changed).
The dirty offset is zero unless someone explicitly calls buf_setdirtyoff() (which the kernel does not).
buf_drvdata |
Get driver-specific data from a buffer.
void * buf_drvdata( buf_t);
bp
Buffer whose driver data to get.
Opaque driver data.
buf_error |
Get the error value associated with a buffer.
errno_t buf_error( buf_t);
bp
Buffer whose error value to retrieve.
Error value, directly.
Errors are set with buf_seterror().
buf_flags |
Get flags set on a buffer.
int32_t buf_flags( buf_t);
bp
Buffer whose flags to grab.
flags.
Valid flags are B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA.
buf_flushdirtyblks |
Write dirty file blocks to disk.
void buf_flushdirtyblks( vnode_t, int, int, const char *);
vp
The vnode whose blocks to flush.
wait
Wait for writes to complete before returning.
flags
Can pass zero, meaning "flush all dirty buffers." BUF_SKIP_NONLOCKED: Skip buffers which are not busy when we encounter them. BUF_SKIP_LOCKED: Skip buffers which are busy when we encounter them.
msg
String to pass to msleep().
void.
buf_free |
Free a buffer that was allocated with buf_alloc().
bp
The buffer to free.
void.
The storage (UPL, data pointer) associated with an iobuf must be freed manually.
buf_fromcache |
Check if a buffer's data was found in core.
int buf_fromcache( buf_t);
bp
Buffer to test.
Nonzero if we got this buffer's data without doing I/O, 0 if not.
Will return truth after a buf_getblk that finds a valid buffer in the cache or the relevant data in core (but not in a buffer).
buf_fsprivate |
Get filesystem-specific data from a buffer.
void * buf_fsprivate( buf_t);
bp
Buffer whose filesystem data to get.
Opaque filesystem data.
buf_fua |
Check if a buffer is marked for write through disk caches.
int buf_fua( buf_t);
bp
Buffer to test.
Nonzero if buffer is marked for write-through, 0 if not.
buf_getblk |
Traditional buffer cache routine to get a buffer corresponding to a logical block in a file.
buf_t buf_getblk( vnode_t, daddr64_t, int, int, int, int);
vp
File for which to get block.
blkno
Logical block number.
size
Size of block.
slpflag
Flag to pass to msleep() while waiting for buffer to become unbusy.
slptimeo
Time, in milliseconds, to wait for buffer to become unbusy. 0 means to wait indefinitely.
operation
BLK_READ: want a read buffer. BLK_WRITE: want a write buffer. BLK_META: want a metadata buffer. BLK_ONLYVALID: only return buffers which are found in core (do not allocate anew), and do not change buffer size. The last remark means that if a given logical block is found in core with a different size than what is requested, the buffer size will not be modified.
Buffer found in core or newly allocated, either containing valid data or ready for I/O.
buf_getblk() gets a buffer, not necessarily containing valid data, representing a block in a file. A metadata buffer will be returned with its own zone-allocated storage, managed by the traditional buffer-cache layer, whereas data buffers will be returned hooked into backing by the UBC (which in fact controls the caching of data). buf_getblk() first looks for the buffer header in cache; if the buffer is in-core but busy, buf_getblk() will wait for it to become unbusy, depending on the slpflag and slptimeo parameters. If the buffer is found unbusy and is a metadata buffer, it must already contain valid data and will be returned directly; data buffers will have a UPL configured to prepare for interaction with the underlying UBC. If the buffer is found in core, it will be marked as such and buf_fromcache() will return truth. A buffer is allocated and initialized (but not filled with data) if none is found in core. buf_bread(), buf_breadn(), buf_meta_bread(), and buf_meta_breadn() all return buffers obtained with buf_getblk().
buf_geteblk |
Get a metadata buffer which is marked invalid and not associated with any vnode.
buf_t buf_geteblk( int);
size
Size of buffer.
Always returns a new buffer.
A buffer is returned with zone-allocated storage of the specified size, marked B_META and invalid. It has no vnode and is not visible in the buffer hash.
buf_invalblkno |
Invalidate a filesystem logical block in a file.
errno_t buf_invalblkno( vnode_t, daddr64_t, int);
bp
Buffer whose block to invalidate.
lblkno
Logical block number.
flags
BUF_WAIT: wait for busy buffers to become unbusy and invalidate them then. Otherwise, just return EBUSY for busy blocks.
0 for success, EINVAL if vp is not a device file.
buf_invalblkno() tries to make the data for a given block in a file invalid; if the buffer for that block is found in core and is not busy, we mark it invalid and call buf_brelse() (see "flags" param for what happens if the buffer is busy). buf_brelse(), noticing that it is invalid, will will return the buffer to the empty-buffer list and tell the VM subsystem to abandon the relevant pages. Data will not be written to backing store--it will be cast aside. Note that this function will only work if the block in question has been obtained with a buf_getblk(). If data has been read into core without using traditional buffer cache routines, buf_invalblkno() will not be able to invalidate it--this includes the use of iobufs.
buf_invalidateblks |
Invalidate all the blocks associated with a vnode.
int buf_invalidateblks( vnode_t, int, int, int);
bp
The buffer whose data to invalidate.
flags
BUF_WRITE_DATA: write dirty data to disk with VNOP_BWRITE() before kicking buffer cache entries out. BUF_SKIP_META: do not invalidate metadata blocks.
slpflag
Flags to pass to "msleep" while waiting to acquire busy buffers.
slptimeo
Timeout in "hz" (1/100 second) to wait for a buffer to become unbusy before waking from sleep and re-starting the scan.
0 for success, error values from msleep().
This function does for all blocks associated with a vnode what buf_invalblkno does for one block. Again, it will only be able to invalidate data which were populated with traditional buffer cache routines, i.e. by buf_getblk() and callers thereof. Unlike buf_invalblkno(), it can be made to write dirty data to disk rather than casting it aside.
buf_iterate |
Perform some operation on all buffers associated with a vnode.
void buf_iterate( vnode_t, int (*)( buf_t, void *), int, void *);
vp
The vnode whose buffers to scan.
callout
Function to call on each buffer. Should return one of: BUF_RETURNED: buf_iterate() should call buf_brelse() on the buffer. BUF_RETURNED_DONE: buf_iterate() should call buf_brelse() on the buffer and then stop iterating. BUF_CLAIMED: buf_iterate() should continue iterating (and not call buf_brelse()). BUF_CLAIMED_DONE: buf_iterate() should stop iterating (and not call buf_brelse()).
flag
BUF_SKIP_NONLOCKED: Skip buffers which are not busy when we encounter them. BUF_SKIP_LOCKED: Skip buffers which are busy when we encounter them. BUF_SCAN_CLEAN: Call out on clean buffers. BUF_SCAN_DIRTY: Call out on dirty buffers. BUF_NOTIFY_BUSY: If a buffer cannot be acquired, pass a NULL buffer to callout; otherwise, that buffer will be silently skipped.
arg
Argument to pass to callout in addition to buffer.
void.
buf_lblkno |
Get logical block number associated with a buffer.
daddr64_t buf_lblkno( buf_t);
bp
Buffer whose logical block number to get.
Block number.
Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), for example by buf_bread().
buf_map |
Get virtual mappings for buffer data.
errno_t buf_map( buf_t, caddr_t *);
bp
Buffer whose mapping to find or create.
io_addr
Destination for mapping address.
0 for success, ENOMEM if unable to map the buffer.
For buffers created through buf_getblk() (i.e. traditional buffer cache usage), buf_map() just returns the address at which data was mapped by but_getblk(). For a B_CLUSTER buffer, i.e. an iobuf whose upl state is managed manually, there are two possibilities. If the buffer was created with an underlying "real" buffer through cluster_bp(), the mapping of the "real" buffer is returned. Otherwise, the buffer was created with buf_alloc() and buf_setupl() was subsequently called; buf_map() will call ubc_upl_map() to get a mapping for the buffer's upl and return the start of that mapping plus the buffer's upl offset (set in buf_setupl()). In the last case, buf_unmap() must later be called to tear down the mapping. NOTE: buf_map() does not set the buffer data pointer; this must be done with buf_setdataptr().
buf_markaged |
Mark a buffer as "aged," i.e. as a good candidate to be discarded and reused after buf_brelse().
void buf_markaged( buf_t);
bp
Buffer to mark.
buf_markdelayed |
Mark a buffer as a delayed write: mark it dirty without actually scheduling I/O.
void buf_markdelayed( buf_t);
bp
Buffer to mark.
Data will be flushed to disk at some later time, not with brelse(). A sync()/fsync() or pressure necessitating reuse of the buffer will cause it to be written back to disk.
buf_markeintr |
Mark a buffer as having been interrupted during I/O.
void buf_markeintr( buf_t);
bp
Buffer to mark.
Waiters for I/O to complete (buf_biowait()) will return with EINTR when woken up. buf_markeintr does not itself do a wakeup.
buf_markfua |
Mark a buffer for write through disk cache, if disk supports it.
void buf_markfua( buf_t);
bp
Buffer to mark.
buf_markinvalid |
Mark a buffer as not having valid data and being ready for immediate reuse after buf_brelse().
void buf_markinvalid( buf_t);
bp
Buffer to mark.
buf_meta_bread |
Synchronously read a metadata block of a file.
errno_t buf_meta_bread( vnode_t, daddr64_t, int, kauth_cred_t, buf_t *);
vp
The file from which to read.
blkno
The logical (filesystem) block number to read.
size
Size of block; do not use for sizes > 4K.
cred
Credential to store and use for reading from disk if data are not already in core.
bpp
Destination pointer for buffer.
0 for success, or an error from buf_biowait().
buf_meta_bread() is the traditional way to read a single logical block of a file through the buffer cache. It tries to find the buffer and corresponding page(s) in core, calls VNOP_STRATEGY if necessary to bring the data into memory, and waits for I/O to complete. It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster routines for large reads. Reading meta-data through the traditional buffer cache, unlike reading data, is efficient and encouraged, especially if the blocks being read are significantly smaller than page size.
buf_meta_breadn |
Read a metadata block from a file with read-ahead.
errno_t buf_meta_breadn( vnode_t, daddr64_t, int, daddr64_t *, int *, int, kauth_cred_t, buf_t *);
vp
The file from which to read.
blkno
The logical (filesystem) block number to read synchronously.
size
Size of block; do not use for sizes > 4K.
rablks
Array of logical block numbers for asynchronous read-aheads.
rasizes
Array of block sizes for asynchronous read-aheads, each index corresponding to same index in "rablks."
nrablks
Number of entries in read-ahead arrays.
cred
Credential to store and use for reading from disk if data are not already in core.
bpp
Destination pointer for buffer.
0 for success, or an error from buf_biowait().
buf_meta_breadn() reads one block synchronously in the style of buf_meta_bread() and fires off a specified set of asynchronous reads to improve the likelihood of future cache hits. It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster routines for large reads.
buf_proc |
Get the process associated with this buffer.
proc_t buf_proc( buf_t);
bp
Buffer whose associated process to find.
Associated process, possibly NULL.
buf_proc() will generally return NULL; a process is currently only associated with a buffer in the event of a physio() call.
buf_rcred |
Get the credential associated with a buffer for reading.
kauth_cred_t buf_rcred( buf_t);
bp
Buffer whose credential to grab.
Credential if it exists, else NULL.
No reference is taken; if the credential is to be held on to persistently, an additional reference must be taken with kauth_cred_ref.
buf_reset |
Reset I/O flag state on a buffer.
bp
Buffer whose flags to grab.
flags
Flags to set on buffer: B_READ, B_WRITE, B_ASYNC, B_NOCACHE.
void.
Clears current flags on a buffer (internal and external) and allows some new flags to be set. Used perhaps to prepare an iobuf for reuse.
buf_resid |
Get a count of bytes which were not consumed by an I/O on a buffer.
uint32_t buf_resid( buf_t);
bp
Buffer whose outstanding count to get.
Count of unwritten/unread bytes.
Set when an I/O operations completes.
buf_setblkno |
Set physical block number associated with a buffer.
void buf_setblkno( buf_t, daddr64_t);
bp
Buffer whose physical block number to set.
blkno
Block number to set.
void.
Physical block number is generally set by the cluster layer or by buf_getblk().
buf_setcallback |
Set a function to be called once when I/O on a buffer completes.
errno_t buf_setcallback( buf_t, void (*)( buf_t, void *), void *);
bp
Buffer whose callback to set.
callback
function to use as callback.
transaction
Additional argument to callback function.
0; always succeeds.
A one-shot callout set with buf_setcallback() will be called from buf_biodone() when I/O completes. It will be passed the "transaction" argument as well as the buffer. buf_setcallback() also marks the buffer as B_ASYNC.
buf_setcount |
Set count of valid bytes in a buffer. This may be less than the space allocated to the buffer.
void buf_setcount( buf_t, uint32_t);
bp
Buffer whose byte count to set.
bcount
Count to set.
void.
buf_setdataptr |
Set the address at which a buffer's data will be stored.
void buf_setdataptr( buf_t, uintptr_t);
bp
Buffer whose data pointer to set.
data
Pointer to data region.
void.
In traditional buffer use, the data pointer will be set automatically. This routine is useful with iobufs (allocated with buf_alloc()).
buf_setdevice |
Set the device associated with a buffer.
errno_t buf_setdevice( buf_t, vnode_t);
bp
Buffer whose device ID to set.
vp
Device to set on the buffer.
0 for success, EINVAL if vp is not a device file.
A buffer's device is set in buf_strategy() (or in buf_getblk() if the file is a device). It is also set on an iobuf if buf_alloc() is passed a device vnode.
buf_setdirtyend |
Set the ending offset of the dirty region associated with a buffer.
void buf_setdirtyend( buf_t, uint32_t);
bp
Buffer whose dirty end to set.
void.
If the buffer's data was found incore and dirty, the dirty end is the size of the block; otherwise, unless someone outside of xnu explicitly changes it by calling buf_setdirtyend(), it will be zero.
buf_setdirtyoff |
Set the starting offset of the dirty region associated with a buffer.
void buf_setdirtyoff( buf_t, uint32_t);
bp
Buffer whose dirty end to set.
void.
This value is zero unless someone set it explicitly.
buf_setdrvdata(buf_t) |
Get driver-specific data from a buffer.
void * buf_drvdata( buf_t);
bp
Buffer whose driver data to get.
Opaque driver data.
buf_setdrvdata(buf_t, void *) |
Set driver-specific data on a buffer.
void buf_setdrvdata( buf_t, void *);
bp
Buffer whose driver-data to set.
drvdata
Opaque driver data.
void.
buf_seterror |
Set an error value on a buffer.
void buf_seterror( buf_t, errno_t);
bp
Buffer whose error value to set.
void.
buf_setflags |
Set flags on a buffer. @discussion: buffer_flags |= flags
void buf_setflags( buf_t, int32_t);
bp
Buffer whose flags to set.
flags
Flags to add to buffer's mask. B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA
void.
buf_setfsprivate |
Set filesystem-specific data on a buffer.
void buf_setfsprivate( buf_t, void *);
bp
Buffer whose filesystem data to set.
fsprivate
Opaque filesystem data.
void.
buf_setlblkno |
Set logical block number associated with a buffer.
void buf_setlblkno( buf_t, daddr64_t);
bp
Buffer whose logical block number to set.
lblkno
Block number to set.
void.
Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), for example by buf_bread().
buf_setresid |
Set a count of bytes outstanding for I/O in a buffer.
void buf_setresid( buf_t, uint32_t);
bp
Buffer whose outstanding count to set.
Count of unwritten/unread bytes.
Set when an I/O operations completes. Examples: called by IOStorageFamily when I/O completes, often called on an "original" buffer when using a manipulated buffer to perform I/O on behalf of the first.
buf_setsize |
Set size of data region allocated to a buffer.
void buf_setsize( buf_t, uint32_t);
bp
Buffer whose size to set.
void.
May be larger than amount of valid data in buffer. Should be used by code which is manually providing storage for an iobuf, one allocated with buf_alloc().
buf_setupl |
Set the UPL (Universal Page List), and offset therein, on a buffer.
errno_t buf_setupl( buf_t, upl_t, uint32_t);
bp
Buffer whose upl to set.
upl
UPL to set in the buffer. @parma offset Offset within upl at which relevant data begin.
0 for success, EINVAL if the buffer was not allocated with buf_alloc().
buf_setupl() should only be called on buffers allocated with buf_alloc(). A subsequent call to buf_map() will map the UPL and give back the address at which data begins. After buf_setupl() is called, a buffer is marked B_CLUSTER; when this is the case, buf_strategy() assumes that a buffer is correctly configured to be passed to the device layer without modification. Passing a NULL upl will clear the upl and the B_CLUSTER flag on the buffer.
buf_setvnode |
Set the vnode associated with a buffer.
void buf_setvnode( buf_t, vnode_t);
bp
Buffer whose vnode to set.
vp
The vnode to attach to the buffer.
void.
This call need not be used on traditional buffers; it is for use with iobufs.
buf_size |
Get size of data region allocated to a buffer.
uint32_t buf_size( buf_t);
bp
Buffer whose size to get.
Size.
May be larger than amount of valid data in buffer.
buf_strategy |
Pass an I/O request for a buffer down to the device layer.
errno_t buf_strategy( vnode_t, void *);
devvp
Device on which to perform I/O
ap
vnop_strategy_args structure (most importantly, a buffer).
0 for success, or errors from filesystem or device layers.
This is one of the most important routines in the buffer cache layer. For buffers obtained through buf_getblk, it handles finding physical block numbers for the I/O (with VNOP_BLKTOOFF and VNOP_BLOCKMAP), packaging the I/O into page-sized chunks, and initiating I/O on the disk by calling the device's strategy routine. If a buffer's UPL has been set manually with buf_setupl(), it assumes that the request is already correctly configured with a block number and a size divisible by page size and will just call directly to the device.
buf_unmap |
Release mappings for buffer data.
errno_t buf_unmap( buf_t);
bp
Buffer whose mapping to find or create.
io_addr
Destination for mapping address.
0 for success, EINVAL if unable to unmap buffer.
For buffers created through buf_getblk() (i.e. traditional buffer cache usage), buf_unmap() does nothing; buf_brelse() will take care of unmapping. For a B_CLUSTER buffer, i.e. an iobuf whose upl state is managed manually, there are two possibilities. If the buffer was created with an underlying "real" buffer through cluster_bp(), buf_unmap() does nothing; buf_brelse() on the underlying buffer will tear down the mapping. Otherwise, the buffer was created with buf_alloc() and buf_setupl() was subsequently called; buf_map() created the mapping. In this case, buf_unmap() will unmap the buffer.
buf_upl |
Get the upl (Universal Page List) associated with a buffer.
bp
Buffer whose upl to grab.
Buffer's upl if it has one, else NULL.
Buffers allocated with buf_alloc() are not returned with a upl, and traditional buffers only have a upl while an I/O is in progress.
buf_uploffset |
Get the offset into a UPL at which this buffer begins.
uint32_t buf_uploffset( buf_t);
bp
Buffer whose uploffset to grab.
Buffer's uploffset--does not check whether that value makes sense for this buffer.
This function should only be called on iobufs, i.e. buffers allocated with buf_alloc().
buf_valid |
Check if a buffer contains valid data.
int buf_valid( buf_t);
bp
Buffer to test.
Nonzero if buffer has valid data, 0 if not.
buf_vnode |
Get the vnode associated with a buffer.
vnode_t buf_vnode( buf_t);
bp
Buffer whose vnode to retrieve.
Buffer's vnode.
Every buffer is associated with a file. Because there is an I/O in flight, there is an iocount on this vnode; it is returned WITHOUT an extra iocount, and vnode_put() need NOT be called.
buf_wcred |
Get the credential associated with a buffer for writing.
kauth_cred_t buf_wcred( buf_t);
bp
Buffer whose credential to grab.
Credential if it exists, else NULL.
No reference is taken; if the credential is to be held on to persistently, an additional reference must be taken with kauth_cred_ref.
minphys |
Adjust a buffer's count to be no more than maximum physical I/O transfer size for the host architecture.
u_int minphys( buf_t bp);
bp
The buffer whose byte count to modify.
New byte count.
physio() takes as a parameter a function to bound transfer sizes for each VNOP_STRATEGY() call. minphys() is a default implementation. It calls buf_setcount() to make the buffer's count the min() of its current count and the max I/O size for the host architecture.
physio |
Perform I/O on a device to/from target memory described by a uio.
f_strategy
Strategy routine to call to initiate I/O.
bp
Buffer to configure and pass to strategy routine; can be NULL.
dev
Device on which to perform I/O.
flags
B_READ or B_WRITE.
f_minphys
Function which calls buf_setcount() to set a byte count which is suitably small for the device in question. Returns byte count that has been set (or unchanged) on the buffer.
uio
UIO describing the I/O operation.
blocksize
Logical block size for this vnode.
0 for success; EFAULT for an invalid uio; errors from buf_biowait().
physio() allows I/O directly from a device to user-space memory. It waits for all I/O to complete before returning.
Last Updated: 2010-07-29