1*42e22086SApple OSS Distributions /* 2*42e22086SApple OSS Distributions * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved. 3*42e22086SApple OSS Distributions * 4*42e22086SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*42e22086SApple OSS Distributions * 6*42e22086SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*42e22086SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*42e22086SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*42e22086SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*42e22086SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*42e22086SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*42e22086SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*42e22086SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*42e22086SApple OSS Distributions * 15*42e22086SApple OSS Distributions * Please obtain a copy of the License at 16*42e22086SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*42e22086SApple OSS Distributions * 18*42e22086SApple OSS Distributions * The Original Code and all software distributed under the License are 19*42e22086SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*42e22086SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*42e22086SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*42e22086SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*42e22086SApple OSS Distributions * Please see the License for the specific language governing rights and 24*42e22086SApple OSS Distributions * limitations under the License. 25*42e22086SApple OSS Distributions * 26*42e22086SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*42e22086SApple OSS Distributions */ 28*42e22086SApple OSS Distributions /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 29*42e22086SApple OSS Distributions /* 30*42e22086SApple OSS Distributions * Copyright (c) 1982, 1986, 1989, 1993 31*42e22086SApple OSS Distributions * The Regents of the University of California. All rights reserved. 32*42e22086SApple OSS Distributions * (c) UNIX System Laboratories, Inc. 33*42e22086SApple OSS Distributions * All or some portions of this file are derived from material licensed 34*42e22086SApple OSS Distributions * to the University of California by American Telephone and Telegraph 35*42e22086SApple OSS Distributions * Co. or Unix System Laboratories, Inc. and are reproduced herein with 36*42e22086SApple OSS Distributions * the permission of UNIX System Laboratories, Inc. 37*42e22086SApple OSS Distributions * 38*42e22086SApple OSS Distributions * Redistribution and use in source and binary forms, with or without 39*42e22086SApple OSS Distributions * modification, are permitted provided that the following conditions 40*42e22086SApple OSS Distributions * are met: 41*42e22086SApple OSS Distributions * 1. Redistributions of source code must retain the above copyright 42*42e22086SApple OSS Distributions * notice, this list of conditions and the following disclaimer. 43*42e22086SApple OSS Distributions * 2. Redistributions in binary form must reproduce the above copyright 44*42e22086SApple OSS Distributions * notice, this list of conditions and the following disclaimer in the 45*42e22086SApple OSS Distributions * documentation and/or other materials provided with the distribution. 46*42e22086SApple OSS Distributions * 3. All advertising materials mentioning features or use of this software 47*42e22086SApple OSS Distributions * must display the following acknowledgement: 48*42e22086SApple OSS Distributions * This product includes software developed by the University of 49*42e22086SApple OSS Distributions * California, Berkeley and its contributors. 50*42e22086SApple OSS Distributions * 4. Neither the name of the University nor the names of its contributors 51*42e22086SApple OSS Distributions * may be used to endorse or promote products derived from this software 52*42e22086SApple OSS Distributions * without specific prior written permission. 53*42e22086SApple OSS Distributions * 54*42e22086SApple OSS Distributions * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 55*42e22086SApple OSS Distributions * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 56*42e22086SApple OSS Distributions * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57*42e22086SApple OSS Distributions * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 58*42e22086SApple OSS Distributions * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 59*42e22086SApple OSS Distributions * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 60*42e22086SApple OSS Distributions * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 61*42e22086SApple OSS Distributions * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 62*42e22086SApple OSS Distributions * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 63*42e22086SApple OSS Distributions * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 64*42e22086SApple OSS Distributions * SUCH DAMAGE. 65*42e22086SApple OSS Distributions * 66*42e22086SApple OSS Distributions * @(#)buf.h 8.9 (Berkeley) 3/30/95 67*42e22086SApple OSS Distributions */ 68*42e22086SApple OSS Distributions 69*42e22086SApple OSS Distributions #ifndef _SYS_BUF_H_ 70*42e22086SApple OSS Distributions #define _SYS_BUF_H_ 71*42e22086SApple OSS Distributions 72*42e22086SApple OSS Distributions #include <sys/cdefs.h> 73*42e22086SApple OSS Distributions #include <sys/kernel_types.h> 74*42e22086SApple OSS Distributions #include <sys/ucred.h> 75*42e22086SApple OSS Distributions #include <mach/memory_object_types.h> 76*42e22086SApple OSS Distributions 77*42e22086SApple OSS Distributions 78*42e22086SApple OSS Distributions #define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ 79*42e22086SApple OSS Distributions #define B_READ 0x00000001 /* Read buffer. */ 80*42e22086SApple OSS Distributions #define B_ASYNC 0x00000002 /* Start I/O, do not wait. */ 81*42e22086SApple OSS Distributions #define B_NOCACHE 0x00000004 /* Do not cache block after use. */ 82*42e22086SApple OSS Distributions #define B_DELWRI 0x00000008 /* Delay I/O until buffer reused. */ 83*42e22086SApple OSS Distributions #define B_LOCKED 0x00000010 /* Locked in core (not reusable). */ 84*42e22086SApple OSS Distributions #define B_PHYS 0x00000020 /* I/O to user memory. */ 85*42e22086SApple OSS Distributions #define B_CLUSTER 0x00000040 /* UPL based I/O generated by cluster layer */ 86*42e22086SApple OSS Distributions #define B_PAGEIO 0x00000080 /* Page in/out */ 87*42e22086SApple OSS Distributions #define B_META 0x00000100 /* buffer contains meta-data. */ 88*42e22086SApple OSS Distributions #define B_RAW 0x00000200 /* Set by physio for raw transfers. */ 89*42e22086SApple OSS Distributions #define B_FUA 0x00000400 /* Write-through disk cache(if supported) */ 90*42e22086SApple OSS Distributions #define B_PASSIVE 0x00000800 /* PASSIVE I/Os are ignored by THROTTLE I/O */ 91*42e22086SApple OSS Distributions #define B_IOSTREAMING 0x00001000 /* sequential access pattern detected */ 92*42e22086SApple OSS Distributions #define B_THROTTLED_IO 0x00002000 /* low priority I/O (deprecated) */ 93*42e22086SApple OSS Distributions #define B_ENCRYPTED_IO 0x00004000 /* Encrypted I/O */ 94*42e22086SApple OSS Distributions #define B_STATICCONTENT 0x00008000 /* Buffer is likely to remain unaltered */ 95*42e22086SApple OSS Distributions 96*42e22086SApple OSS Distributions /* 97*42e22086SApple OSS Distributions * make sure to check when adding flags that 98*42e22086SApple OSS Distributions * that the new flags don't overlap the definitions 99*42e22086SApple OSS Distributions * in buf_internal.h 100*42e22086SApple OSS Distributions */ 101*42e22086SApple OSS Distributions 102*42e22086SApple OSS Distributions __BEGIN_DECLS 103*42e22086SApple OSS Distributions 104*42e22086SApple OSS Distributions /*! 105*42e22086SApple OSS Distributions * @function buf_markaged 106*42e22086SApple OSS Distributions * @abstract Mark a buffer as "aged," i.e. as a good candidate to be discarded and reused after buf_brelse(). 107*42e22086SApple OSS Distributions * @param bp Buffer to mark. 108*42e22086SApple OSS Distributions */ 109*42e22086SApple OSS Distributions void buf_markaged(buf_t bp); 110*42e22086SApple OSS Distributions 111*42e22086SApple OSS Distributions /*! 112*42e22086SApple OSS Distributions * @function buf_markinvalid 113*42e22086SApple OSS Distributions * @abstract Mark a buffer as not having valid data and being ready for immediate reuse after buf_brelse(). 114*42e22086SApple OSS Distributions * @param bp Buffer to mark. 115*42e22086SApple OSS Distributions */ 116*42e22086SApple OSS Distributions void buf_markinvalid(buf_t bp); 117*42e22086SApple OSS Distributions 118*42e22086SApple OSS Distributions /*! 119*42e22086SApple OSS Distributions * @function buf_markdelayed 120*42e22086SApple OSS Distributions * @abstract Mark a buffer as a delayed write: mark it dirty without actually scheduling I/O. 121*42e22086SApple OSS Distributions * @discussion Data will be flushed to disk at some later time, not with brelse(). A sync()/fsync() 122*42e22086SApple OSS Distributions * or pressure necessitating reuse of the buffer will cause it to be written back to disk. 123*42e22086SApple OSS Distributions * @param bp Buffer to mark. 124*42e22086SApple OSS Distributions */ 125*42e22086SApple OSS Distributions void buf_markdelayed(buf_t bp); 126*42e22086SApple OSS Distributions 127*42e22086SApple OSS Distributions void buf_markclean(buf_t); 128*42e22086SApple OSS Distributions 129*42e22086SApple OSS Distributions /*! 130*42e22086SApple OSS Distributions * @function buf_markeintr 131*42e22086SApple OSS Distributions * @abstract Mark a buffer as having been interrupted during I/O. 132*42e22086SApple OSS Distributions * @discussion Waiters for I/O to complete (buf_biowait()) will return with EINTR when woken up. 133*42e22086SApple OSS Distributions * buf_markeintr does not itself do a wakeup. 134*42e22086SApple OSS Distributions * @param bp Buffer to mark. 135*42e22086SApple OSS Distributions */ 136*42e22086SApple OSS Distributions void buf_markeintr(buf_t bp); 137*42e22086SApple OSS Distributions 138*42e22086SApple OSS Distributions /*! 139*42e22086SApple OSS Distributions * @function buf_markfua 140*42e22086SApple OSS Distributions * @abstract Mark a buffer for write through disk cache, if disk supports it. 141*42e22086SApple OSS Distributions * @param bp Buffer to mark. 142*42e22086SApple OSS Distributions */ 143*42e22086SApple OSS Distributions void buf_markfua(buf_t bp); 144*42e22086SApple OSS Distributions 145*42e22086SApple OSS Distributions /*! 146*42e22086SApple OSS Distributions * @function buf_fua 147*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked for write through disk caches. 148*42e22086SApple OSS Distributions * @param bp Buffer to test. 149*42e22086SApple OSS Distributions * @return Nonzero if buffer is marked for write-through, 0 if not. 150*42e22086SApple OSS Distributions */ 151*42e22086SApple OSS Distributions int buf_fua(buf_t bp); 152*42e22086SApple OSS Distributions 153*42e22086SApple OSS Distributions /*! 154*42e22086SApple OSS Distributions * @function buf_valid 155*42e22086SApple OSS Distributions * @abstract Check if a buffer contains valid data. 156*42e22086SApple OSS Distributions * @param bp Buffer to test. 157*42e22086SApple OSS Distributions * @return Nonzero if buffer has valid data, 0 if not. 158*42e22086SApple OSS Distributions */ 159*42e22086SApple OSS Distributions int buf_valid(buf_t bp); 160*42e22086SApple OSS Distributions 161*42e22086SApple OSS Distributions /*! 162*42e22086SApple OSS Distributions * @function buf_fromcache 163*42e22086SApple OSS Distributions * @abstract Check if a buffer's data was found in core. 164*42e22086SApple OSS Distributions * @discussion Will return truth after a buf_getblk that finds a valid buffer in the cache or the relevant 165*42e22086SApple OSS Distributions * data in core (but not in a buffer). 166*42e22086SApple OSS Distributions * @param bp Buffer to test. 167*42e22086SApple OSS Distributions * @return Nonzero if we got this buffer's data without doing I/O, 0 if not. 168*42e22086SApple OSS Distributions */ 169*42e22086SApple OSS Distributions int buf_fromcache(buf_t bp); 170*42e22086SApple OSS Distributions 171*42e22086SApple OSS Distributions /*! 172*42e22086SApple OSS Distributions * @function buf_upl 173*42e22086SApple OSS Distributions * @abstract Get the upl (Universal Page List) associated with a buffer. 174*42e22086SApple OSS Distributions * @discussion Buffers allocated with buf_alloc() are not returned with a upl, and 175*42e22086SApple OSS Distributions * traditional buffers only have a upl while an I/O is in progress. 176*42e22086SApple OSS Distributions * @param bp Buffer whose upl to grab. 177*42e22086SApple OSS Distributions * @return Buffer's upl if it has one, else NULL. 178*42e22086SApple OSS Distributions */ 179*42e22086SApple OSS Distributions void * buf_upl(buf_t bp); 180*42e22086SApple OSS Distributions 181*42e22086SApple OSS Distributions /*! 182*42e22086SApple OSS Distributions * @function buf_uploffset 183*42e22086SApple OSS Distributions * @abstract Get the offset into a UPL at which this buffer begins. 184*42e22086SApple OSS Distributions * @discussion This function should only be called on iobufs, i.e. buffers allocated with buf_alloc(). 185*42e22086SApple OSS Distributions * @param bp Buffer whose uploffset to grab. 186*42e22086SApple OSS Distributions * @return Buffer's uploffset--does not check whether that value makes sense for this buffer. 187*42e22086SApple OSS Distributions */ 188*42e22086SApple OSS Distributions uint32_t buf_uploffset(buf_t bp); 189*42e22086SApple OSS Distributions 190*42e22086SApple OSS Distributions /*! 191*42e22086SApple OSS Distributions * @function buf_rcred 192*42e22086SApple OSS Distributions * @abstract Get the credential associated with a buffer for reading. 193*42e22086SApple OSS Distributions * @discussion No reference is taken; if the credential is to be held on to persistently, an additional 194*42e22086SApple OSS Distributions * reference must be taken with kauth_cred_ref. 195*42e22086SApple OSS Distributions * @param bp Buffer whose credential to grab. 196*42e22086SApple OSS Distributions * @return Credential if it exists, else NULL. 197*42e22086SApple OSS Distributions */ 198*42e22086SApple OSS Distributions kauth_cred_t buf_rcred(buf_t bp); 199*42e22086SApple OSS Distributions 200*42e22086SApple OSS Distributions /*! 201*42e22086SApple OSS Distributions * @function buf_wcred 202*42e22086SApple OSS Distributions * @abstract Get the credential associated with a buffer for writing. 203*42e22086SApple OSS Distributions * @discussion No reference is taken; if the credential is to be held on to persistently, an additional 204*42e22086SApple OSS Distributions * reference must be taken with kauth_cred_ref. 205*42e22086SApple OSS Distributions * @param bp Buffer whose credential to grab. 206*42e22086SApple OSS Distributions * @return Credential if it exists, else NULL. 207*42e22086SApple OSS Distributions */ 208*42e22086SApple OSS Distributions kauth_cred_t buf_wcred(buf_t bp); 209*42e22086SApple OSS Distributions 210*42e22086SApple OSS Distributions /*! 211*42e22086SApple OSS Distributions * @function buf_proc 212*42e22086SApple OSS Distributions * @abstract Get the process associated with this buffer. 213*42e22086SApple OSS Distributions * @discussion buf_proc() will generally return NULL; a process is currently only associated with 214*42e22086SApple OSS Distributions * a buffer in the event of a physio() call. 215*42e22086SApple OSS Distributions * @param bp Buffer whose associated process to find. 216*42e22086SApple OSS Distributions * @return Associated process, possibly NULL. 217*42e22086SApple OSS Distributions */ 218*42e22086SApple OSS Distributions proc_t buf_proc(buf_t bp); 219*42e22086SApple OSS Distributions 220*42e22086SApple OSS Distributions /*! 221*42e22086SApple OSS Distributions * @function buf_dirtyoff 222*42e22086SApple OSS Distributions * @abstract Get the starting offset of the dirty region associated with a buffer. 223*42e22086SApple OSS Distributions * @discussion The dirty offset is zero unless someone explicitly calls buf_setdirtyoff() (which the kernel does not). 224*42e22086SApple OSS Distributions * @param bp Buffer whose dirty offset to get. 225*42e22086SApple OSS Distributions * @return Dirty offset (0 if not explicitly changed). 226*42e22086SApple OSS Distributions */ 227*42e22086SApple OSS Distributions uint32_t buf_dirtyoff(buf_t bp); 228*42e22086SApple OSS Distributions 229*42e22086SApple OSS Distributions /*! 230*42e22086SApple OSS Distributions * @function buf_dirtyend 231*42e22086SApple OSS Distributions * @abstract Get the ending offset of the dirty region associated with a buffer. 232*42e22086SApple OSS Distributions * @discussion If the buffer's data was found incore and dirty, the dirty end is the size of the block; otherwise, unless 233*42e22086SApple OSS Distributions * someone outside of xnu explicitly changes it by calling buf_setdirtyend(), it will be zero. 234*42e22086SApple OSS Distributions * @param bp Buffer whose dirty end to get. 235*42e22086SApple OSS Distributions * @return 0 if buffer is found clean; size of buffer if found dirty. Can be set to any value by callers of buf_setdirtyend(). 236*42e22086SApple OSS Distributions */ 237*42e22086SApple OSS Distributions uint32_t buf_dirtyend(buf_t bp); 238*42e22086SApple OSS Distributions 239*42e22086SApple OSS Distributions /*! 240*42e22086SApple OSS Distributions * @function buf_setdirtyoff 241*42e22086SApple OSS Distributions * @abstract Set the starting offset of the dirty region associated with a buffer. 242*42e22086SApple OSS Distributions * @discussion This value is zero unless someone set it explicitly. 243*42e22086SApple OSS Distributions * @param bp Buffer whose dirty end to set. 244*42e22086SApple OSS Distributions */ 245*42e22086SApple OSS Distributions void buf_setdirtyoff(buf_t bp, uint32_t); 246*42e22086SApple OSS Distributions 247*42e22086SApple OSS Distributions /*! 248*42e22086SApple OSS Distributions * @function buf_setdirtyend 249*42e22086SApple OSS Distributions * @abstract Set the ending offset of the dirty region associated with a buffer. 250*42e22086SApple OSS Distributions * @discussion If the buffer's data was found incore and dirty, the dirty end is the size of the block; otherwise, unless 251*42e22086SApple OSS Distributions * someone outside of xnu explicitly changes it by calling buf_setdirtyend(), it will be zero. 252*42e22086SApple OSS Distributions * @param bp Buffer whose dirty end to set. 253*42e22086SApple OSS Distributions */ 254*42e22086SApple OSS Distributions void buf_setdirtyend(buf_t bp, uint32_t); 255*42e22086SApple OSS Distributions 256*42e22086SApple OSS Distributions /*! 257*42e22086SApple OSS Distributions * @function buf_error 258*42e22086SApple OSS Distributions * @abstract Get the error value associated with a buffer. 259*42e22086SApple OSS Distributions * @discussion Errors are set with buf_seterror(). 260*42e22086SApple OSS Distributions * @param bp Buffer whose error value to retrieve. 261*42e22086SApple OSS Distributions * @return Error value, directly. 262*42e22086SApple OSS Distributions */ 263*42e22086SApple OSS Distributions errno_t buf_error(buf_t bp); 264*42e22086SApple OSS Distributions 265*42e22086SApple OSS Distributions /*! 266*42e22086SApple OSS Distributions * @function buf_seterror 267*42e22086SApple OSS Distributions * @abstract Set an error value on a buffer. 268*42e22086SApple OSS Distributions * @param bp Buffer whose error value to set. 269*42e22086SApple OSS Distributions */ 270*42e22086SApple OSS Distributions void buf_seterror(buf_t bp, errno_t); 271*42e22086SApple OSS Distributions 272*42e22086SApple OSS Distributions /*! 273*42e22086SApple OSS Distributions * @function buf_setflags 274*42e22086SApple OSS Distributions * @abstract Set flags on a buffer. 275*42e22086SApple OSS Distributions * @discussion buffer_flags |= flags 276*42e22086SApple OSS Distributions * @param bp Buffer whose flags to set. 277*42e22086SApple OSS Distributions * @param flags Flags to add to buffer's mask. B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA 278*42e22086SApple OSS Distributions */ 279*42e22086SApple OSS Distributions void buf_setflags(buf_t bp, int32_t flags); 280*42e22086SApple OSS Distributions 281*42e22086SApple OSS Distributions /*! 282*42e22086SApple OSS Distributions * @function buf_clearflags 283*42e22086SApple OSS Distributions * @abstract Clear flags on a buffer. 284*42e22086SApple OSS Distributions * @discussion buffer_flags &= ~flags 285*42e22086SApple OSS Distributions * @param bp Buffer whose flags to clear. 286*42e22086SApple OSS Distributions * @param flags Flags to remove from buffer's mask. B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA 287*42e22086SApple OSS Distributions */ 288*42e22086SApple OSS Distributions void buf_clearflags(buf_t bp, int32_t flags); 289*42e22086SApple OSS Distributions 290*42e22086SApple OSS Distributions /*! 291*42e22086SApple OSS Distributions * @function buf_flags 292*42e22086SApple OSS Distributions * @abstract Get flags set on a buffer. 293*42e22086SApple OSS Distributions * @discussion Valid flags are B_LOCKED/B_NOCACHE/B_ASYNC/B_READ/B_WRITE/B_PAGEIO/B_FUA. 294*42e22086SApple OSS Distributions * @param bp Buffer whose flags to grab. 295*42e22086SApple OSS Distributions * @return flags. 296*42e22086SApple OSS Distributions */ 297*42e22086SApple OSS Distributions int32_t buf_flags(buf_t bp); 298*42e22086SApple OSS Distributions 299*42e22086SApple OSS Distributions /*! 300*42e22086SApple OSS Distributions * @function buf_reset 301*42e22086SApple OSS Distributions * @abstract Reset I/O flag state on a buffer. 302*42e22086SApple OSS Distributions * @discussion Clears current flags on a buffer (internal and external) and allows some new flags to be set. 303*42e22086SApple OSS Distributions * Used perhaps to prepare an iobuf for reuse. 304*42e22086SApple OSS Distributions * @param bp Buffer whose flags to grab. 305*42e22086SApple OSS Distributions * @param flags Flags to set on buffer: B_READ, B_WRITE, B_ASYNC, B_NOCACHE. 306*42e22086SApple OSS Distributions */ 307*42e22086SApple OSS Distributions void buf_reset(buf_t bp, int32_t flags); 308*42e22086SApple OSS Distributions 309*42e22086SApple OSS Distributions /*! 310*42e22086SApple OSS Distributions * @function buf_map 311*42e22086SApple OSS Distributions * @abstract Get virtual mappings for buffer data. 312*42e22086SApple OSS Distributions * @discussion For buffers created through buf_getblk() (i.e. traditional buffer cache usage), 313*42e22086SApple OSS Distributions * buf_map() just returns the address at which data was mapped by but_getblk(). For a B_CLUSTER buffer, i.e. an iobuf 314*42e22086SApple OSS Distributions * whose upl state is managed manually, there are two possibilities. If the buffer was created 315*42e22086SApple OSS Distributions * with an underlying "real" buffer through cluster_bp(), the mapping of the "real" buffer is returned. 316*42e22086SApple OSS Distributions * Otherwise, the buffer was created with buf_alloc() and buf_setupl() was subsequently called; buf_map() 317*42e22086SApple OSS Distributions * will call ubc_upl_map() to get a mapping for the buffer's upl and return the start of that mapping 318*42e22086SApple OSS Distributions * plus the buffer's upl offset (set in buf_setupl()). In the last case, buf_unmap() must later be called 319*42e22086SApple OSS Distributions * to tear down the mapping. NOTE: buf_map() does not set the buffer data pointer; this must be done with buf_setdataptr(). 320*42e22086SApple OSS Distributions * @param bp Buffer whose mapping to find or create. 321*42e22086SApple OSS Distributions * @param io_addr Destination for mapping address. 322*42e22086SApple OSS Distributions * @return 0 for success, ENOMEM if unable to map the buffer. 323*42e22086SApple OSS Distributions */ 324*42e22086SApple OSS Distributions errno_t buf_map(buf_t bp, caddr_t *io_addr); 325*42e22086SApple OSS Distributions 326*42e22086SApple OSS Distributions /*! 327*42e22086SApple OSS Distributions * @function buf_map_range 328*42e22086SApple OSS Distributions * @abstract Get virtual mappings for buffer data. 329*42e22086SApple OSS Distributions * @discussion Similar to buf_map but the focus is on a range 330*42e22086SApple OSS Distributions * of the UPL. The b_uploffset and b_count control what part of the UPL will be mapped. 331*42e22086SApple OSS Distributions * @param bp Buffer whose mapping to find or create. 332*42e22086SApple OSS Distributions * @param io_addr Destination for mapping address. 333*42e22086SApple OSS Distributions * @return 0 for success, ENOMEM if unable to map the buffer. 334*42e22086SApple OSS Distributions */ 335*42e22086SApple OSS Distributions errno_t buf_map_range(buf_t bp, caddr_t *io_addr); 336*42e22086SApple OSS Distributions 337*42e22086SApple OSS Distributions /*! 338*42e22086SApple OSS Distributions * @function buf_unmap 339*42e22086SApple OSS Distributions * @abstract Release mappings for buffer data. 340*42e22086SApple OSS Distributions * @discussion For buffers created through buf_getblk() (i.e. traditional buffer cache usage), 341*42e22086SApple OSS Distributions * buf_unmap() does nothing; buf_brelse() will take care of unmapping. For a B_CLUSTER buffer, i.e. an iobuf 342*42e22086SApple OSS Distributions * whose upl state is managed manually, there are two possibilities. If the buffer was created 343*42e22086SApple OSS Distributions * with an underlying "real" buffer through cluster_bp(), buf_unmap() does nothing; buf_brelse() on the 344*42e22086SApple OSS Distributions * underlying buffer will tear down the mapping. Otherwise, the buffer was created with buf_alloc() and 345*42e22086SApple OSS Distributions * buf_setupl() was subsequently called; buf_map() created the mapping. In this case, buf_unmap() will 346*42e22086SApple OSS Distributions * unmap the buffer. 347*42e22086SApple OSS Distributions * @param bp Buffer whose mapping to find or create. 348*42e22086SApple OSS Distributions * @return 0 for success, EINVAL if unable to unmap buffer. 349*42e22086SApple OSS Distributions */ 350*42e22086SApple OSS Distributions errno_t buf_unmap(buf_t bp); 351*42e22086SApple OSS Distributions 352*42e22086SApple OSS Distributions /*! 353*42e22086SApple OSS Distributions * @function buf_unmap_range 354*42e22086SApple OSS Distributions * @abstract Release mappings for buffer data. 355*42e22086SApple OSS Distributions * @discussion Similar to buf_unmap but the focus is on a range 356*42e22086SApple OSS Distributions * of the UPL. The b_uploffset and b_count control what part of the UPL will be unmapped. 357*42e22086SApple OSS Distributions * @param bp Buffer whose mapping to find or create. 358*42e22086SApple OSS Distributions * @return 0 for success, EINVAL if unable to unmap buffer. 359*42e22086SApple OSS Distributions */ 360*42e22086SApple OSS Distributions errno_t buf_unmap_range(buf_t bp); 361*42e22086SApple OSS Distributions 362*42e22086SApple OSS Distributions /*! 363*42e22086SApple OSS Distributions * @function buf_setdrvdata 364*42e22086SApple OSS Distributions * @abstract Set driver-specific data on a buffer. 365*42e22086SApple OSS Distributions * @param bp Buffer whose driver-data to set. 366*42e22086SApple OSS Distributions * @param drvdata Opaque driver data. 367*42e22086SApple OSS Distributions */ 368*42e22086SApple OSS Distributions void buf_setdrvdata(buf_t bp, void *drvdata); 369*42e22086SApple OSS Distributions 370*42e22086SApple OSS Distributions /*! 371*42e22086SApple OSS Distributions * @function buf_setdrvdata 372*42e22086SApple OSS Distributions * @abstract Get driver-specific data from a buffer. 373*42e22086SApple OSS Distributions * @param bp Buffer whose driver data to get. 374*42e22086SApple OSS Distributions * @return Opaque driver data. 375*42e22086SApple OSS Distributions */ 376*42e22086SApple OSS Distributions void * buf_drvdata(buf_t bp); 377*42e22086SApple OSS Distributions 378*42e22086SApple OSS Distributions /*! 379*42e22086SApple OSS Distributions * @function buf_setfsprivate 380*42e22086SApple OSS Distributions * @abstract Set filesystem-specific data on a buffer. 381*42e22086SApple OSS Distributions * @param bp Buffer whose filesystem data to set. 382*42e22086SApple OSS Distributions * @param fsprivate Opaque filesystem data. 383*42e22086SApple OSS Distributions */ 384*42e22086SApple OSS Distributions void buf_setfsprivate(buf_t bp, void *fsprivate); 385*42e22086SApple OSS Distributions 386*42e22086SApple OSS Distributions /*! 387*42e22086SApple OSS Distributions * @function buf_fsprivate 388*42e22086SApple OSS Distributions * @abstract Get filesystem-specific data from a buffer. 389*42e22086SApple OSS Distributions * @param bp Buffer whose filesystem data to get. 390*42e22086SApple OSS Distributions * @return Opaque filesystem data. 391*42e22086SApple OSS Distributions */ 392*42e22086SApple OSS Distributions void * buf_fsprivate(buf_t bp); 393*42e22086SApple OSS Distributions 394*42e22086SApple OSS Distributions /*! 395*42e22086SApple OSS Distributions * @function buf_blkno 396*42e22086SApple OSS Distributions * @abstract Get physical block number associated with a buffer, in the sense of VNOP_BLOCKMAP. 397*42e22086SApple OSS Distributions * @discussion When a buffer's physical block number is the same is its logical block number, then the physical 398*42e22086SApple OSS Distributions * block number is considered uninitialized. A physical block number of -1 indicates that there is no valid 399*42e22086SApple OSS Distributions * physical mapping (e.g. the logical block is invalid or corresponds to a sparse region in a file). Physical 400*42e22086SApple OSS Distributions * block number is normally set by the cluster layer or by buf_getblk(). 401*42e22086SApple OSS Distributions * @param bp Buffer whose physical block number to get. 402*42e22086SApple OSS Distributions * @return Block number. 403*42e22086SApple OSS Distributions */ 404*42e22086SApple OSS Distributions daddr64_t buf_blkno(buf_t bp); 405*42e22086SApple OSS Distributions 406*42e22086SApple OSS Distributions /*! 407*42e22086SApple OSS Distributions * @function buf_lblkno 408*42e22086SApple OSS Distributions * @abstract Get logical block number associated with a buffer. 409*42e22086SApple OSS Distributions * @discussion Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), 410*42e22086SApple OSS Distributions * for example by buf_bread(). 411*42e22086SApple OSS Distributions * @param bp Buffer whose logical block number to get. 412*42e22086SApple OSS Distributions * @return Block number. 413*42e22086SApple OSS Distributions */ 414*42e22086SApple OSS Distributions daddr64_t buf_lblkno(buf_t bp); 415*42e22086SApple OSS Distributions 416*42e22086SApple OSS Distributions /*! 417*42e22086SApple OSS Distributions * @function buf_lblksize 418*42e22086SApple OSS Distributions * @abstract Get the block size used to calculate the logical block number associated with a buffer. 419*42e22086SApple OSS Distributions * @discussion Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), 420*42e22086SApple OSS Distributions * for example by buf_bread(). Block size is the block size used to calculate the file offset. 421*42e22086SApple OSS Distributions * @param bp Buffer whose logical block size to get. 422*42e22086SApple OSS Distributions * @return Block size. 423*42e22086SApple OSS Distributions */ 424*42e22086SApple OSS Distributions uint32_t buf_lblksize(buf_t bp); 425*42e22086SApple OSS Distributions 426*42e22086SApple OSS Distributions /*! 427*42e22086SApple OSS Distributions * @function buf_setblkno 428*42e22086SApple OSS Distributions * @abstract Set physical block number associated with a buffer. 429*42e22086SApple OSS Distributions * @discussion Physical block number is generally set by the cluster layer or by buf_getblk(). 430*42e22086SApple OSS Distributions * @param bp Buffer whose physical block number to set. 431*42e22086SApple OSS Distributions * @param blkno Block number to set. 432*42e22086SApple OSS Distributions */ 433*42e22086SApple OSS Distributions void buf_setblkno(buf_t bp, daddr64_t blkno); 434*42e22086SApple OSS Distributions 435*42e22086SApple OSS Distributions /*! 436*42e22086SApple OSS Distributions * @function buf_setlblkno 437*42e22086SApple OSS Distributions * @abstract Set logical block number associated with a buffer. 438*42e22086SApple OSS Distributions * @discussion Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), 439*42e22086SApple OSS Distributions * for example by buf_bread(). 440*42e22086SApple OSS Distributions * @param bp Buffer whose logical block number to set. 441*42e22086SApple OSS Distributions * @param lblkno Block number to set. 442*42e22086SApple OSS Distributions */ 443*42e22086SApple OSS Distributions void buf_setlblkno(buf_t bp, daddr64_t lblkno); 444*42e22086SApple OSS Distributions 445*42e22086SApple OSS Distributions /*! 446*42e22086SApple OSS Distributions * @function buf_setlblksize 447*42e22086SApple OSS Distributions * @abstract Set block size used to set the logical block number associated with a buffer. 448*42e22086SApple OSS Distributions * @discussion Logical block number is set on traditionally-used buffers by an argument passed to buf_getblk(), 449*42e22086SApple OSS Distributions * for example by buf_bread(). 450*42e22086SApple OSS Distributions * @param bp Buffer whose logical block size to set. 451*42e22086SApple OSS Distributions * @param lblksize Block size to set. 452*42e22086SApple OSS Distributions */ 453*42e22086SApple OSS Distributions void buf_setlblksize(buf_t bp, uint32_t lblksize); 454*42e22086SApple OSS Distributions 455*42e22086SApple OSS Distributions /*! 456*42e22086SApple OSS Distributions * @function buf_count 457*42e22086SApple OSS Distributions * @abstract Get count of valid bytes in a buffer. This may be less than the space allocated to the buffer. 458*42e22086SApple OSS Distributions * @param bp Buffer whose byte count to get. 459*42e22086SApple OSS Distributions * @return Byte count. 460*42e22086SApple OSS Distributions */ 461*42e22086SApple OSS Distributions uint32_t buf_count(buf_t bp); 462*42e22086SApple OSS Distributions 463*42e22086SApple OSS Distributions /*! 464*42e22086SApple OSS Distributions * @function buf_size 465*42e22086SApple OSS Distributions * @abstract Get size of data region allocated to a buffer. 466*42e22086SApple OSS Distributions * @discussion May be larger than amount of valid data in buffer. 467*42e22086SApple OSS Distributions * @param bp Buffer whose size to get. 468*42e22086SApple OSS Distributions * @return Size. 469*42e22086SApple OSS Distributions */ 470*42e22086SApple OSS Distributions uint32_t buf_size(buf_t bp); 471*42e22086SApple OSS Distributions 472*42e22086SApple OSS Distributions /*! 473*42e22086SApple OSS Distributions * @function buf_resid 474*42e22086SApple OSS Distributions * @abstract Get a count of bytes which were not consumed by an I/O on a buffer. 475*42e22086SApple OSS Distributions * @discussion Set when an I/O operations completes. 476*42e22086SApple OSS Distributions * @param bp Buffer whose outstanding count to get. 477*42e22086SApple OSS Distributions * @return Count of unwritten/unread bytes. 478*42e22086SApple OSS Distributions */ 479*42e22086SApple OSS Distributions uint32_t buf_resid(buf_t bp); 480*42e22086SApple OSS Distributions 481*42e22086SApple OSS Distributions /*! 482*42e22086SApple OSS Distributions * @function buf_setcount 483*42e22086SApple OSS Distributions * @abstract Set count of valid bytes in a buffer. This may be less than the space allocated to the buffer. 484*42e22086SApple OSS Distributions * @param bp Buffer whose byte count to set. 485*42e22086SApple OSS Distributions * @param bcount Count to set. 486*42e22086SApple OSS Distributions */ 487*42e22086SApple OSS Distributions void buf_setcount(buf_t bp, uint32_t bcount); 488*42e22086SApple OSS Distributions 489*42e22086SApple OSS Distributions /*! 490*42e22086SApple OSS Distributions * @function buf_setsize 491*42e22086SApple OSS Distributions * @abstract Set size of data region allocated to a buffer. 492*42e22086SApple OSS Distributions * @discussion May be larger than amount of valid data in buffer. Should be used by 493*42e22086SApple OSS Distributions * code which is manually providing storage for an iobuf, one allocated with buf_alloc(). 494*42e22086SApple OSS Distributions * @param bp Buffer whose size to set. 495*42e22086SApple OSS Distributions */ 496*42e22086SApple OSS Distributions void buf_setsize(buf_t bp, uint32_t); 497*42e22086SApple OSS Distributions 498*42e22086SApple OSS Distributions /*! 499*42e22086SApple OSS Distributions * @function buf_setresid 500*42e22086SApple OSS Distributions * @abstract Set a count of bytes outstanding for I/O in a buffer. 501*42e22086SApple OSS Distributions * @discussion Set when an I/O operations completes. Examples: called by IOStorageFamily when I/O 502*42e22086SApple OSS Distributions * completes, often called on an "original" buffer when using a manipulated buffer to perform I/O 503*42e22086SApple OSS Distributions * on behalf of the first. 504*42e22086SApple OSS Distributions * @param bp Buffer whose outstanding count to set. 505*42e22086SApple OSS Distributions */ 506*42e22086SApple OSS Distributions void buf_setresid(buf_t bp, uint32_t resid); 507*42e22086SApple OSS Distributions 508*42e22086SApple OSS Distributions /*! 509*42e22086SApple OSS Distributions * @function buf_setdataptr 510*42e22086SApple OSS Distributions * @abstract Set the address at which a buffer's data will be stored. 511*42e22086SApple OSS Distributions * @discussion In traditional buffer use, the data pointer will be set automatically. This routine is 512*42e22086SApple OSS Distributions * useful with iobufs (allocated with buf_alloc()). 513*42e22086SApple OSS Distributions * @param bp Buffer whose data pointer to set. 514*42e22086SApple OSS Distributions * @param data Pointer to data region. 515*42e22086SApple OSS Distributions */ 516*42e22086SApple OSS Distributions void buf_setdataptr(buf_t bp, uintptr_t data); 517*42e22086SApple OSS Distributions 518*42e22086SApple OSS Distributions /*! 519*42e22086SApple OSS Distributions * @function buf_dataptr 520*42e22086SApple OSS Distributions * @abstract Get the address at which a buffer's data is stored; for iobufs, this must 521*42e22086SApple OSS Distributions * be set with buf_setdataptr(). See buf_map(). 522*42e22086SApple OSS Distributions * @param bp Buffer whose data pointer to retrieve. 523*42e22086SApple OSS Distributions * @return Data pointer; NULL if unset. 524*42e22086SApple OSS Distributions */ 525*42e22086SApple OSS Distributions uintptr_t buf_dataptr(buf_t bp); 526*42e22086SApple OSS Distributions 527*42e22086SApple OSS Distributions /*! 528*42e22086SApple OSS Distributions * @function buf_vnode 529*42e22086SApple OSS Distributions * @abstract Get the vnode associated with a buffer. 530*42e22086SApple OSS Distributions * @discussion Every buffer is associated with a file. Because there is an I/O in flight, 531*42e22086SApple OSS Distributions * there is an iocount on this vnode; it is returned WITHOUT an extra iocount, and vnode_put() 532*42e22086SApple OSS Distributions * need NOT be called. 533*42e22086SApple OSS Distributions * @param bp Buffer whose vnode to retrieve. 534*42e22086SApple OSS Distributions * @return Buffer's vnode. 535*42e22086SApple OSS Distributions */ 536*42e22086SApple OSS Distributions vnode_t buf_vnode(buf_t bp); 537*42e22086SApple OSS Distributions 538*42e22086SApple OSS Distributions /*! 539*42e22086SApple OSS Distributions * @function buf_setvnode 540*42e22086SApple OSS Distributions * @abstract Set the vnode associated with a buffer. 541*42e22086SApple OSS Distributions * @discussion This call need not be used on traditional buffers; it is for use with iobufs. 542*42e22086SApple OSS Distributions * @param bp Buffer whose vnode to set. 543*42e22086SApple OSS Distributions * @param vp The vnode to attach to the buffer. 544*42e22086SApple OSS Distributions */ 545*42e22086SApple OSS Distributions void buf_setvnode(buf_t bp, vnode_t vp); 546*42e22086SApple OSS Distributions 547*42e22086SApple OSS Distributions /*! 548*42e22086SApple OSS Distributions * @function buf_device 549*42e22086SApple OSS Distributions * @abstract Get the device ID associated with a buffer. 550*42e22086SApple OSS Distributions * @discussion In traditional buffer use, this value is NODEV until buf_strategy() is called unless 551*42e22086SApple OSS Distributions * buf_getblk() was passed a device vnode. It is set on an iobuf if buf_alloc() is passed a device 552*42e22086SApple OSS Distributions * vnode or if buf_setdevice() is called. 553*42e22086SApple OSS Distributions * @param bp Buffer whose device ID to retrieve. 554*42e22086SApple OSS Distributions * @return Device id. 555*42e22086SApple OSS Distributions */ 556*42e22086SApple OSS Distributions dev_t buf_device(buf_t bp); 557*42e22086SApple OSS Distributions 558*42e22086SApple OSS Distributions /*! 559*42e22086SApple OSS Distributions * @function buf_setdevice 560*42e22086SApple OSS Distributions * @abstract Set the device associated with a buffer. 561*42e22086SApple OSS Distributions * @discussion A buffer's device is set in buf_strategy() (or in buf_getblk() if the file is a device). 562*42e22086SApple OSS Distributions * It is also set on an iobuf if buf_alloc() is passed a device vnode. 563*42e22086SApple OSS Distributions * @param bp Buffer whose device ID to set. 564*42e22086SApple OSS Distributions * @param vp Device to set on the buffer. 565*42e22086SApple OSS Distributions * @return 0 for success, EINVAL if vp is not a device file. 566*42e22086SApple OSS Distributions */ 567*42e22086SApple OSS Distributions errno_t buf_setdevice(buf_t bp, vnode_t vp); 568*42e22086SApple OSS Distributions 569*42e22086SApple OSS Distributions /*! 570*42e22086SApple OSS Distributions * @function buf_strategy 571*42e22086SApple OSS Distributions * @abstract Pass an I/O request for a buffer down to the device layer. 572*42e22086SApple OSS Distributions * @discussion This is one of the most important routines in the buffer cache layer. For buffers obtained 573*42e22086SApple OSS Distributions * through buf_getblk, it handles finding physical block numbers for the I/O (with VNOP_BLKTOOFF and 574*42e22086SApple OSS Distributions * VNOP_BLOCKMAP), packaging the I/O into page-sized chunks, and initiating I/O on the disk by calling 575*42e22086SApple OSS Distributions * the device's strategy routine. If a buffer's UPL has been set manually with buf_setupl(), it assumes 576*42e22086SApple OSS Distributions * that the request is already correctly configured with a block number and a size divisible by page size 577*42e22086SApple OSS Distributions * and will just call directly to the device. 578*42e22086SApple OSS Distributions * @param devvp Device on which to perform I/O 579*42e22086SApple OSS Distributions * @param ap vnop_strategy_args structure (most importantly, a buffer). 580*42e22086SApple OSS Distributions * @return 0 for success, or errors from filesystem or device layers. 581*42e22086SApple OSS Distributions */ 582*42e22086SApple OSS Distributions errno_t buf_strategy(vnode_t devvp, void *ap); 583*42e22086SApple OSS Distributions 584*42e22086SApple OSS Distributions /* 585*42e22086SApple OSS Distributions * Flags for buf_invalblkno() 586*42e22086SApple OSS Distributions */ 587*42e22086SApple OSS Distributions #define BUF_WAIT 0x01 588*42e22086SApple OSS Distributions 589*42e22086SApple OSS Distributions /*! 590*42e22086SApple OSS Distributions * @function buf_invalblkno 591*42e22086SApple OSS Distributions * @abstract Invalidate a filesystem logical block in a file. 592*42e22086SApple OSS Distributions * @discussion buf_invalblkno() tries to make the data for a given block in a file 593*42e22086SApple OSS Distributions * invalid; if the buffer for that block is found in core and is not busy, we mark it 594*42e22086SApple OSS Distributions * invalid and call buf_brelse() (see "flags" param for what happens if the buffer is busy). 595*42e22086SApple OSS Distributions * buf_brelse(), noticing that it is invalid, will 596*42e22086SApple OSS Distributions * will return the buffer to the empty-buffer list and tell the VM subsystem to abandon 597*42e22086SApple OSS Distributions * the relevant pages. Data will not be written to backing store--it will be cast aside. 598*42e22086SApple OSS Distributions * Note that this function will only work if the block in question has been 599*42e22086SApple OSS Distributions * obtained with a buf_getblk(). If data has been read into core without using 600*42e22086SApple OSS Distributions * traditional buffer cache routines, buf_invalblkno() will not be able to invalidate it--this 601*42e22086SApple OSS Distributions * includes the use of iobufs. 602*42e22086SApple OSS Distributions * @param vp vnode whose block to invalidate. 603*42e22086SApple OSS Distributions * @param lblkno Logical block number. 604*42e22086SApple OSS Distributions * @param flags BUF_WAIT: wait for busy buffers to become unbusy and invalidate them then. Otherwise, 605*42e22086SApple OSS Distributions * just return EBUSY for busy blocks. 606*42e22086SApple OSS Distributions * @return 0 for success, EINVAL if vp is not a device file. 607*42e22086SApple OSS Distributions */ 608*42e22086SApple OSS Distributions errno_t buf_invalblkno(vnode_t vp, daddr64_t lblkno, int flags); 609*42e22086SApple OSS Distributions 610*42e22086SApple OSS Distributions /*! 611*42e22086SApple OSS Distributions * @function buf_callback 612*42e22086SApple OSS Distributions * @abstract Get the function set to be called when I/O on a buffer completes. 613*42e22086SApple OSS Distributions * @discussion A function returned by buf_callback was originally set with buf_setcallback(). 614*42e22086SApple OSS Distributions * @param bp Buffer whose callback to get. 615*42e22086SApple OSS Distributions * @return 0 for success, or errors from filesystem or device layers. 616*42e22086SApple OSS Distributions */ 617*42e22086SApple OSS Distributions void * buf_callback(buf_t bp); 618*42e22086SApple OSS Distributions 619*42e22086SApple OSS Distributions /*! 620*42e22086SApple OSS Distributions * @function buf_setcallback 621*42e22086SApple OSS Distributions * @abstract Set a function to be called once when I/O on a buffer completes. 622*42e22086SApple OSS Distributions * @discussion A one-shot callout set with buf_setcallback() will be called from buf_biodone() 623*42e22086SApple OSS Distributions * when I/O completes. It will be passed the "transaction" argument as well as the buffer. 624*42e22086SApple OSS Distributions * buf_setcallback() also marks the buffer as B_ASYNC. 625*42e22086SApple OSS Distributions * @param bp Buffer whose callback to set. 626*42e22086SApple OSS Distributions * @param callback function to use as callback. 627*42e22086SApple OSS Distributions * @param transaction Additional argument to callback function. 628*42e22086SApple OSS Distributions * @return 0; always succeeds. 629*42e22086SApple OSS Distributions */ 630*42e22086SApple OSS Distributions errno_t buf_setcallback(buf_t bp, void (*callback)(buf_t, void *), void *transaction); 631*42e22086SApple OSS Distributions 632*42e22086SApple OSS Distributions /*! 633*42e22086SApple OSS Distributions * @function buf_setupl 634*42e22086SApple OSS Distributions * @abstract Set the UPL (Universal Page List), and offset therein, on a buffer. 635*42e22086SApple OSS Distributions * @discussion buf_setupl() should only be called on buffers allocated with buf_alloc(). 636*42e22086SApple OSS Distributions * A subsequent call to buf_map() will map the UPL and give back the address at which data 637*42e22086SApple OSS Distributions * begins. After buf_setupl() is called, a buffer is marked B_CLUSTER; when this is the case, 638*42e22086SApple OSS Distributions * buf_strategy() assumes that a buffer is correctly configured to be passed to the device 639*42e22086SApple OSS Distributions * layer without modification. Passing a NULL upl will clear the upl and the B_CLUSTER flag on the 640*42e22086SApple OSS Distributions * buffer. 641*42e22086SApple OSS Distributions * @param bp Buffer whose upl to set. 642*42e22086SApple OSS Distributions * @param upl UPL to set in the buffer. 643*42e22086SApple OSS Distributions * @param offset Offset within upl at which relevant data begin. 644*42e22086SApple OSS Distributions * @return 0 for success, EINVAL if the buffer was not allocated with buf_alloc(). 645*42e22086SApple OSS Distributions */ 646*42e22086SApple OSS Distributions errno_t buf_setupl(buf_t bp, upl_t upl, uint32_t offset); 647*42e22086SApple OSS Distributions 648*42e22086SApple OSS Distributions /*! 649*42e22086SApple OSS Distributions * @function buf_clone 650*42e22086SApple OSS Distributions * @abstract Clone a buffer with a restricted range and an optional callback. 651*42e22086SApple OSS Distributions * @discussion Generates a buffer which is identical to its "bp" argument except that 652*42e22086SApple OSS Distributions * it spans a subset of the data of the original. The buffer to be cloned should 653*42e22086SApple OSS Distributions * have been allocated with buf_alloc(). Checks its arguments to make sure 654*42e22086SApple OSS Distributions * that the data subset is coherent. Optionally, adds a callback function and argument to it 655*42e22086SApple OSS Distributions * to be called when I/O completes (as with buf_setcallback(), but B_ASYNC is not set). If the original buffer had 656*42e22086SApple OSS Distributions * a upl set through buf_setupl(), this upl is copied to the new buffer; otherwise, the original's 657*42e22086SApple OSS Distributions * data pointer is used raw. The buffer must be released with buf_free(). 658*42e22086SApple OSS Distributions * @param bp Buffer to clone. 659*42e22086SApple OSS Distributions * @param io_offset Offset, relative to start of data in original buffer, at which new buffer's data will begin. 660*42e22086SApple OSS Distributions * @param io_size Size of buffer region in new buffer, in the sense of buf_count(). 661*42e22086SApple OSS Distributions * @param iodone Callback to be called from buf_biodone() when I/O completes, in the sense of buf_setcallback(). 662*42e22086SApple OSS Distributions * @param arg Argument to pass to iodone() callback. 663*42e22086SApple OSS Distributions * @return NULL if io_offset/io_size combination is invalid for the buffer to be cloned; otherwise, the new buffer. 664*42e22086SApple OSS Distributions */ 665*42e22086SApple OSS Distributions buf_t buf_clone(buf_t bp, int io_offset, int io_size, void (*iodone)(buf_t, void *), void *arg); 666*42e22086SApple OSS Distributions 667*42e22086SApple OSS Distributions 668*42e22086SApple OSS Distributions /*! 669*42e22086SApple OSS Distributions * @function buf_create_shadow 670*42e22086SApple OSS Distributions * @abstract Create a shadow buffer with optional private storage and an optional callback. 671*42e22086SApple OSS Distributions * @param bp Buffer to shadow. 672*42e22086SApple OSS Distributions * @param force_copy If TRUE, do not link the shadaow to 'bp' and if 'external_storage' == NULL, 673*42e22086SApple OSS Distributions * force a copy of the data associated with 'bp'. 674*42e22086SApple OSS Distributions * @param external_storage If non-NULL, associate it with the new buffer as its storage instead of the 675*42e22086SApple OSS Distributions * storage currently associated with 'bp'. 676*42e22086SApple OSS Distributions * @param iodone Callback to be called from buf_biodone() when I/O completes, in the sense of buf_setcallback(). 677*42e22086SApple OSS Distributions * @param arg Argument to pass to iodone() callback. 678*42e22086SApple OSS Distributions * @return NULL if the buffer to be shadowed is not B_META or a primary buffer (i.e. not a shadow buffer); otherwise, the new buffer. 679*42e22086SApple OSS Distributions */ 680*42e22086SApple OSS Distributions 681*42e22086SApple OSS Distributions buf_t buf_create_shadow(buf_t bp, boolean_t force_copy, uintptr_t external_storage, void (*iodone)(buf_t, void *), void *arg); 682*42e22086SApple OSS Distributions 683*42e22086SApple OSS Distributions 684*42e22086SApple OSS Distributions /*! 685*42e22086SApple OSS Distributions * @function buf_shadow 686*42e22086SApple OSS Distributions * @abstract returns true if 'bp' is a shadow of another buffer. 687*42e22086SApple OSS Distributions * @param bp Buffer to query. 688*42e22086SApple OSS Distributions * @return 1 if 'bp' is a shadow, 0 otherwise. 689*42e22086SApple OSS Distributions */ 690*42e22086SApple OSS Distributions int buf_shadow(buf_t bp); 691*42e22086SApple OSS Distributions 692*42e22086SApple OSS Distributions 693*42e22086SApple OSS Distributions /*! 694*42e22086SApple OSS Distributions * @function buf_alloc 695*42e22086SApple OSS Distributions * @abstract Allocate an uninitialized buffer. 696*42e22086SApple OSS Distributions * @discussion A buffer returned by buf_alloc() is marked as busy and as an iobuf; it has no storage set up and must be 697*42e22086SApple OSS Distributions * set up using buf_setdataptr() or buf_setupl()/buf_map(). 698*42e22086SApple OSS Distributions * @param vp vnode to associate with the buffer: optionally NULL. If vp is a device file, then 699*42e22086SApple OSS Distributions * the buffer's associated device will be set. If vp is NULL, it can be set later with buf_setvnode(). 700*42e22086SApple OSS Distributions * @return New buffer. 701*42e22086SApple OSS Distributions */ 702*42e22086SApple OSS Distributions buf_t buf_alloc(vnode_t vp); 703*42e22086SApple OSS Distributions 704*42e22086SApple OSS Distributions /*! 705*42e22086SApple OSS Distributions * @function buf_free 706*42e22086SApple OSS Distributions * @abstract Free a buffer that was allocated with buf_alloc(). 707*42e22086SApple OSS Distributions * @discussion The storage (UPL, data pointer) associated with an iobuf must be freed manually. 708*42e22086SApple OSS Distributions * @param bp The buffer to free. 709*42e22086SApple OSS Distributions */ 710*42e22086SApple OSS Distributions void buf_free(buf_t bp); 711*42e22086SApple OSS Distributions 712*42e22086SApple OSS Distributions /* 713*42e22086SApple OSS Distributions * flags for buf_invalidateblks 714*42e22086SApple OSS Distributions */ 715*42e22086SApple OSS Distributions #define BUF_WRITE_DATA 0x0001 /* write data blocks first */ 716*42e22086SApple OSS Distributions #define BUF_SKIP_META 0x0002 /* skip over metadata blocks */ 717*42e22086SApple OSS Distributions #define BUF_INVALIDATE_LOCKED 0x0004 /* force B_LOCKED blocks to be invalidated */ 718*42e22086SApple OSS Distributions 719*42e22086SApple OSS Distributions /*! 720*42e22086SApple OSS Distributions * @function buf_invalidateblks 721*42e22086SApple OSS Distributions * @abstract Invalidate all the blocks associated with a vnode. 722*42e22086SApple OSS Distributions * @discussion This function does for all blocks associated with a vnode what buf_invalblkno does for one block. 723*42e22086SApple OSS Distributions * Again, it will only be able to invalidate data which were populated with traditional buffer cache routines, 724*42e22086SApple OSS Distributions * i.e. by buf_getblk() and callers thereof. Unlike buf_invalblkno(), it can be made to write dirty data to disk 725*42e22086SApple OSS Distributions * rather than casting it aside. 726*42e22086SApple OSS Distributions * @param vp The vnode whose data to invalidate. 727*42e22086SApple OSS Distributions * @param flags BUF_WRITE_DATA: write dirty data to disk with VNOP_BWRITE() before kicking buffer cache entries out. 728*42e22086SApple OSS Distributions * BUF_SKIP_META: do not invalidate metadata blocks. 729*42e22086SApple OSS Distributions * @param slpflag Flags to pass to "msleep" while waiting to acquire busy buffers. 730*42e22086SApple OSS Distributions * @param slptimeo Timeout in "hz" (1/100 second) to wait for a buffer to become unbusy before waking from sleep 731*42e22086SApple OSS Distributions * and re-starting the scan. 732*42e22086SApple OSS Distributions * @return 0 for success, error values from msleep(). 733*42e22086SApple OSS Distributions */ 734*42e22086SApple OSS Distributions int buf_invalidateblks(vnode_t vp, int flags, int slpflag, int slptimeo); 735*42e22086SApple OSS Distributions 736*42e22086SApple OSS Distributions /* 737*42e22086SApple OSS Distributions * flags for buf_flushdirtyblks and buf_iterate 738*42e22086SApple OSS Distributions */ 739*42e22086SApple OSS Distributions #define BUF_SKIP_NONLOCKED 0x01 740*42e22086SApple OSS Distributions #define BUF_SKIP_LOCKED 0x02 741*42e22086SApple OSS Distributions #define BUF_SCAN_CLEAN 0x04 /* scan the clean buffers */ 742*42e22086SApple OSS Distributions #define BUF_SCAN_DIRTY 0x08 /* scan the dirty buffers */ 743*42e22086SApple OSS Distributions #define BUF_NOTIFY_BUSY 0x10 /* notify the caller about the busy pages during the scan */ 744*42e22086SApple OSS Distributions 745*42e22086SApple OSS Distributions 746*42e22086SApple OSS Distributions #define BUF_RETURNED 0 747*42e22086SApple OSS Distributions #define BUF_RETURNED_DONE 1 748*42e22086SApple OSS Distributions #define BUF_CLAIMED 2 749*42e22086SApple OSS Distributions #define BUF_CLAIMED_DONE 3 750*42e22086SApple OSS Distributions /*! 751*42e22086SApple OSS Distributions * @function buf_flushdirtyblks 752*42e22086SApple OSS Distributions * @abstract Write dirty file blocks to disk. 753*42e22086SApple OSS Distributions * @param vp The vnode whose blocks to flush. 754*42e22086SApple OSS Distributions * @param wait Wait for writes to complete before returning. 755*42e22086SApple OSS Distributions * @param flags Can pass zero, meaning "flush all dirty buffers." 756*42e22086SApple OSS Distributions * BUF_SKIP_NONLOCKED: Skip buffers which are not busy when we encounter them. 757*42e22086SApple OSS Distributions * BUF_SKIP_LOCKED: Skip buffers which are busy when we encounter them. 758*42e22086SApple OSS Distributions * @param msg String to pass to msleep(). 759*42e22086SApple OSS Distributions */ 760*42e22086SApple OSS Distributions void buf_flushdirtyblks(vnode_t vp, int wait, int flags, const char *msg); 761*42e22086SApple OSS Distributions 762*42e22086SApple OSS Distributions /*! 763*42e22086SApple OSS Distributions * @function buf_iterate 764*42e22086SApple OSS Distributions * @abstract Perform some operation on all buffers associated with a vnode. 765*42e22086SApple OSS Distributions * @param vp The vnode whose buffers to scan. 766*42e22086SApple OSS Distributions * @param callout Function to call on each buffer. Should return one of: 767*42e22086SApple OSS Distributions * BUF_RETURNED: buf_iterate() should call buf_brelse() on the buffer. 768*42e22086SApple OSS Distributions * BUF_RETURNED_DONE: buf_iterate() should call buf_brelse() on the buffer and then stop iterating. 769*42e22086SApple OSS Distributions * BUF_CLAIMED: buf_iterate() should continue iterating (and not call buf_brelse()). 770*42e22086SApple OSS Distributions * BUF_CLAIMED_DONE: buf_iterate() should stop iterating (and not call buf_brelse()). 771*42e22086SApple OSS Distributions * @param flags 772*42e22086SApple OSS Distributions * 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. 773*42e22086SApple OSS Distributions * BUF_SCAN_CLEAN: Call out on clean buffers. 774*42e22086SApple OSS Distributions * BUF_SCAN_DIRTY: Call out on dirty buffers. 775*42e22086SApple OSS Distributions * BUF_NOTIFY_BUSY: If a buffer cannot be acquired, pass a NULL buffer to callout; otherwise, 776*42e22086SApple OSS Distributions * that buffer will be silently skipped. 777*42e22086SApple OSS Distributions * @param arg Argument to pass to callout in addition to buffer. 778*42e22086SApple OSS Distributions */ 779*42e22086SApple OSS Distributions void buf_iterate(vnode_t vp, int (*callout)(buf_t, void *), int flags, void *arg); 780*42e22086SApple OSS Distributions 781*42e22086SApple OSS Distributions /*! 782*42e22086SApple OSS Distributions * @function buf_clear 783*42e22086SApple OSS Distributions * @abstract Zero out the storage associated with a buffer. 784*42e22086SApple OSS Distributions * @discussion Calls buf_map() to get the buffer's data address; for a B_CLUSTER 785*42e22086SApple OSS Distributions * buffer (one which has had buf_setupl() called on it), it tries to map the buffer's 786*42e22086SApple OSS Distributions * UPL into memory; should only be called once during the life cycle of an iobuf (one allocated 787*42e22086SApple OSS Distributions * with buf_alloc()). 788*42e22086SApple OSS Distributions * @param bp The buffer to zero out. 789*42e22086SApple OSS Distributions */ 790*42e22086SApple OSS Distributions void buf_clear(buf_t bp); 791*42e22086SApple OSS Distributions 792*42e22086SApple OSS Distributions /*! 793*42e22086SApple OSS Distributions * @function buf_bawrite 794*42e22086SApple OSS Distributions * @abstract Start an asychronous write on a buffer. 795*42e22086SApple OSS Distributions * @discussion Calls VNOP_BWRITE to start the process of propagating an asynchronous write down to the device layer. 796*42e22086SApple OSS Distributions * Callers can wait for writes to complete at their discretion using buf_biowait(). When this function is called, 797*42e22086SApple OSS Distributions * data should already have been written to the buffer's data region. 798*42e22086SApple OSS Distributions * @param bp The buffer on which to initiate I/O. 799*42e22086SApple OSS Distributions * @return EWOULDBLOCK if write count is high and "throttle" is zero; otherwise, errors from VNOP_BWRITE. 800*42e22086SApple OSS Distributions */ 801*42e22086SApple OSS Distributions errno_t buf_bawrite(buf_t bp); 802*42e22086SApple OSS Distributions 803*42e22086SApple OSS Distributions /*! 804*42e22086SApple OSS Distributions * @function buf_bdwrite 805*42e22086SApple OSS Distributions * @abstract Mark a buffer for delayed write. 806*42e22086SApple OSS Distributions * @discussion Marks a buffer as waiting for delayed write and the current I/O as complete; data will be written to backing store 807*42e22086SApple OSS Distributions * before the buffer is reused, but it will not be queued for I/O immediately. Note that for buffers allocated 808*42e22086SApple OSS Distributions * with buf_alloc(), there are no such guarantees; you must take care of your own flushing to disk. If 809*42e22086SApple OSS Distributions * the number of delayed writes pending on the system is greater than an internal limit and the caller has not 810*42e22086SApple OSS Distributions * requested otherwise [see return_error] , buf_bdwrite() will unilaterally launch an asynchronous I/O with buf_bawrite() to keep the pile of 811*42e22086SApple OSS Distributions * delayed writes from getting too large. 812*42e22086SApple OSS Distributions * @param bp The buffer to mark for delayed write. 813*42e22086SApple OSS Distributions * @return EAGAIN for return_error != 0 case, 0 for succeess, errors from buf_bawrite. 814*42e22086SApple OSS Distributions */ 815*42e22086SApple OSS Distributions errno_t buf_bdwrite(buf_t bp); 816*42e22086SApple OSS Distributions 817*42e22086SApple OSS Distributions /*! 818*42e22086SApple OSS Distributions * @function buf_bwrite 819*42e22086SApple OSS Distributions * @abstract Write a buffer's data to backing store. 820*42e22086SApple OSS Distributions * @discussion Once the data in a buffer has been modified, buf_bwrite() starts sending it to disk by calling 821*42e22086SApple OSS Distributions * VNOP_STRATEGY. Unless B_ASYNC has been set on the buffer (by buf_setflags() or otherwise), data will have 822*42e22086SApple OSS Distributions * been written to disk when buf_bwrite() returns. See Bach (p 56). 823*42e22086SApple OSS Distributions * @param bp The buffer to write to disk. 824*42e22086SApple OSS Distributions * @return 0 for success; errors from buf_biowait(). 825*42e22086SApple OSS Distributions */ 826*42e22086SApple OSS Distributions errno_t buf_bwrite(buf_t bp); 827*42e22086SApple OSS Distributions 828*42e22086SApple OSS Distributions /*! 829*42e22086SApple OSS Distributions * @function buf_biodone 830*42e22086SApple OSS Distributions * @abstract Mark an I/O as completed. 831*42e22086SApple OSS Distributions * @discussion buf_biodone() should be called by whosoever decides that an I/O on a buffer is complete; for example, 832*42e22086SApple OSS Distributions * IOStorageFamily. It clears the dirty flag on a buffer and signals on the vnode that a write has completed 833*42e22086SApple OSS Distributions * with vnode_writedone(). If a callout or filter has been set on the buffer, that function is called. In the case 834*42e22086SApple OSS Distributions * of a callout, that function is expected to take care of cleaning up and freeing the buffer. 835*42e22086SApple OSS Distributions * Otherwise, if the buffer is marked B_ASYNC (e.g. it was passed to buf_bawrite()), then buf_biodone() 836*42e22086SApple OSS Distributions * considers itself justified in calling buf_brelse() to return it to free lists--no one is waiting for it. Finally, 837*42e22086SApple OSS Distributions * waiters on the bp (e.g. in buf_biowait()) are woken up. 838*42e22086SApple OSS Distributions * @param bp The buffer to mark as done with I/O. 839*42e22086SApple OSS Distributions */ 840*42e22086SApple OSS Distributions void buf_biodone(buf_t bp); 841*42e22086SApple OSS Distributions 842*42e22086SApple OSS Distributions /*! 843*42e22086SApple OSS Distributions * @function buf_biowait 844*42e22086SApple OSS Distributions * @abstract Wait for I/O on a buffer to complete. 845*42e22086SApple OSS Distributions * @discussion Waits for I/O on a buffer to finish, as marked by a buf_biodone() call. 846*42e22086SApple OSS Distributions * @param bp The buffer to wait on. 847*42e22086SApple OSS Distributions * @return 0 for a successful wait; nonzero the buffer has been marked as EINTR or had an error set on it. 848*42e22086SApple OSS Distributions */ 849*42e22086SApple OSS Distributions errno_t buf_biowait(buf_t bp); 850*42e22086SApple OSS Distributions 851*42e22086SApple OSS Distributions /*! 852*42e22086SApple OSS Distributions * @function buf_brelse 853*42e22086SApple OSS Distributions * @abstract Release any claim to a buffer, sending it back to free lists. 854*42e22086SApple OSS Distributions * @discussion buf_brelse() cleans up buffer state and releases a buffer to the free lists. If the buffer 855*42e22086SApple OSS Distributions * is not marked invalid and its pages are dirty (e.g. a delayed write was made), its data will be commited 856*42e22086SApple OSS Distributions * to backing store. If it is marked invalid, its data will be discarded completely. 857*42e22086SApple OSS Distributions * A valid, cacheable buffer will be put on a list and kept in the buffer hash so it 858*42e22086SApple OSS Distributions * can be found again; otherwise, it will be dissociated from its vnode and treated as empty. Which list a valid 859*42e22086SApple OSS Distributions * buffer is placed on depends on the use of buf_markaged(), whether it is metadata, and the B_LOCKED flag. A 860*42e22086SApple OSS Distributions * B_LOCKED buffer will not be available for reuse by other files, though its data may be paged out. 861*42e22086SApple OSS Distributions * Note that buf_brelse() is intended for use with traditionally allocated buffers. 862*42e22086SApple OSS Distributions * @param bp The buffer to release. 863*42e22086SApple OSS Distributions */ 864*42e22086SApple OSS Distributions void buf_brelse(buf_t bp); 865*42e22086SApple OSS Distributions 866*42e22086SApple OSS Distributions /*! 867*42e22086SApple OSS Distributions * @function buf_bread 868*42e22086SApple OSS Distributions * @abstract Synchronously read a block of a file. 869*42e22086SApple OSS Distributions * @discussion buf_bread() is the traditional way to read a single logical block of a file through the buffer cache. 870*42e22086SApple OSS Distributions * It tries to find the buffer and corresponding page(s) in core, calls VNOP_STRATEGY if necessary to bring the data 871*42e22086SApple OSS Distributions * into memory, and waits for I/O to complete. It should not be used to read blocks of greater than 4K (one VM page) 872*42e22086SApple OSS Distributions * in size; use cluster routines for large reads. Indeed, the cluster layer is a more efficient choice for reading DATA 873*42e22086SApple OSS Distributions * unless you need some finely-tuned semantics that it cannot provide. 874*42e22086SApple OSS Distributions * @param vp The file from which to read. 875*42e22086SApple OSS Distributions * @param blkno The logical (filesystem) block number to read. 876*42e22086SApple OSS Distributions * @param size Size of block; do not use for sizes > 4K. 877*42e22086SApple OSS Distributions * @param cred Credential to store and use for reading from disk if data are not already in core. 878*42e22086SApple OSS Distributions * @param bpp Destination pointer for buffer. 879*42e22086SApple OSS Distributions * @return 0 for success, or an error from buf_biowait(). 880*42e22086SApple OSS Distributions */ 881*42e22086SApple OSS Distributions errno_t buf_bread(vnode_t vp, daddr64_t blkno, int size, kauth_cred_t cred, buf_t *bpp); 882*42e22086SApple OSS Distributions 883*42e22086SApple OSS Distributions /*! 884*42e22086SApple OSS Distributions * @function buf_breadn 885*42e22086SApple OSS Distributions * @abstract Read a block from a file with read-ahead. 886*42e22086SApple OSS Distributions * @discussion buf_breadn() reads one block synchronously in the style of buf_bread() and fires 887*42e22086SApple OSS Distributions * off a specified set of asynchronous reads to improve the likelihood of future cache hits. 888*42e22086SApple OSS Distributions * It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster 889*42e22086SApple OSS Distributions * routines for large reads. Indeed, the cluster layer is a more efficient choice for reading DATA 890*42e22086SApple OSS Distributions * unless you need some finely-tuned semantics that it cannot provide. 891*42e22086SApple OSS Distributions * @param vp The file from which to read. 892*42e22086SApple OSS Distributions * @param blkno The logical (filesystem) block number to read synchronously. 893*42e22086SApple OSS Distributions * @param size Size of block; do not use for sizes > 4K. 894*42e22086SApple OSS Distributions * @param rablks Array of logical block numbers for asynchronous read-aheads. 895*42e22086SApple OSS Distributions * @param rasizes Array of block sizes for asynchronous read-aheads, each index corresponding to same index in "rablks." 896*42e22086SApple OSS Distributions * @param nrablks Number of entries in read-ahead arrays. 897*42e22086SApple OSS Distributions * @param cred Credential to store and use for reading from disk if data are not already in core. 898*42e22086SApple OSS Distributions * @param bpp Destination pointer for buffer. 899*42e22086SApple OSS Distributions * @return 0 for success, or an error from buf_biowait(). 900*42e22086SApple OSS Distributions */ 901*42e22086SApple OSS Distributions errno_t buf_breadn(vnode_t vp, daddr64_t blkno, int size, daddr64_t *rablks, int *rasizes, int nrablks, kauth_cred_t cred, buf_t *bpp); 902*42e22086SApple OSS Distributions 903*42e22086SApple OSS Distributions /*! 904*42e22086SApple OSS Distributions * @function buf_meta_bread 905*42e22086SApple OSS Distributions * @abstract Synchronously read a metadata block of a file. 906*42e22086SApple OSS Distributions * @discussion buf_meta_bread() is the traditional way to read a single logical block of a file through the buffer cache. 907*42e22086SApple OSS Distributions * It tries to find the buffer and corresponding page(s) in core, calls VNOP_STRATEGY if necessary to bring the data 908*42e22086SApple OSS Distributions * into memory, and waits for I/O to complete. It should not be used to read blocks of greater than 4K (one VM page) 909*42e22086SApple OSS Distributions * in size; use cluster routines for large reads. Reading meta-data through the traditional buffer cache, unlike 910*42e22086SApple OSS Distributions * reading data, is efficient and encouraged, especially if the blocks being read are significantly smaller than page size. 911*42e22086SApple OSS Distributions * @param vp The file from which to read. 912*42e22086SApple OSS Distributions * @param blkno The logical (filesystem) block number to read. 913*42e22086SApple OSS Distributions * @param size Size of block; do not use for sizes > 4K. 914*42e22086SApple OSS Distributions * @param cred Credential to store and use for reading from disk if data are not already in core. 915*42e22086SApple OSS Distributions * @param bpp Destination pointer for buffer. 916*42e22086SApple OSS Distributions * @return 0 for success, or an error from buf_biowait(). 917*42e22086SApple OSS Distributions */ 918*42e22086SApple OSS Distributions errno_t buf_meta_bread(vnode_t vp, daddr64_t blkno, int size, kauth_cred_t cred, buf_t *bpp); 919*42e22086SApple OSS Distributions 920*42e22086SApple OSS Distributions /*! 921*42e22086SApple OSS Distributions * @function buf_meta_breadn 922*42e22086SApple OSS Distributions * @abstract Read a metadata block from a file with read-ahead. 923*42e22086SApple OSS Distributions * @discussion buf_meta_breadn() reads one block synchronously in the style of buf_meta_bread() and fires 924*42e22086SApple OSS Distributions * off a specified set of asynchronous reads to improve the likelihood of future cache hits. 925*42e22086SApple OSS Distributions * It should not be used to read blocks of greater than 4K (one VM page) in size; use cluster 926*42e22086SApple OSS Distributions * routines for large reads. 927*42e22086SApple OSS Distributions * @param vp The file from which to read. 928*42e22086SApple OSS Distributions * @param blkno The logical (filesystem) block number to read synchronously. 929*42e22086SApple OSS Distributions * @param size Size of block; do not use for sizes > 4K. 930*42e22086SApple OSS Distributions * @param rablks Array of logical block numbers for asynchronous read-aheads. 931*42e22086SApple OSS Distributions * @param rasizes Array of block sizes for asynchronous read-aheads, each index corresponding to same index in "rablks." 932*42e22086SApple OSS Distributions * @param nrablks Number of entries in read-ahead arrays. 933*42e22086SApple OSS Distributions * @param cred Credential to store and use for reading from disk if data are not already in core. 934*42e22086SApple OSS Distributions * @param bpp Destination pointer for buffer. 935*42e22086SApple OSS Distributions * @return 0 for success, or an error from buf_biowait(). 936*42e22086SApple OSS Distributions */ 937*42e22086SApple OSS Distributions errno_t buf_meta_breadn(vnode_t vp, daddr64_t blkno, int size, daddr64_t *rablks, int *rasizes, int nrablks, kauth_cred_t cred, buf_t *bpp); 938*42e22086SApple OSS Distributions 939*42e22086SApple OSS Distributions /*! 940*42e22086SApple OSS Distributions * @function minphys 941*42e22086SApple OSS Distributions * @abstract Adjust a buffer's count to be no more than maximum physical I/O transfer size for the host architecture. 942*42e22086SApple OSS Distributions * @discussion physio() takes as a parameter a function to bound transfer sizes for each VNOP_STRATEGY() call. minphys() 943*42e22086SApple OSS Distributions * is a default implementation. It calls buf_setcount() to make the buffer's count the min() of its current count 944*42e22086SApple OSS Distributions * and the max I/O size for the host architecture. 945*42e22086SApple OSS Distributions * @param bp The buffer whose byte count to modify. 946*42e22086SApple OSS Distributions * @return New byte count. 947*42e22086SApple OSS Distributions */ 948*42e22086SApple OSS Distributions u_int minphys(buf_t bp); 949*42e22086SApple OSS Distributions 950*42e22086SApple OSS Distributions /*! 951*42e22086SApple OSS Distributions * @function physio 952*42e22086SApple OSS Distributions * @abstract Perform I/O on a device to/from target memory described by a uio. 953*42e22086SApple OSS Distributions * @discussion physio() allows I/O directly from a device to user-space memory. It waits 954*42e22086SApple OSS Distributions * for all I/O to complete before returning. 955*42e22086SApple OSS Distributions * @param f_strategy Strategy routine to call to initiate I/O. 956*42e22086SApple OSS Distributions * @param bp Buffer to configure and pass to strategy routine; can be NULL. 957*42e22086SApple OSS Distributions * @param dev Device on which to perform I/O. 958*42e22086SApple OSS Distributions * @param flags B_READ or B_WRITE. 959*42e22086SApple OSS Distributions * @param f_minphys Function which calls buf_setcount() to set a byte count which is suitably 960*42e22086SApple OSS Distributions * small for the device in question. Returns byte count that has been set (or unchanged) on the buffer. 961*42e22086SApple OSS Distributions * @param uio UIO describing the I/O operation. 962*42e22086SApple OSS Distributions * @param blocksize Logical block size for this vnode. 963*42e22086SApple OSS Distributions * @return 0 for success; EFAULT for an invalid uio; errors from buf_biowait(). 964*42e22086SApple OSS Distributions */ 965*42e22086SApple OSS Distributions int physio(void (*f_strategy)(buf_t), buf_t bp, dev_t dev, int flags, u_int (*f_minphys)(buf_t), struct uio *uio, int blocksize); 966*42e22086SApple OSS Distributions 967*42e22086SApple OSS Distributions 968*42e22086SApple OSS Distributions /* 969*42e22086SApple OSS Distributions * Flags for operation type in getblk() 970*42e22086SApple OSS Distributions */ 971*42e22086SApple OSS Distributions #define BLK_READ 0x01 /* buffer for read */ 972*42e22086SApple OSS Distributions #define BLK_WRITE 0x02 /* buffer for write */ 973*42e22086SApple OSS Distributions #define BLK_META 0x10 /* buffer for metadata */ 974*42e22086SApple OSS Distributions /* 975*42e22086SApple OSS Distributions * modifier for above flags... if set, getblk will only return 976*42e22086SApple OSS Distributions * a bp that is already valid... i.e. found in the cache 977*42e22086SApple OSS Distributions */ 978*42e22086SApple OSS Distributions #define BLK_ONLYVALID 0x80000000 979*42e22086SApple OSS Distributions 980*42e22086SApple OSS Distributions /*! 981*42e22086SApple OSS Distributions * @function buf_getblk 982*42e22086SApple OSS Distributions * @abstract Traditional buffer cache routine to get a buffer corresponding to a logical block in a file. 983*42e22086SApple OSS Distributions * @discussion buf_getblk() gets a buffer, not necessarily containing valid data, representing a block in a file. 984*42e22086SApple OSS Distributions * A metadata buffer will be returned with its own zone-allocated storage, managed by the traditional buffer-cache 985*42e22086SApple OSS Distributions * layer, whereas data buffers will be returned hooked into backing by the UBC (which in fact controls the caching of data). 986*42e22086SApple OSS Distributions * 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 987*42e22086SApple OSS Distributions * unbusy, depending on the slpflag and slptimeo parameters. If the buffer is found unbusy and is a metadata buffer, 988*42e22086SApple OSS Distributions * it must already contain valid data and will be returned directly; data buffers will have a UPL configured to 989*42e22086SApple OSS Distributions * prepare for interaction with the underlying UBC. If the buffer is found in core, it will be marked as such 990*42e22086SApple OSS Distributions * and buf_fromcache() will return truth. A buffer is allocated and initialized (but not filled with data) 991*42e22086SApple OSS Distributions * if none is found in core. buf_bread(), buf_breadn(), buf_meta_bread(), and buf_meta_breadn() all 992*42e22086SApple OSS Distributions * return buffers obtained with buf_getblk(). 993*42e22086SApple OSS Distributions * @param vp File for which to get block. 994*42e22086SApple OSS Distributions * @param blkno Logical block number. 995*42e22086SApple OSS Distributions * @param size Size of block. 996*42e22086SApple OSS Distributions * @param slpflag Flag to pass to msleep() while waiting for buffer to become unbusy. 997*42e22086SApple OSS Distributions * @param slptimeo Time, in milliseconds, to wait for buffer to become unbusy. 0 means to wait indefinitely. 998*42e22086SApple OSS Distributions * @param operation BLK_READ: want a read buffer. BLK_WRITE: want a write buffer. BLK_META: want a metadata buffer. BLK_ONLYVALID: 999*42e22086SApple OSS Distributions * only return buffers which are found in core (do not allocate anew), and do not change buffer size. The last remark means 1000*42e22086SApple OSS Distributions * 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. 1001*42e22086SApple OSS Distributions * @return Buffer found in core or newly allocated, either containing valid data or ready for I/O. 1002*42e22086SApple OSS Distributions */ 1003*42e22086SApple OSS Distributions buf_t buf_getblk(vnode_t vp, daddr64_t blkno, int size, int slpflag, int slptimeo, int operation); 1004*42e22086SApple OSS Distributions 1005*42e22086SApple OSS Distributions /*! 1006*42e22086SApple OSS Distributions * @function buf_geteblk 1007*42e22086SApple OSS Distributions * @abstract Get a metadata buffer which is marked invalid and not associated with any vnode. 1008*42e22086SApple OSS Distributions * @discussion A buffer is returned with zone-allocated storage of the specified size, marked B_META and invalid. 1009*42e22086SApple OSS Distributions * It has no vnode and is not visible in the buffer hash. 1010*42e22086SApple OSS Distributions * @param size Size of buffer. 1011*42e22086SApple OSS Distributions * @return Always returns a new buffer. 1012*42e22086SApple OSS Distributions */ 1013*42e22086SApple OSS Distributions buf_t buf_geteblk(int size); 1014*42e22086SApple OSS Distributions 1015*42e22086SApple OSS Distributions /*! 1016*42e22086SApple OSS Distributions * @function buf_clear_redundancy_flags 1017*42e22086SApple OSS Distributions * @abstract Clear flags on a buffer. 1018*42e22086SApple OSS Distributions * @discussion buffer_redundancy_flags &= ~flags 1019*42e22086SApple OSS Distributions * @param bp Buffer whose flags to clear. 1020*42e22086SApple OSS Distributions * @param flags Flags to remove from buffer's mask 1021*42e22086SApple OSS Distributions */ 1022*42e22086SApple OSS Distributions void buf_clear_redundancy_flags(buf_t bp, uint32_t flags); 1023*42e22086SApple OSS Distributions 1024*42e22086SApple OSS Distributions /*! 1025*42e22086SApple OSS Distributions * @function buf_redundancyflags 1026*42e22086SApple OSS Distributions * @abstract Get redundancy flags set on a buffer. 1027*42e22086SApple OSS Distributions * @param bp Buffer whose redundancy flags to grab. 1028*42e22086SApple OSS Distributions * @return flags. 1029*42e22086SApple OSS Distributions */ 1030*42e22086SApple OSS Distributions uint32_t buf_redundancy_flags(buf_t bp); 1031*42e22086SApple OSS Distributions 1032*42e22086SApple OSS Distributions /*! 1033*42e22086SApple OSS Distributions * @function buf_setredundancyflags 1034*42e22086SApple OSS Distributions * @abstract Set redundancy flags on a buffer. 1035*42e22086SApple OSS Distributions * @discussion buffer_redundancy_flags |= flags 1036*42e22086SApple OSS Distributions * @param bp Buffer whose flags to set. 1037*42e22086SApple OSS Distributions * @param flags Flags to add to buffer's redundancy flags 1038*42e22086SApple OSS Distributions */ 1039*42e22086SApple OSS Distributions void buf_set_redundancy_flags(buf_t bp, uint32_t flags); 1040*42e22086SApple OSS Distributions 1041*42e22086SApple OSS Distributions /*! 1042*42e22086SApple OSS Distributions * @function buf_attr 1043*42e22086SApple OSS Distributions * @abstract Gets the attributes for this buf. 1044*42e22086SApple OSS Distributions * @param bp Buffer whose attributes to get. 1045*42e22086SApple OSS Distributions * @return bufattr_t. 1046*42e22086SApple OSS Distributions */ 1047*42e22086SApple OSS Distributions bufattr_t buf_attr(buf_t bp); 1048*42e22086SApple OSS Distributions 1049*42e22086SApple OSS Distributions /*! 1050*42e22086SApple OSS Distributions * @function buf_markstatic 1051*42e22086SApple OSS Distributions * @abstract Mark a buffer as being likely to contain static data. 1052*42e22086SApple OSS Distributions * @param bp Buffer to mark. 1053*42e22086SApple OSS Distributions */ 1054*42e22086SApple OSS Distributions void buf_markstatic(buf_t bp); 1055*42e22086SApple OSS Distributions 1056*42e22086SApple OSS Distributions /*! 1057*42e22086SApple OSS Distributions * @function buf_static 1058*42e22086SApple OSS Distributions * @abstract Check if a buffer contains static data. 1059*42e22086SApple OSS Distributions * @param bp Buffer to test. 1060*42e22086SApple OSS Distributions * @return Nonzero if buffer has static data, 0 otherwise. 1061*42e22086SApple OSS Distributions */ 1062*42e22086SApple OSS Distributions int buf_static(buf_t bp); 1063*42e22086SApple OSS Distributions 1064*42e22086SApple OSS Distributions /*! 1065*42e22086SApple OSS Distributions * @function bufattr_markiosched 1066*42e22086SApple OSS Distributions * @abstract Mark a buffer as belonging to an io scheduled mount point 1067*42e22086SApple OSS Distributions * @param bap Buffer attributes to mark. 1068*42e22086SApple OSS Distributions * @discussion Marks the buffer so that spec_strategy() will know that it belongs to an io scheduled mount point 1069*42e22086SApple OSS Distributions */ 1070*42e22086SApple OSS Distributions void bufattr_markioscheduled(bufattr_t bap); 1071*42e22086SApple OSS Distributions 1072*42e22086SApple OSS Distributions /*! 1073*42e22086SApple OSS Distributions * @function bufattr_iosched 1074*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked as io scheduled 1075*42e22086SApple OSS Distributions * @param bap Buffer attributes to test. 1076*42e22086SApple OSS Distributions * @return Nonzero if the buffer is marked io scheduled, 0 otherwise. 1077*42e22086SApple OSS Distributions */ 1078*42e22086SApple OSS Distributions int bufattr_ioscheduled(bufattr_t bap); 1079*42e22086SApple OSS Distributions 1080*42e22086SApple OSS Distributions /*! 1081*42e22086SApple OSS Distributions * @function bufattr_markexpeditedmeta 1082*42e22086SApple OSS Distributions * @abstract Mark a metadata I/O buffer as expedited (i.e. requires a high I/O tier). 1083*42e22086SApple OSS Distributions * @param bap Buffer attributes to mark. 1084*42e22086SApple OSS Distributions * @discussion Marks the buffer so that spec_strategy() will know that it should be expedited 1085*42e22086SApple OSS Distributions */ 1086*42e22086SApple OSS Distributions void bufattr_markexpeditedmeta(bufattr_t bap); 1087*42e22086SApple OSS Distributions 1088*42e22086SApple OSS Distributions /*! 1089*42e22086SApple OSS Distributions * @function bufattr_expeditedmeta 1090*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked as expedited metadata I/O. 1091*42e22086SApple OSS Distributions * @param bap Buffer attributes to test. 1092*42e22086SApple OSS Distributions * @return Nonzero if the buffer is marked expedited metadata I/O, 0 otherwise. 1093*42e22086SApple OSS Distributions */ 1094*42e22086SApple OSS Distributions int bufattr_expeditedmeta(bufattr_t bap); 1095*42e22086SApple OSS Distributions 1096*42e22086SApple OSS Distributions #ifdef KERNEL_PRIVATE 1097*42e22086SApple OSS Distributions void buf_setfilter(buf_t, void (*)(buf_t, void *), void *, void(**)(buf_t, void *), void **); 1098*42e22086SApple OSS Distributions 1099*42e22086SApple OSS Distributions /* bufattr allocation/duplication/deallocation functions */ 1100*42e22086SApple OSS Distributions bufattr_t bufattr_alloc(void); 1101*42e22086SApple OSS Distributions bufattr_t bufattr_dup(bufattr_t bap); 1102*42e22086SApple OSS Distributions void bufattr_free(bufattr_t bap); 1103*42e22086SApple OSS Distributions 1104*42e22086SApple OSS Distributions /*! 1105*42e22086SApple OSS Distributions * @function bufattr_cpx 1106*42e22086SApple OSS Distributions * @abstract Returns a pointer to a cpx_t structure. 1107*42e22086SApple OSS Distributions * @param bap Buffer Attribute whose cpx_t structure you wish to get. 1108*42e22086SApple OSS Distributions * @return Returns a cpx_t structure, or NULL if not valid 1109*42e22086SApple OSS Distributions */ 1110*42e22086SApple OSS Distributions struct cpx *bufattr_cpx(bufattr_t bap); 1111*42e22086SApple OSS Distributions 1112*42e22086SApple OSS Distributions /*! 1113*42e22086SApple OSS Distributions * @function bufattr_setcpx 1114*42e22086SApple OSS Distributions * @abstract Set the cp_ctx on a buffer attribute. 1115*42e22086SApple OSS Distributions * @param bap Buffer Attribute that you wish to change 1116*42e22086SApple OSS Distributions */ 1117*42e22086SApple OSS Distributions void bufattr_setcpx(bufattr_t bap, struct cpx *cpx); 1118*42e22086SApple OSS Distributions 1119*42e22086SApple OSS Distributions /*! 1120*42e22086SApple OSS Distributions * @function bufattr_cpoff 1121*42e22086SApple OSS Distributions * @abstract Gets the file offset on the buffer. 1122*42e22086SApple OSS Distributions * @param bap Buffer Attribute whose file offset value is used 1123*42e22086SApple OSS Distributions */ 1124*42e22086SApple OSS Distributions uint64_t bufattr_cpoff(bufattr_t bap); 1125*42e22086SApple OSS Distributions 1126*42e22086SApple OSS Distributions /*! 1127*42e22086SApple OSS Distributions * @function bufattr_setcpoff 1128*42e22086SApple OSS Distributions * @abstract Set the file offset for a content protected I/O on 1129*42e22086SApple OSS Distributions * a buffer attribute. 1130*42e22086SApple OSS Distributions * @param bap Buffer Attribute whose cp file offset has to be set 1131*42e22086SApple OSS Distributions */ 1132*42e22086SApple OSS Distributions void bufattr_setcpoff(bufattr_t bap, uint64_t); 1133*42e22086SApple OSS Distributions 1134*42e22086SApple OSS Distributions /*! 1135*42e22086SApple OSS Distributions * @function bufattr_rawencrypted 1136*42e22086SApple OSS Distributions * @abstract Check if a buffer contains raw encrypted data. 1137*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1138*42e22086SApple OSS Distributions * @return Nonzero if buffer has raw encrypted data, 0 otherwise. 1139*42e22086SApple OSS Distributions */ 1140*42e22086SApple OSS Distributions int bufattr_rawencrypted(bufattr_t bap); 1141*42e22086SApple OSS Distributions 1142*42e22086SApple OSS Distributions /*! 1143*42e22086SApple OSS Distributions * @function bufattr_markgreedymode 1144*42e22086SApple OSS Distributions * @abstract Mark a buffer to use the greedy mode for writing. 1145*42e22086SApple OSS Distributions * @param bap Buffer attributes to mark. 1146*42e22086SApple OSS Distributions * @discussion Greedy Mode: request improved write performance from the underlying device at the expense of storage efficiency 1147*42e22086SApple OSS Distributions */ 1148*42e22086SApple OSS Distributions void bufattr_markgreedymode(bufattr_t bap); 1149*42e22086SApple OSS Distributions 1150*42e22086SApple OSS Distributions /*! 1151*42e22086SApple OSS Distributions * @function bufattr_greedymode 1152*42e22086SApple OSS Distributions * @abstract Check if a buffer is written using the Greedy Mode 1153*42e22086SApple OSS Distributions * @param bap Buffer attributes to test. 1154*42e22086SApple OSS Distributions * @discussion Greedy Mode: request improved write performance from the underlying device at the expense of storage efficiency 1155*42e22086SApple OSS Distributions * @return Nonzero if buffer uses greedy mode, 0 otherwise. 1156*42e22086SApple OSS Distributions */ 1157*42e22086SApple OSS Distributions int bufattr_greedymode(bufattr_t bap); 1158*42e22086SApple OSS Distributions 1159*42e22086SApple OSS Distributions /*! 1160*42e22086SApple OSS Distributions * @function bufattr_markisochronous 1161*42e22086SApple OSS Distributions * @abstract Mark a buffer to use the isochronous throughput mode for writing. 1162*42e22086SApple OSS Distributions * @param bap Buffer attributes to mark. 1163*42e22086SApple OSS Distributions * @discussion isochronous mode: request improved write performance from the underlying device at the expense of storage efficiency 1164*42e22086SApple OSS Distributions */ 1165*42e22086SApple OSS Distributions void bufattr_markisochronous(bufattr_t bap); 1166*42e22086SApple OSS Distributions 1167*42e22086SApple OSS Distributions /*! 1168*42e22086SApple OSS Distributions * @function bufattr_isochronous 1169*42e22086SApple OSS Distributions * @abstract Check if a buffer is written using the isochronous 1170*42e22086SApple OSS Distributions * @param bap Buffer attributes to test. 1171*42e22086SApple OSS Distributions * @discussion isochronous mode: request improved write performance from the underlying device at the expense of storage efficiency 1172*42e22086SApple OSS Distributions * @return Nonzero if buffer uses isochronous mode, 0 otherwise. 1173*42e22086SApple OSS Distributions */ 1174*42e22086SApple OSS Distributions int bufattr_isochronous(bufattr_t bap); 1175*42e22086SApple OSS Distributions 1176*42e22086SApple OSS Distributions 1177*42e22086SApple OSS Distributions /*! 1178*42e22086SApple OSS Distributions * @function bufattr_throttled 1179*42e22086SApple OSS Distributions * @abstract Check if a buffer is throttled. 1180*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1181*42e22086SApple OSS Distributions * @return Nonzero if the buffer is throttled, 0 otherwise. 1182*42e22086SApple OSS Distributions */ 1183*42e22086SApple OSS Distributions int bufattr_throttled(bufattr_t bap); 1184*42e22086SApple OSS Distributions 1185*42e22086SApple OSS Distributions /*! 1186*42e22086SApple OSS Distributions * @function bufattr_willverify 1187*42e22086SApple OSS Distributions * @abstract Check if a buffer is verified by the cluster layer. 1188*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1189*42e22086SApple OSS Distributions * @return Nonzero if the buffer will be verified, 0 otherwise. 1190*42e22086SApple OSS Distributions */ 1191*42e22086SApple OSS Distributions int bufattr_willverify(bufattr_t bap); 1192*42e22086SApple OSS Distributions 1193*42e22086SApple OSS Distributions /*! 1194*42e22086SApple OSS Distributions * @function bufattr_passive 1195*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked passive. 1196*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1197*42e22086SApple OSS Distributions * @return Nonzero if the buffer is marked passive, 0 otherwise. 1198*42e22086SApple OSS Distributions */ 1199*42e22086SApple OSS Distributions int bufattr_passive(bufattr_t bap); 1200*42e22086SApple OSS Distributions 1201*42e22086SApple OSS Distributions /*! 1202*42e22086SApple OSS Distributions * @function bufattr_nocache 1203*42e22086SApple OSS Distributions * @abstract Check if a buffer has nocache attribute. 1204*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1205*42e22086SApple OSS Distributions * @return Nonzero if the buffer is not cached, 0 otherwise. 1206*42e22086SApple OSS Distributions */ 1207*42e22086SApple OSS Distributions int bufattr_nocache(bufattr_t bap); 1208*42e22086SApple OSS Distributions 1209*42e22086SApple OSS Distributions /*! 1210*42e22086SApple OSS Distributions * @function bufattr_meta 1211*42e22086SApple OSS Distributions * @abstract Check if a buffer has the bufattr meta attribute. 1212*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1213*42e22086SApple OSS Distributions * @return Nonzero if the buffer has meta attribute, 0 otherwise. 1214*42e22086SApple OSS Distributions */ 1215*42e22086SApple OSS Distributions 1216*42e22086SApple OSS Distributions int bufattr_meta(bufattr_t bap); 1217*42e22086SApple OSS Distributions 1218*42e22086SApple OSS Distributions /*! 1219*42e22086SApple OSS Distributions * @function bufattr_markmeta 1220*42e22086SApple OSS Distributions * @abstract Set the bufattr meta attribute. 1221*42e22086SApple OSS Distributions * @param bap Buffer attribute to manipulate. 1222*42e22086SApple OSS Distributions */ 1223*42e22086SApple OSS Distributions void bufattr_markmeta(bufattr_t bap); 1224*42e22086SApple OSS Distributions 1225*42e22086SApple OSS Distributions 1226*42e22086SApple OSS Distributions /*! 1227*42e22086SApple OSS Distributions * @function bufattr_delayidlesleep 1228*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked to delay idle sleep on disk IO. 1229*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1230*42e22086SApple OSS Distributions * @return Nonzero if the buffer is marked to delay idle sleep on disk IO, 0 otherwise. 1231*42e22086SApple OSS Distributions */ 1232*42e22086SApple OSS Distributions int bufattr_delayidlesleep(bufattr_t bap); 1233*42e22086SApple OSS Distributions 1234*42e22086SApple OSS Distributions /*! 1235*42e22086SApple OSS Distributions * @function buf_kernel_addrperm_addr 1236*42e22086SApple OSS Distributions * @abstract Obfuscate the buf pointers. 1237*42e22086SApple OSS Distributions * @param addr Buf_t pointer. 1238*42e22086SApple OSS Distributions * @return Obfuscated pointer if addr is non zero, 0 otherwise. 1239*42e22086SApple OSS Distributions */ 1240*42e22086SApple OSS Distributions vm_offset_t buf_kernel_addrperm_addr(void * addr); 1241*42e22086SApple OSS Distributions 1242*42e22086SApple OSS Distributions /*! 1243*42e22086SApple OSS Distributions * @function bufattr_markquickcomplete 1244*42e22086SApple OSS Distributions * @abstract Mark a buffer to hint quick completion to the driver. 1245*42e22086SApple OSS Distributions * @discussion This flag hints the storage driver that some thread is waiting for this I/O to complete. 1246*42e22086SApple OSS Distributions * It should therefore attempt to complete it as soon as possible at the cost of device efficiency. 1247*42e22086SApple OSS Distributions * @param bap Buffer attributes to mark. 1248*42e22086SApple OSS Distributions */ 1249*42e22086SApple OSS Distributions void bufattr_markquickcomplete(bufattr_t bap); 1250*42e22086SApple OSS Distributions 1251*42e22086SApple OSS Distributions /*! 1252*42e22086SApple OSS Distributions * @function bufattr_quickcomplete 1253*42e22086SApple OSS Distributions * @abstract Check if a buffer is marked for quick completion 1254*42e22086SApple OSS Distributions * @discussion This flag hints the storage driver that some thread is waiting for this I/O to complete. 1255*42e22086SApple OSS Distributions * It should therefore attempt to complete it as soon as possible at the cost of device efficiency. 1256*42e22086SApple OSS Distributions * @param bap Buffer attribute to test. 1257*42e22086SApple OSS Distributions * @return Nonzero if the buffer is marked for quick completion, 0 otherwise. 1258*42e22086SApple OSS Distributions */ 1259*42e22086SApple OSS Distributions int bufattr_quickcomplete(bufattr_t bap); 1260*42e22086SApple OSS Distributions 1261*42e22086SApple OSS Distributions int count_lock_queue(void); 1262*42e22086SApple OSS Distributions 1263*42e22086SApple OSS Distributions /* 1264*42e22086SApple OSS Distributions * Flags for buf_acquire 1265*42e22086SApple OSS Distributions */ 1266*42e22086SApple OSS Distributions #define BAC_NOWAIT 0x01 /* Don't wait if buffer is busy */ 1267*42e22086SApple OSS Distributions #define BAC_REMOVE 0x02 /* Remove from free list once buffer is acquired */ 1268*42e22086SApple OSS Distributions #define BAC_SKIP_NONLOCKED 0x04 /* Don't return LOCKED buffers */ 1269*42e22086SApple OSS Distributions #define BAC_SKIP_LOCKED 0x08 /* Only return LOCKED buffers */ 1270*42e22086SApple OSS Distributions 1271*42e22086SApple OSS Distributions errno_t buf_acquire(buf_t, int, int, int); 1272*42e22086SApple OSS Distributions 1273*42e22086SApple OSS Distributions buf_t buf_create_shadow_priv(buf_t bp, boolean_t force_copy, uintptr_t external_storage, void (*iodone)(buf_t, void *), void *arg); 1274*42e22086SApple OSS Distributions 1275*42e22086SApple OSS Distributions void buf_drop(buf_t); 1276*42e22086SApple OSS Distributions 1277*42e22086SApple OSS Distributions #endif /* KERNEL_PRIVATE */ 1278*42e22086SApple OSS Distributions 1279*42e22086SApple OSS Distributions __END_DECLS 1280*42e22086SApple OSS Distributions 1281*42e22086SApple OSS Distributions 1282*42e22086SApple OSS Distributions /* Macros to clear/set/test flags. */ 1283*42e22086SApple OSS Distributions #define SET(t, f) (t) |= (f) 1284*42e22086SApple OSS Distributions #define CLR(t, f) (t) &= ~(f) 1285*42e22086SApple OSS Distributions #define ISSET(t, f) ((t) & (f)) 1286*42e22086SApple OSS Distributions 1287*42e22086SApple OSS Distributions 1288*42e22086SApple OSS Distributions #endif /* !_SYS_BUF_H_ */ 1289