From 9cbe5da9d536a29f6f9605fe8a87ffa680dc2406 Mon Sep 17 00:00:00 2001 From: Jeff Roberson Date: Sun, 13 Mar 2005 12:04:12 +0000 Subject: [PATCH] - It is not legal to access v_data without the vnode lock or interlock held. Grab the vnode interlock if LK_INTERLOCK has not been passed in so that we can inspect v_data in ffs_lock(). Sponsored by: Isilon Systems, Inc. --- sys/ufs/ffs/ffs_vnops.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 9b3a440133c..03628767843 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -343,7 +343,17 @@ ffs_lock(ap) { struct vnode *vp = ap->a_vp; - if ((VTOI(vp)->i_flags & SF_SNAPSHOT) && + /* + * v_data could be NULL if a thread attempts to lock a + * vnode that is being recycled. Just hit the normal + * vnode lock in this case. Grab the interlock so we may + * safely inspect the vnode. + */ + if ((ap->a_flags & LK_INTERLOCK) == 0) { + VI_LOCK(vp); + ap->a_flags |= LK_INTERLOCK; + } + if (vp->v_data && (VTOI(vp)->i_flags & SF_SNAPSHOT) && ((ap->a_flags & LK_TYPE_MASK) == LK_SHARED)) { ap->a_flags &= ~LK_TYPE_MASK; ap->a_flags |= LK_EXCLUSIVE;