diff options
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r-- | sys/ufs/ffs/ffs_alloc.c | 6 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_snapshot.c | 18 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 33 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 3 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 8 |
5 files changed, 44 insertions, 24 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 7888d8c..28b09cc 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -928,7 +928,8 @@ ffs_dirpref(pip) /* * Force allocation in another cg if creating a first level dir. */ - if (ITOV(pip)->v_flag & VROOT) { + ASSERT_VOP_LOCKED(ITOV(pip), "ffs_dirpref"); + if (ITOV(pip)->v_vflag & VV_ROOT) { prefcg = arc4random() % fs->fs_ncg; mincg = prefcg; minndir = fs->fs_ipg; @@ -1697,7 +1698,8 @@ ffs_blkfree(fs, devvp, bno, size, inum) /* devvp is a normal disk device */ dev = devvp->v_rdev; cgblkno = fsbtodb(fs, cgtod(fs, cg)); - if ((devvp->v_flag & VCOPYONWRITE) && + ASSERT_VOP_LOCKED(devvp, "ffs_blkfree"); + if ((devvp->v_vflag & VV_COPYONWRITE) && ffs_snapblkfree(fs, devvp, bno, size, inum)) return; VOP_FREEBLKS(devvp, fsbtodb(fs, bno), size); diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index 1c66031..e5c825d 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -456,9 +456,12 @@ loop: panic("ffs_snapshot: %d already on list", ip->i_number); snaphead = &ip->i_devvp->v_rdev->si_snapshots; TAILQ_INSERT_TAIL(snaphead, ip, i_nextsnap); + + ASSERT_VOP_LOCKED(ip->i_devvp, "ffs_snapshot devvp"); ip->i_devvp->v_rdev->si_copyonwrite = ffs_copyonwrite; - ip->i_devvp->v_flag |= VCOPYONWRITE; - vp->v_flag |= VSYSTEM; + ip->i_devvp->v_vflag |= VV_COPYONWRITE; + ASSERT_VOP_LOCKED(vp, "ffs_snapshot vp"); + vp->v_vflag |= VV_SYSTEM; out1: /* * Resume operation on filesystem. @@ -1225,9 +1228,10 @@ ffs_snapremove(vp) devvp = ip->i_devvp; TAILQ_REMOVE(&devvp->v_rdev->si_snapshots, ip, i_nextsnap); ip->i_nextsnap.tqe_prev = 0; + ASSERT_VOP_LOCKED(devvp, "ffs_snapremove devvp"); if (TAILQ_FIRST(&devvp->v_rdev->si_snapshots) == 0) { devvp->v_rdev->si_copyonwrite = 0; - devvp->v_flag &= ~VCOPYONWRITE; + devvp->v_vflag &= ~VV_COPYONWRITE; } } /* @@ -1537,9 +1541,10 @@ ffs_snapshot_mount(mp) ip->i_number); else TAILQ_INSERT_TAIL(snaphead, ip, i_nextsnap); - vp->v_flag |= VSYSTEM; + vp->v_vflag |= VV_SYSTEM; ump->um_devvp->v_rdev->si_copyonwrite = ffs_copyonwrite; - ump->um_devvp->v_flag |= VCOPYONWRITE; + ASSERT_VOP_LOCKED(ump->um_devvp, "ffs_snapshot_mount"); + ump->um_devvp->v_vflag |= VV_COPYONWRITE; VOP_UNLOCK(vp, 0, td); } } @@ -1561,8 +1566,9 @@ ffs_snapshot_unmount(mp) if (xp->i_effnlink > 0) vrele(ITOV(xp)); } + ASSERT_VOP_LOCKED(ump->um_devvp, "ffs_snapshot_unmount"); ump->um_devvp->v_rdev->si_copyonwrite = 0; - ump->um_devvp->v_flag &= ~VCOPYONWRITE; + ump->um_devvp->v_vflag &= ~VV_COPYONWRITE; } /* diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 4f73368..1f99ccc 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -291,7 +291,7 @@ softdep_panic(msg) } #endif /* DEBUG */ -static int interlocked_sleep(struct lockit *, int, void *, int, +static int interlocked_sleep(struct lockit *, int, void *, struct mtx *, int, const char *, int); /* @@ -306,10 +306,11 @@ static int interlocked_sleep(struct lockit *, int, void *, int, #define LOCKBUF 2 static int -interlocked_sleep(lk, op, ident, flags, wmesg, timo) +interlocked_sleep(lk, op, ident, mtx, flags, wmesg, timo) struct lockit *lk; int op; void *ident; + struct mtx *mtx; int flags; const char *wmesg; int timo; @@ -325,7 +326,7 @@ interlocked_sleep(lk, op, ident, flags, wmesg, timo) # endif /* DEBUG */ switch (op) { case SLEEP: - retval = tsleep(ident, flags, wmesg, timo); + retval = msleep(ident, mtx, flags, wmesg, timo); break; case LOCKBUF: retval = BUF_LOCK((struct buf *)ident, flags); @@ -386,7 +387,8 @@ sema_get(semap, interlock) if (semap->value++ > 0) { if (interlock != NULL) { interlocked_sleep(interlock, SLEEP, (caddr_t)semap, - semap->prio, semap->name, semap->timo); + NULL, semap->prio, semap->name, + semap->timo); FREE_LOCK(interlock); } else { tsleep((caddr_t)semap, semap->prio, semap->name, @@ -4778,8 +4780,13 @@ softdep_fsync(vp) * not now, but then the user was not asking to have it * written, so we are not breaking any promises. */ - if (vp->v_flag & VXLOCK) + mp_fixme("This operation is not atomic wrt the rest of the code"); + VI_LOCK(vp); + if (vp->v_iflag & VI_XLOCK) { + VI_UNLOCK(vp); break; + } else + VI_UNLOCK(vp); /* * We prevent deadlock by always fetching inodes from the * root, moving down the directory tree. Thus, when fetching @@ -5502,7 +5509,7 @@ request_cleanup(resource, islocked) proc_waiting += 1; if (handle.callout == NULL) handle = timeout(pause_timer, 0, tickdelay > 2 ? tickdelay : 2); - interlocked_sleep(&lk, SLEEP, (caddr_t)&proc_waiting, PPAUSE, + interlocked_sleep(&lk, SLEEP, (caddr_t)&proc_waiting, NULL, PPAUSE, "softupdate", 0); proc_waiting -= 1; if (islocked == 0) @@ -5760,13 +5767,13 @@ getdirtybuf(bpp, waitfor) if (waitfor != MNT_WAIT) return (0); bp->b_xflags |= BX_BKGRDWAIT; - interlocked_sleep(&lk, SLEEP, &bp->b_xflags, PRIBIO, - "getbuf", 0); + interlocked_sleep(&lk, SLEEP, &bp->b_xflags, NULL, + PRIBIO, "getbuf", 0); continue; } if (waitfor != MNT_WAIT) return (0); - error = interlocked_sleep(&lk, LOCKBUF, bp, + error = interlocked_sleep(&lk, LOCKBUF, bp, NULL, LK_EXCLUSIVE | LK_SLEEPFAIL, 0, 0); if (error != ENOLCK) { FREE_LOCK(&lk); @@ -5793,11 +5800,13 @@ drain_output(vp, islocked) if (!islocked) ACQUIRE_LOCK(&lk); + VI_LOCK(vp); while (vp->v_numoutput) { - vp->v_flag |= VBWAIT; - interlocked_sleep(&lk, SLEEP, (caddr_t)&vp->v_numoutput, - PRIBIO + 1, "drainvp", 0); + vp->v_iflag |= VI_BWAIT; + interlocked_sleep(&lk, SLEEP, (caddr_t)&vp->v_numoutput, + VI_MTX(vp), PRIBIO + 1, "drainvp", 0); } + VI_UNLOCK(vp); if (!islocked) FREE_LOCK(&lk); } diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index fa0bffa..e5c62b0 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1001,7 +1001,8 @@ ffs_flushfiles(mp, flags, td) */ } #endif - if (ump->um_devvp->v_flag & VCOPYONWRITE) { + ASSERT_VOP_LOCKED(ump->um_devvp, "ffs_flushfiles"); + if (ump->um_devvp->v_vflag & VV_COPYONWRITE) { if ((error = vflush(mp, 0, SKIPSYSTEM | flags)) != 0) return (error); ffs_snapshot_unmount(mp); diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 0c5e8c4..9356ff9 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -234,11 +234,13 @@ loop: } if (wait) { + VI_LOCK(vp); while (vp->v_numoutput) { - vp->v_flag |= VBWAIT; - (void) tsleep((caddr_t)&vp->v_numoutput, - PRIBIO + 4, "ffsfsn", 0); + vp->v_iflag |= VI_BWAIT; + msleep((caddr_t)&vp->v_numoutput, VI_MTX(vp), + PRIBIO + 4, "ffsfsn", 0); } + VI_UNLOCK(vp); /* * Ensure that any filesystem metatdata associated |