diff options
author | ssouhlal <ssouhlal@FreeBSD.org> | 2005-08-06 01:42:04 +0000 |
---|---|---|
committer | ssouhlal <ssouhlal@FreeBSD.org> | 2005-08-06 01:42:04 +0000 |
commit | 1f4d3e95efcd3e9a56a016f0c3586048991fce25 (patch) | |
tree | 2c62ba83632019391b20d5a85bd35d5065c6f434 | |
parent | 4ad4f0f86c9f79eaa7ec18af7d7cfb9fc6a74501 (diff) | |
download | FreeBSD-src-1f4d3e95efcd3e9a56a016f0c3586048991fce25.zip FreeBSD-src-1f4d3e95efcd3e9a56a016f0c3586048991fce25.tar.gz |
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
-rw-r--r-- | sys/kern/vfs_subr.c | 2 | ||||
-rw-r--r-- | sys/sys/mount.h | 6 | ||||
-rw-r--r-- | sys/sys/vnode.h | 1 |
3 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index fd2dd20..af6cbb0 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -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); diff --git a/sys/sys/mount.h b/sys/sys/mount.h index c70347c..6cc8909 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -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) diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index f27be24..98b2348 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -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 |