:man| Alphabetical   Categories   About us 
 
VOP_FSYNC (9) | Kernel routines | Unix Manual Pages | :man

NAME

VOP_FSYNC - flush file system buffers for a file

CONTENTS

Synopsis
Description
Locks
Return Values
Pseudocode
Errors
See Also
Authors

SYNOPSIS


.In sys/param.h
.In 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 error 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

 
Created by Blin Media, 2008-2013