int
bread(
struct vnode *vp
, daddr_t blkno
, int size
, struct kauth_cred *cred
, int flags
, struct buf **bpp
)
int
breadn(
struct vnode *vp
, daddr_t blkno
, int size
, daddr_t rablks[]
, int rasizes[]
, int nrablks
, struct kauth_cred *cred
, int flags
, struct buf **bpp
)
int
breada(
struct vnode *vp
, daddr_t blkno
, int size
, daddr_t rablkno
, int rabsize
, struct kauth_cred *cred
, int flags
, struct buf **bpp
)
int
bwrite(
struct buf *bp
)
void
bawrite(
struct buf *bp
)
void
bdwrite(
struct buf *bp
)
struct
buf
*
getblk(
struct vnode *vp
, daddr_t blkno
, int size
, int slpflag
, int slptimeo
)
struct
buf
*
geteblk(
int size
)
struct
buf
*
incore(
struct vnode *vp
, daddr_t blkno
)
void
allocbuf(
struct buf *bp
, int size
, int preserve
)
void
brelse(
struct buf *bp
)
void
biodone(
struct buf *bp
)
int
biowait(
struct buf *bp
)
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.
vp
, blkno
, size
, cred
, flags
, bpp
)
vp
and
blkno
.
The buffer is returned via
bpp
.
The units of
blkno
are specifically the units used by the
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 using
credential
cred
.
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(
).
vp
, blkno
, size
, rablks
, rasizes
, nrablks
, cred
, flags
, bpp
)
).
In addition,
breadn(
)
will start read-ahead of blocks specified by
rablks
,
rasizes
,
nrablks
.
vp
, blkno
, size
, rablkno
, rabsize
, cred
, flags
, bpp
)
)
with single block read-ahead.
This function is for compatibility with old filesystem code and
shouldn't be used by new ones.
bp
)
).
Then, unless the
B_ASYNC
flag is set in
bp
,
bwrite(
)
waits for the I/O to complete.
bp
)
B_ASYNC
flag in
bp
and simply call
VOP_BWRITE(
),
which results in
bwrite(
)
for most filesystems.
bp
)
),
bdwrite(
)
won't start any I/O.
It only marks the buffer as dirty
(
B_DELWRI
)
and unbusy it.
vp
, blkno
, size
, slpflag
, slptimeo
)
size
that is associated with a given vnode and block
offset, specified by
vp
and
blkno
.
If it is found in the block cache, make it busy and return it.
Otherwise, return an empty block of the correct size.
It is up to the caller to ensure that the cached blocks
are of the correct size.
If
getblk()
needs to sleep,
slpflag
and
slptimeo
are used as arguments for
cv_timedwait().
size
)
size
.
vp
, blkno
)
)
doesn't busy the buffer unlike
getblk(
).
bp
, size
, preserve
)
preserve
is zero, the entire data in the buffer will be lost.
Otherwise, if the buffer shrinks, the truncated part of the data
is lost, so it is up to the caller to have written
it out
first
if needed; this routine will not start a write.
If the buffer grows, it is the callers responsibility to fill out
the buffer's additional contents.
bp
)
bp
)
B_CALL
,
do so.
Otherwise, wakeup waiters.
bp
)
/usr/src
.
The buffer cache subsystem is implemented within the file
sys/kern/vfs_bio.c
.
)
and its variants
don't use a specified credential.
Because
biodone()
and
biowait(
)
do not really belong to
,
they shouldn't be documented here.