svn commit: r211533 - in stable/7/sys:
cddl/contrib/opensolaris/uts/common/fs/zfs fs/cd9660 fs/udf
kern sys ufs/ffs
John Baldwin
jhb at FreeBSD.org
Fri Aug 20 20:58:58 UTC 2010
Author: jhb
Date: Fri Aug 20 20:58:57 2010
New Revision: 211533
URL: http://svn.freebsd.org/changeset/base/211533
Log:
Revert 210173 as it did not properly fix the bug. It assumed that the
VI_LOCK() for a given vnode was used as the internal interlock for that
vnode's v_lock lockmgr lock. This is not the case. Instead, add dedicated
routines to toggle the LK_NOSHARE and LK_CANRECURSE flags. These routines
lock the lockmgr lock's internal interlock to synchronize the updates to
the flags member with other threads attempting to acquire the lock. The
VN_LOCK_A*() macros now invoke these routines, and the softupdates code
uses these routines to temporarly enable recursion on buffer locks.
Reviewed by: kib
Modified:
stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
stable/7/sys/fs/cd9660/cd9660_vfsops.c
stable/7/sys/fs/udf/udf_vfsops.c
stable/7/sys/kern/kern_lock.c
stable/7/sys/sys/lockmgr.h
stable/7/sys/sys/vnode.h
stable/7/sys/ufs/ffs/ffs_softdep.c
stable/7/sys/ufs/ffs/ffs_vfsops.c
Modified: stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -618,11 +618,8 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu
vp->v_op = &zfs_fifoops;
break;
}
- if (vp->v_type != VFIFO) {
- VI_LOCK(vp);
+ if (vp->v_type != VFIFO)
VN_LOCK_ASHARE(vp);
- VI_UNLOCK(vp);
- }
mutex_enter(&zfsvfs->z_znodes_lock);
list_insert_tail(&zfsvfs->z_all_znodes, zp);
Modified: stable/7/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- stable/7/sys/fs/cd9660/cd9660_vfsops.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/fs/cd9660/cd9660_vfsops.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -821,9 +821,7 @@ cd9660_vget_internal(mp, ino, flags, vpp
vp->v_op = &cd9660_fifoops;
break;
default:
- VI_LOCK(vp);
VN_LOCK_ASHARE(vp);
- VI_UNLOCK(vp);
break;
}
Modified: stable/7/sys/fs/udf/udf_vfsops.c
==============================================================================
--- stable/7/sys/fs/udf/udf_vfsops.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/fs/udf/udf_vfsops.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -709,11 +709,8 @@ udf_vget(struct mount *mp, ino_t ino, in
break;
}
- if (vp->v_type != VFIFO) {
- VI_LOCK(vp);
+ if (vp->v_type != VFIFO)
VN_LOCK_ASHARE(vp);
- VI_UNLOCK(vp);
- }
if (ino == udf_getid(&udfmp->root_icb))
vp->v_vflag |= VV_ROOT;
Modified: stable/7/sys/kern/kern_lock.c
==============================================================================
--- stable/7/sys/kern/kern_lock.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/kern/kern_lock.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -555,6 +555,40 @@ lockinit(lkp, prio, wmesg, timo, flags)
}
/*
+ * XXX: Gross hacks to manipulate external lock flags after
+ * initialization. Used for certain vnode and buf locks.
+ */
+void
+lockallowshare(lkp)
+ struct lock *lkp;
+{
+
+ mtx_lock(lkp->lk_interlock);
+ lkp->lk_flags &= ~LK_NOSHARE;
+ mtx_unlock(lkp->lk_interlock);
+}
+
+void
+lockallowrecurse(lkp)
+ struct lock *lkp;
+{
+
+ mtx_lock(lkp->lk_interlock);
+ lkp->lk_flags |= LK_CANRECURSE;
+ mtx_unlock(lkp->lk_interlock);
+}
+
+void
+lockdisablerecurse(lkp)
+ struct lock *lkp;
+{
+
+ mtx_lock(lkp->lk_interlock);
+ lkp->lk_flags &= ~LK_CANRECURSE;
+ mtx_unlock(lkp->lk_interlock);
+}
+
+/*
* Destroy a lock.
*/
void
Modified: stable/7/sys/sys/lockmgr.h
==============================================================================
--- stable/7/sys/sys/lockmgr.h Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/sys/lockmgr.h Fri Aug 20 20:58:57 2010 (r211533)
@@ -214,6 +214,9 @@ void lockmgr_printinfo(struct lock *);
int lockstatus(struct lock *, struct thread *);
int lockcount(struct lock *);
int lockwaiters(struct lock *);
+void lockallowshare(struct lock *);
+void lockallowrecurse(struct lock *);
+void lockdisablerecurse(struct lock *);
#define lockmgr(lock, flags, mtx, td) \
_lockmgr((lock), (flags), (mtx), (td), LOCK_FILE, LOCK_LINE)
Modified: stable/7/sys/sys/vnode.h
==============================================================================
--- stable/7/sys/sys/vnode.h Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/sys/vnode.h Fri Aug 20 20:58:57 2010 (r211533)
@@ -398,8 +398,8 @@ extern void (*lease_updatetime)(int delt
#define VI_UNLOCK(vp) mtx_unlock(&(vp)->v_interlock)
#define VI_MTX(vp) (&(vp)->v_interlock)
-#define VN_LOCK_AREC(vp) ((vp)->v_vnlock->lk_flags |= LK_CANRECURSE)
-#define VN_LOCK_ASHARE(vp) ((vp)->v_vnlock->lk_flags &= ~LK_NOSHARE)
+#define VN_LOCK_AREC(vp) lockallowrecurse((vp)->v_vnlock)
+#define VN_LOCK_ASHARE(vp) lockallowshare((vp)->v_vnlock)
#endif /* _KERNEL */
Modified: stable/7/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- stable/7/sys/ufs/ffs/ffs_softdep.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/ufs/ffs/ffs_softdep.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -5291,9 +5291,7 @@ top:
return (0);
loop:
/* While syncing snapshots, we must allow recursive lookups */
- mtx_lock(bp->b_lock.lk_interlock);
- bp->b_lock.lk_flags |= LK_CANRECURSE;
- mtx_unlock(bp->b_lock.lk_interlock);
+ lockallowrecurse(&bp->b_lock);
ACQUIRE_LOCK(&lk);
/*
* As we hold the buffer locked, none of its dependencies
@@ -5435,9 +5433,7 @@ loop:
/* We reach here only in error and unlocked */
if (error == 0)
panic("softdep_sync_metadata: zero error");
- mtx_lock(bp->b_lock.lk_interlock);
- bp->b_lock.lk_flags &= ~LK_CANRECURSE;
- mtx_unlock(bp->b_lock.lk_interlock);
+ lockdisablerecurse(&bp->b_lock);
bawrite(bp);
return (error);
}
@@ -5449,9 +5445,7 @@ loop:
break;
}
VI_UNLOCK(vp);
- mtx_lock(bp->b_lock.lk_interlock);
- bp->b_lock.lk_flags &= ~LK_CANRECURSE;
- mtx_unlock(bp->b_lock.lk_interlock);
+ lockdisablerecurse(&bp->b_lock);
bawrite(bp);
if (nbp != NULL) {
bp = nbp;
Modified: stable/7/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- stable/7/sys/ufs/ffs/ffs_vfsops.c Fri Aug 20 20:33:13 2010 (r211532)
+++ stable/7/sys/ufs/ffs/ffs_vfsops.c Fri Aug 20 20:58:57 2010 (r211533)
@@ -1519,9 +1519,7 @@ ffs_vgetf(mp, ino, flags, vpp, ffs_flags
*/
if (vp->v_type != VFIFO) {
/* FFS supports shared locking for all files except fifos. */
- VI_LOCK(vp);
VN_LOCK_ASHARE(vp);
- VI_UNLOCK(vp);
}
/*
More information about the svn-src-stable-7
mailing list