diff options
author | jeff <jeff@FreeBSD.org> | 2002-09-25 02:34:56 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2002-09-25 02:34:56 +0000 |
commit | 906daccf7224474d155117b8c9b209624ea6ec01 (patch) | |
tree | d6e06f11cbe3b76a4f2dcec91b3d5527d5601240 | |
parent | d168f755f99bb0772204d5a6106672c073805d5d (diff) | |
download | FreeBSD-src-906daccf7224474d155117b8c9b209624ea6ec01.zip FreeBSD-src-906daccf7224474d155117b8c9b209624ea6ec01.tar.gz |
- Lock access to the buf lists.
- Use vrefcnt() where appropriate.
-rw-r--r-- | sys/gnu/ext2fs/ext2_inode.c | 6 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ext2_vfsops.c | 4 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ext2_vnops.c | 23 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_inode.c | 6 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_vfsops.c | 4 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_vnops.c | 23 |
6 files changed, 38 insertions, 28 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)); } diff --git a/sys/gnu/fs/ext2fs/ext2_inode.c b/sys/gnu/fs/ext2fs/ext2_inode.c index d5e6ada..a96dc67 100644 --- a/sys/gnu/fs/ext2fs/ext2_inode.c +++ b/sys/gnu/fs/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/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c index 788e2a7..cb358c0 100644 --- a/sys/gnu/fs/ext2fs/ext2_vfsops.c +++ b/sys/gnu/fs/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/fs/ext2fs/ext2_vnops.c b/sys/gnu/fs/ext2fs/ext2_vnops.c index c1fba78..32b7dca 100644 --- a/sys/gnu/fs/ext2fs/ext2_vnops.c +++ b/sys/gnu/fs/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)); } |