source: rtems/c/src/lib/libnetworking/sys/buf.h @ 39e6e65a

4.104.114.84.95
Last change on this file since 39e6e65a was 39e6e65a, checked in by Joel Sherrill <joel.sherrill@…>, on 08/19/98 at 21:32:28

Base files

  • Property mode set to 100644
File size: 9.9 KB
Line 
1/*
2 * Copyright (c) 1982, 1986, 1989, 1993
3 *      The Regents of the University of California.  All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *      This product includes software developed by the University of
21 *      California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 *      @(#)buf.h       8.9 (Berkeley) 3/30/95
39 * $Id$
40 */
41
42#ifndef _SYS_BUF_H_
43#define _SYS_BUF_H_
44
45#include <sys/queue.h>
46
47#define NOLIST ((struct buf *)0x87654321)
48
49struct buf;
50
51struct iodone_chain {
52        long    ic_prev_flags;
53        void    (*ic_prev_iodone) __P((struct buf *));
54        void    *ic_prev_iodone_chain;
55        struct {
56                long    ia_long;
57                void    *ia_ptr;
58        }       ic_args[5];
59};
60
61typedef TAILQ_HEAD(buf_queue_head, buf) buf_queue_head, *buf_queue_head_t;
62
63/*
64 * The buffer header describes an I/O operation in the kernel.
65 */
66struct buf {
67        LIST_ENTRY(buf) b_hash;         /* Hash chain. */
68        LIST_ENTRY(buf) b_vnbufs;       /* Buffer's associated vnode. */
69        TAILQ_ENTRY(buf) b_freelist;    /* Free list position if not active. */
70        TAILQ_ENTRY(buf) b_act;         /* Device driver queue when active. *new* */
71        struct  proc *b_proc;           /* Associated proc; NULL if kernel. */
72        long    b_flags;                /* B_* flags. */
73        unsigned short b_qindex;        /* buffer queue index */
74        unsigned char b_usecount;       /* buffer use count */
75        int     b_error;                /* Errno value. */
76        long    b_bufsize;              /* Allocated buffer size. */
77        long    b_bcount;               /* Valid bytes in buffer. */
78        long    b_resid;                /* Remaining I/O. */
79        dev_t   b_dev;                  /* Device associated with buffer. */
80        struct {
81                caddr_t b_addr;         /* Memory, superblocks, indirect etc. */
82        } b_un;
83        caddr_t b_kvabase;              /* base kva for buffer */
84        int     b_kvasize;              /* size of kva for buffer */
85        void    *b_saveaddr;            /* Original b_addr for physio. */
86        daddr_t b_lblkno;               /* Logical block number. */
87        daddr_t b_blkno;                /* Underlying physical block number. */
88                                        /* Function to call upon completion. */
89        void    (*b_iodone) __P((struct buf *));
90                                        /* For nested b_iodone's. */
91        struct  iodone_chain *b_iodone_chain;
92        struct  vnode *b_vp;            /* Device vnode. */
93        int     b_dirtyoff;             /* Offset in buffer of dirty region. */
94        int     b_dirtyend;             /* Offset of end of dirty region. */
95        struct  ucred *b_rcred;         /* Read credentials reference. */
96        struct  ucred *b_wcred;         /* Write credentials reference. */
97        int     b_validoff;             /* Offset in buffer of valid region. */
98        int     b_validend;             /* Offset of end of valid region. */
99        daddr_t b_pblkno;               /* physical block number */
100        caddr_t b_savekva;              /* saved kva for transfer while bouncing */
101        void    *b_driver1;             /* for private use by the driver */
102        void    *b_driver2;             /* for private use by the driver */
103        void    *b_spc;
104        union   cluster_info {
105                TAILQ_HEAD(cluster_list_head, buf) cluster_head;
106                TAILQ_ENTRY(buf) cluster_entry;
107        } b_cluster;
108        struct  vm_page *b_pages[btoc(MAXPHYS)];
109        int             b_npages;
110};
111
112/* Device driver compatibility definitions. */
113#define b_data   b_un.b_addr            /* b_un.b_addr is not changeable. */
114
115/*
116 * These flags are kept in b_flags.
117 */
118#define B_AGE           0x00000001      /* Move to age queue when I/O done. */
119#define B_NEEDCOMMIT    0x00000002      /* Append-write in progress. */
120#define B_ASYNC         0x00000004      /* Start I/O, do not wait. */
121#define B_BAD           0x00000008      /* Bad block revectoring in progress. */
122#define B_BUSY          0x00000010      /* I/O in progress. */
123#define B_CACHE         0x00000020      /* Bread found us in the cache. */
124#define B_CALL          0x00000040      /* Call b_iodone from biodone. */
125#define B_DELWRI        0x00000080      /* Delay I/O until buffer reused. */
126#define B_DIRTY         0x00000100      /* Dirty page to be pushed out async. */
127#define B_DONE          0x00000200      /* I/O completed. */
128#define B_EINTR         0x00000400      /* I/O was interrupted */
129#define B_ERROR         0x00000800      /* I/O error occurred. */
130#define B_GATHERED      0x00001000      /* LFS: already in a segment. */
131#define B_INVAL         0x00002000      /* Does not contain valid info. */
132#define B_LOCKED        0x00004000      /* Locked in core (not reusable). */
133#define B_NOCACHE       0x00008000      /* Do not cache block after use. */
134#define B_MALLOC        0x00010000      /* malloced b_data */
135#define B_CLUSTEROK     0x00020000      /* Pagein op, so swap() can count it. */
136#define B_PHYS          0x00040000      /* I/O to user memory. */
137#define B_RAW           0x00080000      /* Set by physio for raw transfers. */
138#define B_READ          0x00100000      /* Read buffer. */
139#define B_TAPE          0x00200000      /* Magnetic tape I/O. */
140#define B_RELBUF        0x00400000      /* Release VMIO buffer. */
141#define B_WANTED        0x00800000      /* Process wants this buffer. */
142#define B_WRITE         0x00000000      /* Write buffer (pseudo flag). */
143#define B_WRITEINPROG   0x01000000      /* Write in progress. */
144#define B_XXX           0x02000000      /* Debugging flag. */
145#define B_PAGING        0x04000000      /* volatile paging I/O -- bypass VMIO */
146#define B_ORDERED       0x08000000      /* Must guarantee I/O ordering */
147#define B_VMIO          0x20000000      /* VMIO flag */
148#define B_CLUSTER       0x40000000      /* pagein op, so swap() can count it */
149#define B_BOUNCE        0x80000000      /* bounce buffer flag */
150
151/*
152 * number of buffer hash entries
153 */
154#define BUFHSZ 512
155
156/*
157 * buffer hash table calculation, originally by David Greenman
158 */
159#define BUFHASH(vnp, bn)        \
160        (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ])
161
162/*
163 * Definitions for the buffer free lists.
164 */
165#define BUFFER_QUEUES   6       /* number of free buffer queues */
166
167extern LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash;
168extern TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES];
169
170#define QUEUE_NONE      0       /* on no queue */
171#define QUEUE_LOCKED    1       /* locked buffers */
172#define QUEUE_LRU       2       /* useful buffers */
173#define QUEUE_VMIO      3       /* VMIO buffers */
174#define QUEUE_AGE       4       /* not-useful buffers */
175#define QUEUE_EMPTY     5       /* empty buffer headers*/
176
177/*
178 * Zero out the buffer's data area.
179 */
180#define clrbuf(bp) {                                                    \
181        bzero((bp)->b_data, (u_int)(bp)->b_bcount);                     \
182        (bp)->b_resid = 0;                                              \
183}
184
185/* Flags to low-level allocation routines. */
186#define B_CLRBUF        0x01    /* Request allocated buffer be cleared. */
187#define B_SYNC          0x02    /* Do all allocations synchronously. */
188
189#ifdef KERNEL
190extern int      nbuf;                   /* The number of buffer headers */
191extern struct   buf *buf;               /* The buffer headers. */
192extern char     *buffers;               /* The buffer contents. */
193extern int      bufpages;               /* Number of memory pages in the buffer pool. */
194extern struct   buf *swbuf;             /* Swap I/O buffer headers. */
195extern int      nswbuf;                 /* Number of swap I/O buffer headers. */
196extern TAILQ_HEAD(swqueue, buf) bswlist;
197
198void    bufinit __P((void));
199void    bremfree __P((struct buf *));
200int     bread __P((struct vnode *, daddr_t, int,
201            struct ucred *, struct buf **));
202int     breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int,
203            struct ucred *, struct buf **));
204int     bwrite __P((struct buf *));
205void    bdwrite __P((struct buf *));
206void    bawrite __P((struct buf *));
207int     bowrite __P((struct buf *));
208void    brelse __P((struct buf *));
209void    bqrelse __P((struct buf *));
210int     vfs_bio_awrite __P((struct buf *));
211struct buf *     getpbuf __P((void));
212struct buf *incore __P((struct vnode *, daddr_t));
213struct buf *gbincore __P((struct vnode *, daddr_t));
214int     inmem __P((struct vnode *, daddr_t));
215struct buf *getblk __P((struct vnode *, daddr_t, int, int, int));
216struct buf *geteblk __P((int));
217int     allocbuf __P((struct buf *, int));
218int     biowait __P((struct buf *));
219void    biodone __P((struct buf *));
220
221void    cluster_callback __P((struct buf *));
222int     cluster_read __P((struct vnode *, u_quad_t, daddr_t, long,
223            struct ucred *, struct buf **));
224int     cluster_wbuild __P((struct vnode *, long, daddr_t, int));
225void    cluster_write __P((struct buf *, u_quad_t));
226int     physio __P((void (*)(struct buf *), struct buf *, dev_t,
227            int, u_int (*)(struct buf *), struct uio *));
228u_int   minphys __P((struct buf *));
229void    vfs_bio_clrbuf __P((struct buf *));
230void    vfs_busy_pages __P((struct buf *, int clear_modify));
231void    vfs_unbusy_pages(struct buf *);
232void    vwakeup __P((struct buf *));
233void    vmapbuf __P((struct buf *));
234void    vunmapbuf __P((struct buf *));
235void    relpbuf __P((struct buf *));
236void    brelvp __P((struct buf *));
237void    bgetvp __P((struct vnode *, struct buf *));
238void    pbgetvp __P((struct vnode *, struct buf *));
239void    pbrelvp __P((struct buf *));
240void    reassignbuf __P((struct buf *, struct vnode *));
241struct  buf *trypbuf __P((void));
242void    vm_bounce_alloc __P((struct buf *));
243void    vm_bounce_free __P((struct buf *));
244vm_offset_t     vm_bounce_kva_alloc __P((int));
245void    vm_bounce_kva_alloc_free __P((vm_offset_t, int));
246#endif /* KERNEL */
247
248#endif /* !_SYS_BUF_H_ */
Note: See TracBrowser for help on using the repository browser.