summaryrefslogtreecommitdiffstats
path: root/sys/gnu/ext2fs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2002-09-25 02:34:56 +0000
committerjeff <jeff@FreeBSD.org>2002-09-25 02:34:56 +0000
commit906daccf7224474d155117b8c9b209624ea6ec01 (patch)
treed6e06f11cbe3b76a4f2dcec91b3d5527d5601240 /sys/gnu/ext2fs
parentd168f755f99bb0772204d5a6106672c073805d5d (diff)
downloadFreeBSD-src-906daccf7224474d155117b8c9b209624ea6ec01.zip
FreeBSD-src-906daccf7224474d155117b8c9b209624ea6ec01.tar.gz
- Lock access to the buf lists.
- Use vrefcnt() where appropriate.
Diffstat (limited to 'sys/gnu/ext2fs')
-rw-r--r--sys/gnu/ext2fs/ext2_inode.c6
-rw-r--r--sys/gnu/ext2fs/ext2_vfsops.c4
-rw-r--r--sys/gnu/ext2fs/ext2_vnops.c23
3 files changed, 19 insertions, 14 deletions
diff --git a/sys/gnu/ext2fs/ext2_inode.c b/sys/gnu/ext2fs/ext2_inode.c
index d5e6ada..a96dc67 100644
--- a/sys/gnu/ext2fs/ext2_inode.c
+++ b/sys/gnu/ext2fs/ext2_inode.c
@@ -331,9 +331,11 @@ done:
for (i = 0; i < NDADDR; i++)
if (newblks[i] != oip->i_db[i])
panic("itrunc2");
+ VI_LOCK(ovp);
if (length == 0 && (!TAILQ_EMPTY(&ovp->v_dirtyblkhd) ||
!TAILQ_EMPTY(&ovp->v_cleanblkhd)))
panic("itrunc3");
+ VI_UNLOCK(ovp);
#endif /* DIAGNOSTIC */
/*
* Put back the real size.
@@ -475,7 +477,7 @@ ext2_inactive(ap)
int mode, error = 0;
ext2_discard_prealloc(ip);
- if (prtactive && vp->v_usecount != 0)
+ if (prtactive && vrefcnt(vp) != 0)
vprint("ext2_inactive: pushing active", vp);
/*
@@ -525,7 +527,7 @@ ext2_reclaim(ap)
struct inode *ip;
struct vnode *vp = ap->a_vp;
- if (prtactive && vp->v_usecount != 0)
+ if (prtactive && vrefcnt(vp) != 0)
vprint("ufs_reclaim: pushing active", vp);
ip = VTOI(vp);
if (ip->i_flag & IN_LAZYMOD) {
diff --git a/sys/gnu/ext2fs/ext2_vfsops.c b/sys/gnu/ext2fs/ext2_vfsops.c
index 788e2a7..cb358c0 100644
--- a/sys/gnu/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/ext2fs/ext2_vfsops.c
@@ -909,13 +909,13 @@ loop:
goto loop;
nvp = TAILQ_NEXT(vp, v_nmntvnodes);
mtx_unlock(&mntvnode_mtx);
- mtx_lock(&vp->v_interlock);
+ VI_LOCK(vp);
ip = VTOI(vp);
if (vp->v_type == VNON ||
((ip->i_flag &
(IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) == 0 &&
(TAILQ_EMPTY(&vp->v_dirtyblkhd) || waitfor == MNT_LAZY))) {
- mtx_unlock(&vp->v_interlock);
+ VI_UNLOCK(vp);
mtx_lock(&mntvnode_mtx);
continue;
}
diff --git a/sys/gnu/ext2fs/ext2_vnops.c b/sys/gnu/ext2fs/ext2_vnops.c
index c1fba78..32b7dca 100644
--- a/sys/gnu/ext2fs/ext2_vnops.c
+++ b/sys/gnu/ext2fs/ext2_vnops.c
@@ -342,12 +342,12 @@ ext2_close(ap)
struct vnode *vp = ap->a_vp;
struct mount *mp;
- mtx_lock(&vp->v_interlock);
+ VI_LOCK(vp);
if (vp->v_usecount > 1) {
ext2_itimes(vp);
- mtx_unlock(&vp->v_interlock);
+ VI_UNLOCK(vp);
} else {
- mtx_unlock(&vp->v_interlock);
+ VI_UNLOCK(vp);
/*
* If we are closing the last reference to an unlinked
* file, then it will be freed by the inactive routine.
@@ -698,11 +698,15 @@ ext2_fsync(ap)
ext2_discard_prealloc(VTOI(vp));
loop:
+ VI_LOCK(vp);
s = splbio();
for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) {
nbp = TAILQ_NEXT(bp, b_vnbufs);
- if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT))
+ VI_UNLOCK(vp);
+ if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) {
+ VI_LOCK(vp);
continue;
+ }
if ((bp->b_flags & B_DELWRI) == 0)
panic("ext2_fsync: not dirty");
bremfree(bp);
@@ -718,13 +722,11 @@ loop:
goto loop;
}
if (ap->a_waitfor == MNT_WAIT) {
- VI_LOCK(vp);
while (vp->v_numoutput) {
vp->v_iflag |= VI_BWAIT;
msleep(&vp->v_numoutput, VI_MTX(vp),
PRIBIO + 1, "e2fsyn", 0);
}
- VI_UNLOCK(vp);
#if DIAGNOSTIC
if (!TAILQ_EMPTY(&vp->v_dirtyblkhd)) {
vprint("ext2_fsync: dirty", vp);
@@ -732,6 +734,7 @@ loop:
}
#endif
}
+ VI_UNLOCK(vp);
splx(s);
return (ext2_update(ap->a_vp, ap->a_waitfor == MNT_WAIT));
}
@@ -1628,10 +1631,10 @@ ext2spec_close(ap)
{
struct vnode *vp = ap->a_vp;
- mtx_lock(&vp->v_interlock);
+ VI_LOCK(vp);
if (vp->v_usecount > 1)
ext2_itimes(vp);
- mtx_unlock(&vp->v_interlock);
+ VI_UNLOCK(vp);
return (VOCALL(spec_vnodeop_p, VOFFSET(vop_close), ap));
}
@@ -1702,10 +1705,10 @@ ext2fifo_close(ap)
{
struct vnode *vp = ap->a_vp;
- mtx_lock(&vp->v_interlock);
+ VI_LOCK(vp);
if (vp->v_usecount > 1)
ext2_itimes(vp);
- mtx_unlock(&vp->v_interlock);
+ VI_UNLOCK(vp);
return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_close), ap));
}
OpenPOWER on IntegriCloud