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-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |