diff options
| author | Jeff Roberson <jeff@FreeBSD.org> | 2002-08-04 10:29:36 +0000 |
|---|---|---|
| committer | Jeff Roberson <jeff@FreeBSD.org> | 2002-08-04 10:29:36 +0000 |
| commit | e6e370a7fe930e04cec38bcc2e06be127ed7ee02 (patch) | |
| tree | e889f56910bf98cbee3be239655a9e4bbb928b2e /sys/ufs | |
| parent | f75bb0aa25847511ed461bccb4d3fc247ab6b1d5 (diff) | |
Notes
Diffstat (limited to 'sys/ufs')
| -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 | ||||
| -rw-r--r-- | sys/ufs/ufs/ufs_extattr.c | 6 | ||||
| -rw-r--r-- | sys/ufs/ufs/ufs_quota.c | 6 | ||||
| -rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 5 |
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 */ |
