*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->FreeBSD man pages -> VOP_FSYNC (9)              
Title
Content
Arch
Section
 

VOP_FSYNC(9)

Contents


NAME    [Toc]    [Back]

     VOP_FSYNC -- flush file system buffers for a file

SYNOPSIS    [Toc]    [Back]

     #include <sys/param.h>
     #include <sys/vnode.h>

     int
     VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor,
	 struct thread *td);

DESCRIPTION    [Toc]    [Back]

     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    [Toc]    [Back]

     The file should be locked on entry.

RETURN VALUES    [Toc]    [Back]

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

PSEUDOCODE    [Toc]    [Back]

     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    [Toc]    [Back]

     [ENOSPC]		The file system is full.

     [EDQUOT]		Quota exceeded.

SEE ALSO    [Toc]    [Back]

      
      
     vnode(9)

AUTHORS    [Toc]    [Back]

     This man page was written by Doug Rabson.


FreeBSD 5.2.1			 July 24, 1996			 FreeBSD 5.2.1
[ Back ]
 Similar pages
Name OS Title
sync2 Tru64 Flush file system metadata and data from memory buffers to disk
sync Tru64 Flush file system metadata and data from memory buffers to disk.
sync Linux flush filesystem buffers
vinvalbuf OpenBSD flush and invalidate all buffers associated with a vnode
flush IRIX Flush buffered output for a file
flush IRIX Flush buffered output for a file
flush IRIX Flush buffered output for a file
TIFFFlush IRIX flush pending writes to an open TIFF file
fdetach Tru64 Detach a STREAMS-based file descriptor from a file in the file system name space
fattach Tru64 Attach a STREAMS-based file descriptor to a file in the file system name space
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service