VOP_FSYNC - flush file system buffers for a file
Its arguments are:
The argument Fa waitfor is either MNT_WAIT or MNT_NOWAIT and specifies whether or not the function should wait for the writes to finish before returning.
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);
}
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |