summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_alloc.c6
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c18
-rw-r--r--sys/ufs/ffs/ffs_softdep.c33
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c3
-rw-r--r--sys/ufs/ffs/ffs_vnops.c8
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
OpenPOWER on IntegriCloud