Holding a vnode doesn't prevent v_mount from disappearing (when the
vnode is inactivated), possibly leading to a NULL dereference when checking if the mount wants knotes to be activated in the VOP hooks. So, we add a new vnode flag VV_NOKNOTE that is only set in getnewvnode(), if necessary, and check it when activating knotes. Since the flags are not erased when a vnode is being held, we can safely read them. Reviewed by: kris@ MFC after: 3 days
This commit is contained in:
parent
4ad4f0f86c
commit
1f4d3e95ef
@ -896,6 +896,8 @@ getnewvnode(tag, mp, vops, vpp)
|
||||
if (mp != NULL) {
|
||||
insmntque(vp, mp);
|
||||
bo->bo_bsize = mp->mnt_stat.f_iosize;
|
||||
if ((mp->mnt_kern_flag & MNTK_NOKNOTE) != 0)
|
||||
vp->v_vflag |= VV_NOKNOTE;
|
||||
}
|
||||
|
||||
CTR2(KTR_VFS, "getnewvnode: mp %p vp %p", mp, vp);
|
||||
|
@ -552,15 +552,13 @@ extern int mpsafe_vfs;
|
||||
|
||||
#define VFS_KNOTE_LOCKED(vp, hint) do \
|
||||
{ \
|
||||
if ((vp)->v_mount && \
|
||||
((vp)->v_mount->mnt_kern_flag & MNTK_NOKNOTE) == 0) \
|
||||
if (((vp)->v_vflag & VV_NOKNOTE) == 0) \
|
||||
VN_KNOTE((vp), (hint), 1); \
|
||||
} while (0)
|
||||
|
||||
#define VFS_KNOTE_UNLOCKED(vp, hint) do \
|
||||
{ \
|
||||
if ((vp)->v_mount && \
|
||||
((vp)->v_mount->mnt_kern_flag & MNTK_NOKNOTE) == 0) \
|
||||
if (((vp)->v_vflag & VV_NOKNOTE) == 0) \
|
||||
VN_KNOTE((vp), (hint), 0); \
|
||||
} while (0)
|
||||
|
||||
|
@ -251,6 +251,7 @@ struct xvnode {
|
||||
#define VV_COPYONWRITE 0x0040 /* vnode is doing copy-on-write */
|
||||
#define VV_SYSTEM 0x0080 /* vnode being used by kernel */
|
||||
#define VV_PROCDEP 0x0100 /* vnode is process dependent */
|
||||
#define VV_NOKNOTE 0x0200 /* don't activate knotes on this vnode */
|
||||
|
||||
/*
|
||||
* Vnode attributes. A field value of VNOVAL represents a field whose value
|
||||
|
Loading…
Reference in New Issue
Block a user