vop_fsync(9)

NAME

VOP_FSYNC - flush file system buffers for a file

SYNOPSIS

#include <sys/param.h>
#include <sys/vnode.h>
int
VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor,
        struct thread *td);

DESCRIPTION

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 com
plete. 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.

LOCKS

The file should be locked on entry.

RETURN VALUES

Zero is returned if the call is successful, otherwise an ap
propriate
error code is returned.

PSEUDOCODE

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);
}

ERRORS

[ENOSPC] The file system is full.

[EDQUOT] Quota exceeded.

SEE ALSO

vnode(9)

AUTHORS

This manual page was written by Doug Rabson.
BSD July 24, 1996
Copyright © 2010-2024 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout