| BUFFERCACHE(9) | Kernel Developer's Manual | BUFFERCACHE(9) |
buffercache,
bread, breadn,
bwrite, bawrite,
bdwrite, getblk,
geteblk, incore,
allocbuf, brelse —
buffer cache interfaces
#include
<sys/buf.h>
int
bread(struct
vnode *vp, daddr_t
blkno, int size,
int flags,
buf_t **bpp);
int
breadn(struct
vnode *vp, daddr_t
blkno, int size,
daddr_t rablks[],
int rasizes[],
int nrablks,
int flags,
buf_t **bpp);
int
bwrite(buf_t
*bp);
void
bawrite(buf_t
*bp);
void
bdwrite(buf_t
*bp);
buf_t *
getblk(struct
vnode *vp, daddr_t
blkno, int size,
int slpflag,
int slptimeo);
buf_t *
geteblk(int
size);
buf_t *
incore(struct
vnode *vp, daddr_t
blkno);
void
allocbuf(buf_t
*bp, int size,
int preserve);
void
brelse(buf_t
*bp, int set);
The buffercache interface is used by each
filesystems to improve I/O performance using in-core caches of filesystem
blocks.
The kernel memory used to cache a block is called a buffer and described by a buf structure. In addition to describing a cached block, a buf structure is also used to describe an I/O request as a part of the disk driver interface.
bread(vp,
blkno, size,
flags, bpp)VOP_STRATEGY()
routine for the vp vnode. For device special files,
blkno is in units of
DEV_BSIZE and both blkno and
size must be multiples of the underlying device's
block size. For other files, blkno is in units
chosen by the file system containing vp.
If the buffer is not found (i.e. the block is not
cached in memory),
bread()
allocates a buffer with enough pages for size and
reads the specified disk block into it.
The buffer returned by
bread()
is marked as busy. (The B_BUSY flag is set.)
After manipulation of the buffer returned from
bread(), the caller should unbusy it so that
another thread can get it. If the buffer contents are modified and
should be written back to disk, it should be unbusied using one of
variants of
bwrite().
Otherwise, it should be unbusied using
brelse().
breadn(vp,
blkno, size,
rablks, rasizes,
nrablks, flags,
bpp)bread(). In addition,
breadn() will start read-ahead of blocks specified
by rablks, rasizes,
nrablks.bwrite(bp)VOP_STRATEGY(). Then, unless the
B_ASYNC flag is set in bp,
bwrite() waits for the I/O to complete.bawrite(bp)B_ASYNC flag
in bp and simply call
VOP_BWRITE(),
which results in bwrite() for most
filesystems.bdwrite(bp)bawrite(),
bdwrite() won't start any I/O. It only marks the
buffer as dirty (BO_DELWRI) and unbusy it.getblk(vp,
blkno, size,
slpflag, slptimeo)If
getblk()
needs to sleep, slpflag and
slptimeo are used as arguments for
cv_timedwait().
geteblk(size)incore(vp,
blkno)incore() doesn't busy the buffer unlike
getblk().allocbuf(bp,
size, preserve)brelse(bp,
set)The buffer cache subsystem is implemented within the file sys/kern/vfs_bio.c.
intro(9), bufferio(9), Xr vnode 9
Maurice J. Bach, The Design of the UNIX Operating System, Prentice Hall, 1986.
Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, and John S. Quarterman, The Design and Implementation of the 4.4BSD Operating System, Addison Wesley, 1996.
| April 11, 2017 | NetBSD 11.0 |