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