- 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:
parent
fe68abe291
commit
9cbe5da9d5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=143504
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user