VOP_FSYNC -- flush file system buffers for a file
#include <sys/param.h>
#include <sys/vnode.h>
int
VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor,
struct thread *td);
This call flushes any dirty file system buffers for the file. It is used
to implement the sync(2) and fsync(2) system calls.
Its arguments are:
vp the vnode of the file
cred the caller's credentials
waitfor whether the function should wait for I/O to complete. Possible
values are:
MNT_WAIT synchronously wait for I/O to complete
MNT_NOWAIT start all I/O, but do not wait for it
MNT_LAZY push data not written by file system syncer
td the calling thread
The argument waitfor is either MNT_WAIT or MNT_NOWAIT and specifies
whether or not the function should wait for the writes to finish before
returning.
The file should be locked on entry.
Zero is returned if the call is successful, otherwise an appropriate
error code is returned.
int
vop_fsync(struct vnode *vp, struct ucred *cred, int waitfor, struct thread *td)
{
struct buf *bp;
struct buf *nbp;
struct timeval tv;
int s;
loop:
s = splbio();
for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
nbp = bp->b_vnbufs.le_next;
/*
* Ignore buffers which are already being written.
*/
if (bp->b_flags & B_BUSY)
continue;
/*
* Make sure the buffer is dirty.
*/
if ((bp->b_flags & B_DELWRI) == 0)
panic("vop_fsync: not dirty");
vfs_bio_awrite(bp);
splx(s);
goto loop;
}
splx(s);
if (waitfor == MNT_WAIT) {
s = splbio();
while (vp->v_numoutput) {
vp->v_flag |= VBWAIT;
tsleep((caddr_t)&vp->v_numoutput, PRIBIO + 1, "vopfsn");
}
splx(s);
#ifdef DIAGNOSTIC
if (vp->v_dirtyblkhd.lh_first) {
vprint("vop_fsync: dirty", vp);
goto loop;
}
#endif
}
/*
* Write out the on-disc version of the vnode.
*/
tv = time;
return VOP_UPDATE(vp, &tv, &tv, waitfor == MNT_WAIT);
}
[ENOSPC] The file system is full.
[EDQUOT] Quota exceeded.
vnode(9)
This man page was written by Doug Rabson.
FreeBSD 5.2.1 July 24, 1996 FreeBSD 5.2.1 [ Back ] |