|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ ! 23: /* ! 24: * Copyright (c) 1982, 1986, 1989, 1993 ! 25: * The Regents of the University of California. All rights reserved. ! 26: * (c) UNIX System Laboratories, Inc. ! 27: * All or some portions of this file are derived from material licensed ! 28: * to the University of California by American Telephone and Telegraph ! 29: * Co. or Unix System Laboratories, Inc. and are reproduced herein with ! 30: * the permission of UNIX System Laboratories, Inc. ! 31: * ! 32: * Redistribution and use in source and binary forms, with or without ! 33: * modification, are permitted provided that the following conditions ! 34: * are met: ! 35: * 1. Redistributions of source code must retain the above copyright ! 36: * notice, this list of conditions and the following disclaimer. ! 37: * 2. Redistributions in binary form must reproduce the above copyright ! 38: * notice, this list of conditions and the following disclaimer in the ! 39: * documentation and/or other materials provided with the distribution. ! 40: * 3. All advertising materials mentioning features or use of this software ! 41: * must display the following acknowledgement: ! 42: * This product includes software developed by the University of ! 43: * California, Berkeley and its contributors. ! 44: * 4. Neither the name of the University nor the names of its contributors ! 45: * may be used to endorse or promote products derived from this software ! 46: * without specific prior written permission. ! 47: * ! 48: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 49: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 50: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 51: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 52: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 53: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 54: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 55: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 56: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 57: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 58: * SUCH DAMAGE. ! 59: * ! 60: * @(#)buf.h 8.9 (Berkeley) 3/30/95 ! 61: */ ! 62: ! 63: #ifndef _SYS_BUF_H_ ! 64: #define _SYS_BUF_H_ ! 65: #include <sys/queue.h> ! 66: #include <sys/errno.h> ! 67: ! 68: #include <sys/vm.h> ! 69: ! 70: #define NOLIST ((struct buf *)0x87654321) ! 71: ! 72: #include <sys/cdefs.h> ! 73: ! 74: /* ! 75: * The buffer header describes an I/O operation in the kernel. ! 76: */ ! 77: struct buf { ! 78: LIST_ENTRY(buf) b_hash; /* Hash chain. */ ! 79: LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */ ! 80: TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */ ! 81: struct buf *b_actf, **b_actb; /* Device driver queue when active. */ ! 82: struct proc *b_proc; /* Associated proc; NULL if kernel. */ ! 83: volatile long b_flags; /* B_* flags. */ ! 84: int b_error; /* Errno value. */ ! 85: long b_bufsize; /* Allocated buffer size. */ ! 86: long b_bcount; /* Valid bytes in buffer. */ ! 87: long b_resid; /* Remaining I/O. */ ! 88: dev_t b_dev; /* Device associated with buffer. */ ! 89: struct { ! 90: caddr_t b_addr; /* Memory, superblocks, indirect etc.*/ ! 91: } b_un; ! 92: void *b_saveaddr; /* Original b_addr for physio. */ ! 93: daddr_t b_lblkno; /* Logical block number. */ ! 94: daddr_t b_blkno; /* Underlying physical block number. */ ! 95: /* Function to call upon completion. */ ! 96: void (*b_iodone) __P((struct buf *)); ! 97: struct vnode *b_vp; /* Device vnode. */ ! 98: int b_dirtyoff; /* Offset in buffer of dirty region. */ ! 99: int b_dirtyend; /* Offset of end of dirty region. */ ! 100: struct ucred *b_rcred; /* Read credentials reference. */ ! 101: struct ucred *b_wcred; /* Write credentials reference. */ ! 102: int b_validoff; /* Offset in buffer of valid region. */ ! 103: int b_validend; /* Offset of end of valid region. */ ! 104: void *b_drvdata; /* driver specific data */ ! 105: int b_timestamp; /* timestamp for queuing operation */ ! 106: long b_reserved[3]; /* Reserved for future HFS use */ ! 107: }; ! 108: ! 109: /* ! 110: * For portability with historic industry practice, the cylinder number has ! 111: * to be maintained in the `b_resid' field. ! 112: */ ! 113: #define b_cylinder b_resid /* Cylinder number for disksort(). */ ! 114: ! 115: /* Device driver compatibility definitions. */ ! 116: #define b_active b_bcount /* Driver queue head: drive active. */ ! 117: #define b_data b_un.b_addr /* b_un.b_addr is not changeable. */ ! 118: #define b_errcnt b_resid /* Retry count while I/O in progress. */ ! 119: #define iodone biodone /* Old name for biodone. */ ! 120: #define iowait biowait /* Old name for biowait. */ ! 121: ! 122: /* ! 123: * These flags are kept in b_flags. ! 124: */ ! 125: #define B_AGE 0x00000001 /* Move to age queue when I/O done. */ ! 126: #define B_NEEDCOMMIT 0x00000002 /* Append-write in progress. */ ! 127: #define B_ASYNC 0x00000004 /* Start I/O, do not wait. */ ! 128: #define B_BAD 0x00000008 /* Bad block revectoring in progress. */ ! 129: #define B_BUSY 0x00000010 /* I/O in progress. */ ! 130: #define B_CACHE 0x00000020 /* Bread found us in the cache. */ ! 131: #define B_CALL 0x00000040 /* Call b_iodone from biodone. */ ! 132: #define B_DELWRI 0x00000080 /* Delay I/O until buffer reused. */ ! 133: #define B_DIRTY 0x00000100 /* Dirty page to be pushed out async. */ ! 134: #define B_DONE 0x00000200 /* I/O completed. */ ! 135: #define B_EINTR 0x00000400 /* I/O was interrupted */ ! 136: #define B_ERROR 0x00000800 /* I/O error occurred. */ ! 137: #define B_GATHERED 0x00001000 /* LFS: already in a segment. */ ! 138: #define B_INVAL 0x00002000 /* Does not contain valid info. */ ! 139: #define B_LOCKED 0x00004000 /* Locked in core (not reusable). */ ! 140: #define B_NOCACHE 0x00008000 /* Do not cache block after use. */ ! 141: #define B_PAGET 0x00010000 /* Page in/out of page table space. */ ! 142: #define B_PGIN 0x00020000 /* Pagein op, so swap() can count it. */ ! 143: #define B_PHYS 0x00040000 /* I/O to user memory. */ ! 144: #define B_RAW 0x00080000 /* Set by physio for raw transfers. */ ! 145: #define B_READ 0x00100000 /* Read buffer. */ ! 146: #define B_TAPE 0x00200000 /* Magnetic tape I/O. */ ! 147: #define B_UAREA 0x00400000 /* Buffer describes Uarea I/O. */ ! 148: #define B_WANTED 0x00800000 /* Process wants this buffer. */ ! 149: #define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ ! 150: #define B_WRITEINPROG 0x01000000 /* Write in progress. */ ! 151: #define B_XXX 0x02000000 /* Debugging flag. */ ! 152: #define B_KERNSPACE 0x04000000 /* physical I/O to kernel space */ ! 153: #define B_CLUST_SYNC 0x08000000 /* part of synchronous cluster write */ ! 154: #define B_CLUST_COMMIT 0x10000000 /* commit cluster to disk and wait */ ! 155: ! 156: #define B_SCRACH5 0x40000000 /* Used by device drivers. */ ! 157: #define B_SCRACH6 0x80000000 /* Used by device drivers. */ ! 158: ! 159: /* ! 160: * This structure describes a clustered I/O. It is stored in the b_saveaddr ! 161: * field of the buffer on which I/O is done. At I/O completion, cluster ! 162: * callback uses the structure to parcel I/O's to individual buffers, and ! 163: * then free's this structure. ! 164: */ ! 165: struct cluster_save { ! 166: long bs_bcount; /* Saved b_bcount. */ ! 167: long bs_bufsize; /* Saved b_bufsize. */ ! 168: void *bs_saveaddr; /* Saved b_addr. */ ! 169: int bs_nchildren; /* Number of associated buffers. */ ! 170: struct buf **bs_children; /* List of associated buffers. */ ! 171: }; ! 172: ! 173: /* ! 174: * Zero out the buffer's data area. ! 175: */ ! 176: #define clrbuf(bp) { \ ! 177: bzero((bp)->b_data, (u_int)(bp)->b_bcount); \ ! 178: (bp)->b_resid = 0; \ ! 179: } ! 180: ! 181: /* Flags to low-level allocation routines. */ ! 182: #define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ ! 183: #define B_SYNC 0x02 /* Do all allocations synchronously. */ ! 184: ! 185: #ifdef KERNEL ! 186: extern int nbuf; /* The number of buffer headers */ ! 187: extern struct buf *buf; /* The buffer headers. */ ! 188: extern char *buffers; /* The buffer contents. */ ! 189: extern int bufpages; /* Number of memory pages in the buffer pool. */ ! 190: extern struct buf *swbuf; /* Swap I/O buffer headers. */ ! 191: extern int nswbuf; /* Number of swap I/O buffer headers. */ ! 192: extern struct buf bswlist; /* Head of swap I/O buffer headers free list. */ ! 193: extern struct buf *bclnlist;/* Head of cleaned page list. */ ! 194: ! 195: __BEGIN_DECLS ! 196: int allocbuf __P((struct buf *, int)); ! 197: void bawrite __P((struct buf *)); ! 198: void bdwrite __P((struct buf *)); ! 199: void biodone __P((struct buf *)); ! 200: int biowait __P((struct buf *)); ! 201: int bread __P((struct vnode *, daddr_t, int, ! 202: struct ucred *, struct buf **)); ! 203: int breada __P((struct vnode *, daddr_t, int, daddr_t, int, ! 204: struct ucred *, struct buf **)); ! 205: int breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int, ! 206: struct ucred *, struct buf **)); ! 207: void brelse __P((struct buf *)); ! 208: void bremfree __P((struct buf *)); ! 209: void bufinit __P((void)); ! 210: int bwrite __P((struct buf *)); ! 211: void cluster_callback __P((struct buf *)); ! 212: int cluster_read __P((struct vnode *, u_quad_t, daddr_t, long, ! 213: struct ucred *, struct buf **, long, int, long, int *)); ! 214: int advisory_read __P((struct vnode *, u_quad_t, daddr_t, long, ! 215: long, long, long)); ! 216: int cluster_write __P((struct buf *, u_quad_t, long)); ! 217: struct buf *getblk __P((struct vnode *, daddr_t, int, int, int)); ! 218: struct buf *geteblk __P((int)); ! 219: struct buf *getnewbuf __P((int slpflag, int slptimeo)); ! 220: struct buf *incore __P((struct vnode *, daddr_t)); ! 221: u_int minphys __P((struct buf *bp)); ! 222: int physio __P((void (*)(struct buf *), struct buf *, dev_t, int , u_int (*)(struct buf *), struct uio *, int )); ! 223: __END_DECLS ! 224: #endif ! 225: #endif /* !_SYS_BUF_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.