diff options
author | jeff <jeff@FreeBSD.org> | 2003-02-09 11:28:35 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2003-02-09 11:28:35 +0000 |
commit | 87e306ad712d6a7daef1073b7fb94c0fa90908d2 (patch) | |
tree | 48d962faa6bfdae347b467d003b11e355ce17172 /sys/fs/msdosfs | |
parent | 75e9ed76e4bbf5978303d4d7ee581c86bef55c50 (diff) | |
download | FreeBSD-src-87e306ad712d6a7daef1073b7fb94c0fa90908d2.zip FreeBSD-src-87e306ad712d6a7daef1073b7fb94c0fa90908d2.tar.gz |
- Cleanup unlocked accesses to buf flags by introducing a new b_vflag member
that is protected by the vnode lock.
- Move B_SCANNED into b_vflags and call it BV_SCANNED.
- Create a vop_stdfsync() modeled after spec's sync.
- Replace spec_fsync, msdos_fsync, and hpfs_fsync with the stdfsync and some
fs specific processing. This gives all of these filesystems proper
behavior wrt MNT_WAIT/NOWAIT and the use of the B_SCANNED flag.
- Annotate the locking in buf.h
Diffstat (limited to 'sys/fs/msdosfs')
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vnops.c | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index 0137920..d368775 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -806,45 +806,12 @@ msdosfs_fsync(ap) struct thread *a_td; } */ *ap; { - struct vnode *vp = ap->a_vp; - int s; - struct buf *bp, *nbp; - /* - * Flush all dirty buffers associated with a vnode. + * Flush our dirty buffers. */ -loop: - s = splbio(); - VI_LOCK(vp); - for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { - nbp = TAILQ_NEXT(bp, b_vnbufs); - VI_UNLOCK(vp); - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { - VI_LOCK(vp); - continue; - } - if ((bp->b_flags & B_DELWRI) == 0) - panic("msdosfs_fsync: not dirty"); - bremfree(bp); - splx(s); - /* XXX Could do bawrite */ - (void) bwrite(bp); - goto loop; - } - while (vp->v_numoutput) { - vp->v_iflag |= VI_BWAIT; - (void) msleep((caddr_t)&vp->v_numoutput, VI_MTX(vp), - PRIBIO + 1, "msdosfsn", 0); - } -#ifdef DIAGNOSTIC - if (!TAILQ_EMPTY(&vp->v_dirtyblkhd)) { - vprint("msdosfs_fsync: dirty", vp); - goto loop; - } -#endif - VI_UNLOCK(vp); - splx(s); - return (deupdat(VTODE(vp), ap->a_waitfor == MNT_WAIT)); + vop_stdfsync(ap); + + return (deupdat(VTODE(ap->a_vp), ap->a_waitfor == MNT_WAIT)); } static int |