summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-02-09 11:28:35 +0000
committerjeff <jeff@FreeBSD.org>2003-02-09 11:28:35 +0000
commit87e306ad712d6a7daef1073b7fb94c0fa90908d2 (patch)
tree48d962faa6bfdae347b467d003b11e355ce17172 /sys/fs/msdosfs
parent75e9ed76e4bbf5978303d4d7ee581c86bef55c50 (diff)
downloadFreeBSD-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.c41
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
OpenPOWER on IntegriCloud