Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
VOP_FSYNC(9)		 BSD 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, 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 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 er-
     ror 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 man page was written by Doug Rabson.

BSD				 July 24, 1996				   BSD

NAME | SYNOPSIS | DESCRIPTION | LOCKS | RETURN VALUES | PSEUDOCODE | ERRORS | SEE ALSO | AUTHORS

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=VOP_FSYNC&sektion=9&manpath=FreeBSD+5.3-RELEASE+and+Ports>

home | help