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:
Suleiman Souhlal 2005-08-06 01:42:04 +00:00
parent 1446d11a9b
commit 34cc826ae8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=148768
3 changed files with 5 additions and 4 deletions

View File

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

View File

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

View File

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