VOP_FSYNC(9)

NAME
VOP_FSYNC - flush filesystem 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 proc *p);

DESCRIPTION
This call flushes any dirty filesystem 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

p   the calling process

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 appropriate error code is returned.

PSEUDOCODE

    int
    vop_fsync(struct vnode *vp, struct ucred *cred, int waitfor, struct proc *p)
    {
        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 filesystem is full.

[EDQUOT]
    Quota exceeded.

SEE ALSO
vnode(9)

AUTHORS
This man page was written by Doug Rabson.