Manpage of 'VOP_FSYNC' on UHLU - BSD System Documentation,
Programming Reference, Manual Pages and Source Code
All manual pages         All RFC pages
Common page
for VOP_FSYNC
Other pages
for VOP_FSYNC
More pages
containing VOP_FSYNC

Section 9 manual page or howto for 'VOP_FSYNC'  

VOP_FSYNC(9)	       FreeBSD Kernel Developer's Manual	  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, 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.

     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.

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, 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.

FreeBSD 7.2			 July 24, 1996			   FreeBSD 7.2

NAME - SYNOPSIS - DESCRIPTION - LOCKS - RETURN VALUES - PSEUDOCODE - 
ERRORS - SEE ALSO - AUTHORS -  
All manual pages         All RFC pages
Common page
for VOP_FSYNC
Other pages
for VOP_FSYNC
More pages
containing VOP_FSYNC
A random manual page         All manual pages        All RFC pages