- 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.
This commit is contained in:
Jeff Roberson 2005-03-13 12:04:12 +00:00
parent fe68abe291
commit 9cbe5da9d5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=143504

View File

@ -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;