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

FreeBSD Manual Pages

  
 
  

home | help
VOP_FSYNC(9)	       FreeBSD Kernel Developer's Manual	  VOP_FSYNC(9)

NAME
     VOP_FSYNC -- flush	filesystem buffers for a file

SYNOPSIS
     #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.

FreeBSD	11.1			 July 24, 1996			  FreeBSD 11.1

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+2.2.1-RELEASE>

home | help