|
|
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.