home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / sys / buf.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  10.8 KB  |  261 lines

  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  proc *b_proc;        /* Associated proc; NULL if kernel. */
  82.     volatile long    b_flags;    /* B_* flags. */
  83.     int    b_error;        /* Errno value. */
  84.     long    b_bufsize;        /* Allocated buffer size. */
  85.     long    b_bcount;        /* Valid bytes in buffer. */
  86.     long    b_resid;        /* Remaining I/O. */
  87.     dev_t    b_dev;            /* Device associated with buffer. */
  88.     struct {
  89.         caddr_t    b_addr;        /* Memory, superblocks, indirect etc.*/
  90.     } b_un;
  91.     void    *b_saveaddr;        /* Original b_addr for physio. */
  92.     daddr_t    b_lblkno;        /* Logical block number. */
  93.     daddr_t    b_blkno;        /* Underlying physical block number. */
  94.                     /* Function to call upon completion. */
  95.     void    (*b_iodone) __P((struct buf *));
  96.     struct    vnode *b_vp;        /* Device vnode. */
  97.     int    b_dirtyoff;        /* Offset in buffer of dirty region. */
  98.     int    b_dirtyend;        /* Offset of end of dirty region. */
  99.     int    b_validoff;        /* Offset in buffer of valid region. */
  100.     int    b_validend;        /* Offset of end of valid region. */
  101.     struct    ucred *b_rcred;        /* Read credentials reference. */
  102.     struct    ucred *b_wcred;        /* Write credentials reference. */
  103.     int    b_timestamp;        /* timestamp for queuing operation */
  104.     long    b_vectorcount;    /* number of vectors in b_vectorlist */
  105.     void    *b_vectorlist;    /* vector list for I/O */
  106.     void    *b_pagelist;    /* to save pagelist info */
  107.     long    b_vects[2];        /* vectorlist when b_vectorcount is 1 */
  108.     long    b_whichq;        /* the free list the buffer belongs to */
  109.     TAILQ_ENTRY(buf)    b_act;    /* Device driver queue when active */
  110.     void    *b_drvdata;        /* Device driver private use */
  111. };
  112.  
  113. /*
  114.  * For portability with historic industry practice, the cylinder number has
  115.  * to be maintained in the `b_resid' field.
  116.  */
  117. #define    b_cylinder b_resid        /* Cylinder number for disksort(). */
  118.  
  119. /* Device driver compatibility definitions. */
  120. #define    b_active b_bcount        /* Driver queue head: drive active. */
  121. #define    b_data     b_un.b_addr        /* b_un.b_addr is not changeable. */
  122. #define    b_errcnt b_resid        /* Retry count while I/O in progress. */
  123. #define    iodone     biodone        /* Old name for biodone. */
  124. #define    iowait     biowait        /* Old name for biowait. */
  125.  
  126. /* cluster_io definitions for use with io bufs */
  127. #define b_uploffset  b_bufsize
  128. #define b_trans_head b_freelist.tqe_prev
  129. #define b_trans_next b_freelist.tqe_next
  130. #define b_real_bp    b_saveaddr
  131.  
  132. /*
  133.  * These flags are kept in b_flags.
  134.  */
  135. #define    B_AGE        0x00000001    /* Move to age queue when I/O done. */
  136. #define    B_NEEDCOMMIT    0x00000002    /* Append-write in progress. */
  137. #define    B_ASYNC        0x00000004    /* Start I/O, do not wait. */
  138. #define    B_BAD        0x00000008    /* Bad block revectoring in progress. */
  139. #define    B_BUSY        0x00000010    /* I/O in progress. */
  140. #define    B_CACHE        0x00000020    /* Bread found us in the cache. */
  141. #define    B_CALL        0x00000040    /* Call b_iodone from biodone. */
  142. #define    B_DELWRI    0x00000080    /* Delay I/O until buffer reused. */
  143. #define    B_DIRTY        0x00000100    /* Dirty page to be pushed out async. */
  144. #define    B_DONE        0x00000200    /* I/O completed. */
  145. #define    B_EINTR        0x00000400    /* I/O was interrupted */
  146. #define    B_ERROR        0x00000800    /* I/O error occurred. */
  147. #define    B_WASDIRTY    0x00001000    /* page was found dirty in the VM cache */
  148. #define    B_INVAL        0x00002000    /* Does not contain valid info. */
  149. #define    B_LOCKED    0x00004000    /* Locked in core (not reusable). */
  150. #define    B_NOCACHE    0x00008000    /* Do not cache block after use. */
  151. #define    B_PAGEOUT    0x00010000    /* Page out indicator... */
  152. #define    B_PGIN        0x00020000    /* Pagein op, so swap() can count it. */
  153. #define    B_PHYS        0x00040000    /* I/O to user memory. */
  154. #define    B_RAW        0x00080000    /* Set by physio for raw transfers. */
  155. #define    B_READ        0x00100000    /* Read buffer. */
  156. #define    B_TAPE        0x00200000    /* Magnetic tape I/O. */
  157. #define    B_PAGELIST    0x00400000    /* Buffer describes pagelist I/O. */
  158. #define    B_WANTED    0x00800000    /* Process wants this buffer. */
  159. #define    B_WRITE        0x00000000    /* Write buffer (pseudo flag). */
  160. #define    B_WRITEINPROG    0x01000000    /* Write in progress. */
  161. #define    B_UNUSED0    0x02000000    /* Unused bit */
  162. #define    B_UNUSED1    0x04000000    /* Unused bit */
  163. #define B_NEED_IODONE   0x08000000
  164.                                 /* need to do a biodone on the */
  165.                                 /* real_bp associated with a cluster_io */
  166. #define B_COMMIT_UPL    0x10000000
  167.                                 /* commit pages in upl when */
  168.                                 /* I/O completes/fails */
  169. #define    B_ZALLOC    0x20000000    /* b_data is zalloc()ed */
  170. #define    B_META        0x40000000    /* buffer contains meta-data. */
  171. #define    B_VECTORLIST    0x80000000    /* Used by device drivers. */
  172.  
  173.  
  174. /*
  175.  * Zero out the buffer's data area.
  176.  */
  177. #define    clrbuf(bp) {                            \
  178.     bzero((bp)->b_data, (u_int)(bp)->b_bcount);            \
  179.     (bp)->b_resid = 0;                        \
  180. }
  181.  
  182. /* Flags to low-level allocation routines. */
  183. #define B_CLRBUF    0x01    /* Request allocated buffer be cleared. */
  184. #define B_SYNC        0x02    /* Do all allocations synchronously. */
  185. #define B_NOBUFF    0x04    /* Do not allocate struct buf */
  186.  
  187. /* Flags for operation type in getblk() */
  188. #define    BLK_READ    0x01    /* buffer for read */
  189. #define    BLK_WRITE    0x02    /* buffer for write */
  190. #define    BLK_PAGEIN    0x04    /* buffer for pagein */
  191. #define    BLK_PAGEOUT    0x08    /* buffer for pageout */
  192. #define    BLK_META    0x10    /* buffer for metadata */
  193. #define    BLK_CLREAD    0x20    /* buffer for cluster read */
  194. #define    BLK_CLWRITE    0x40    /* buffer for cluster write */
  195.  
  196. #ifdef KERNEL
  197. extern int nbuf;            /* The number of buffer headers */
  198. extern struct buf *buf;        /* The buffer headers. */
  199.  
  200. /* Macros to clear/set/test flags. */
  201. #define    SET(t, f)    (t) |= (f)
  202. #define    CLR(t, f)    (t) &= ~(f)
  203. #define    ISSET(t, f)    ((t) & (f))
  204.  
  205. /*
  206.  * Definitions for the buffer free lists.
  207.  */
  208. #define    BQUEUES        5        /* number of free buffer queues */
  209.  
  210. #define    BQ_LOCKED    0        /* super-blocks &c */
  211. #define    BQ_LRU        1        /* lru, useful buffers */
  212. #define    BQ_AGE        2        /* rubbish */
  213. #define    BQ_EMPTY    3        /* buffer headers with no memory */
  214. #define BQ_META        4        /* buffer containing metadata */
  215.  
  216. __BEGIN_DECLS
  217. int    allocbuf __P((struct buf *, int));
  218. void    bawrite __P((struct buf *));
  219. void    bdwrite __P((struct buf *));
  220. void    biodone __P((struct buf *));
  221. int    biowait __P((struct buf *));
  222. int    bread __P((struct vnode *, daddr_t, int,
  223.         struct ucred *, struct buf **));
  224. int    meta_bread __P((struct vnode *, daddr_t, int,
  225.         struct ucred *, struct buf **));
  226. int    breada __P((struct vnode *, daddr_t, int, daddr_t, int,
  227.         struct ucred *, struct buf **));
  228. int    breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int,
  229.         struct ucred *, struct buf **));
  230. void    brelse __P((struct buf *));
  231. void    bremfree __P((struct buf *));
  232. void    bufinit __P((void));
  233. int    bwrite __P((struct buf *));
  234. struct buf *getblk __P((struct vnode *, daddr_t, int, int, int, int));
  235. struct buf *geteblk __P((int));
  236. struct buf *incore __P((struct vnode *, daddr_t));
  237. u_int    minphys __P((struct buf *bp));
  238. int physio __P((void (*)(struct buf *), struct buf *, dev_t, int ,  u_int (*)(struct buf *), struct uio *, int ));
  239. int count_busy_buffers __P((void));
  240. struct buf *alloc_io_buf __P((struct vnode *, int));
  241. void free_io_buf __P((struct buf *));
  242. __END_DECLS
  243.  
  244. /*
  245.  *    Stats on usefulness of the buffer cache
  246.  */
  247. struct bufstats {
  248.     long    bufs_incore;        /* found incore */
  249.     long    bufs_busyincore;    /* found incore. was busy */
  250.     long    bufs_vmhits;        /* not incore. found in VM */
  251.     long    bufs_miss;            /* not incore. not in VM */
  252.     long    bufs_sleeps;        /* buffer starvation */
  253.     long    bufs_eblk;            /* Calls to geteblk */
  254.     long    bufs_iobufmax;        /* Max. number of IO buffers used */
  255.     long    bufs_iobufinuse;    /* number of IO buffers in use */
  256.     long    bufs_iobufsleeps;    /* IO buffer starvation */
  257. };
  258.  
  259. #endif /* KERNEL */
  260. #endif /* !_SYS_BUF_H_ */
  261.