aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs
diff options
context:
space:
mode:
authorJeff Roberson <jeff@FreeBSD.org>2002-08-04 10:29:36 +0000
committerJeff Roberson <jeff@FreeBSD.org>2002-08-04 10:29:36 +0000
commite6e370a7fe930e04cec38bcc2e06be127ed7ee02 (patch)
treee889f56910bf98cbee3be239655a9e4bbb928b2e /sys/ufs
parentf75bb0aa25847511ed461bccb4d3fc247ab6b1d5 (diff)
Notes
Diffstat (limited to 'sys/ufs')
-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
-rw-r--r--sys/ufs/ufs/ufs_extattr.c6
-rw-r--r--sys/ufs/ufs/ufs_quota.c6
-rw-r--r--sys/ufs/ufs/ufs_vnops.c5
8 files changed, 55 insertions, 30 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 7888d8c334731..28b09ccf3469d 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 1c660314b8257..e5c825de362ec 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 4f73368e688dd..1f99ccc240408 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 fa0bffa8f4a28..e5c62b07d11b6 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 0c5e8c4402c9a..9356ff9320ed3 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
diff --git a/sys/ufs/ufs/ufs_extattr.c b/sys/ufs/ufs/ufs_extattr.c
index 486263a18e1c2..49ab022331fb4 100644
--- a/sys/ufs/ufs/ufs_extattr.c
+++ b/sys/ufs/ufs/ufs_extattr.c
@@ -659,7 +659,8 @@ ufs_extattr_enable(struct ufsmount *ump, int attrnamespace,
goto free_exit;
}
- backing_vnode->v_flag |= VSYSTEM;
+ ASSERT_VOP_LOCKED(backing_vnode, "ufs_extattr_enable");
+ backing_vnode->v_vflag |= VV_SYSTEM;
LIST_INSERT_HEAD(&ump->um_extattr.uepm_list, attribute,
uele_entries);
@@ -689,7 +690,8 @@ ufs_extattr_disable(struct ufsmount *ump, int attrnamespace,
LIST_REMOVE(uele, uele_entries);
- uele->uele_backing_vnode->v_flag &= ~VSYSTEM;
+ ASSERT_VOP_LOCKED(uele->uele_backing_vnode, "ufs_extattr_disable");
+ uele->uele_backing_vnode->v_vflag &= ~VV_SYSTEM;
error = vn_close(uele->uele_backing_vnode, FREAD|FWRITE,
td->td_ucred, td);
diff --git a/sys/ufs/ufs/ufs_quota.c b/sys/ufs/ufs/ufs_quota.c
index dcbe6f798ea70..57319f054b96f 100644
--- a/sys/ufs/ufs/ufs_quota.c
+++ b/sys/ufs/ufs/ufs_quota.c
@@ -417,7 +417,8 @@ quotaon(td, mp, type, fname)
quotaoff(td, mp, type);
ump->um_qflags[type] |= QTF_OPENING;
mp->mnt_flag |= MNT_QUOTA;
- vp->v_flag |= VSYSTEM;
+ ASSERT_VOP_LOCKED(vp, "quotaon");
+ vp->v_vflag |= VV_SYSTEM;
*vpp = vp;
/*
* Save the credential of the process that turned on quotas.
@@ -523,7 +524,8 @@ again:
}
mtx_unlock(&mntvnode_mtx);
dqflush(qvp);
- qvp->v_flag &= ~VSYSTEM;
+ ASSERT_VOP_LOCKED(qvp, "quotaoff");
+ qvp->v_vflag &= ~VV_SYSTEM;
error = vn_close(qvp, FREAD|FWRITE, td->td_ucred, td);
ump->um_quotas[type] = NULLVP;
crfree(ump->um_cred[type]);
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 087cca76bb0ac..1f56ee6910e4f 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -793,7 +793,7 @@ ufs_remove(ap)
}
error = ufs_dirremove(dvp, ip, ap->a_cnp->cn_flags, 0);
if (ip->i_nlink <= 0)
- vp->v_flag |= VNOSYNC;
+ vp->v_vflag |= VV_NOSYNC;
VN_KNOTE(vp, NOTE_DELETE);
VN_KNOTE(dvp, NOTE_WRITE);
out:
@@ -2289,8 +2289,9 @@ ufs_vinit(mntp, specops, fifoops, vpp)
break;
}
+ ASSERT_VOP_LOCKED(vp, "ufs_vinit");
if (ip->i_number == ROOTINO)
- vp->v_flag |= VROOT;
+ vp->v_vflag |= VV_ROOT;
/*
* Initialize modrev times
*/