diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2019-11-20 12:07:54 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2019-11-20 12:07:54 +0000 |
commit | d957f3a4f005883d13cdec75fe415fc21ba26e7a (patch) | |
tree | c9d2a2dbc4081125f7320ab0b55d4d0749e04f74 | |
parent | 4de1818baf096bb28d83e4ad37372e5cbaa5093f (diff) | |
download | src-d957f3a4f005883d13cdec75fe415fc21ba26e7a.tar.gz src-d957f3a4f005883d13cdec75fe415fc21ba26e7a.zip |
vfs: perform a more racy check in vfs_notify_upper
Locking mp does not buy anything interms of correctness and only contributes to
contention.
Notes
Notes:
svn path=/head/; revision=354892
-rw-r--r-- | sys/kern/vfs_subr.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 5568888ec2f2..521cca27ccf8 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -3526,11 +3526,9 @@ vfs_notify_upper(struct vnode *vp, int event) mp = vp->v_mount; if (mp == NULL) return; - - MNT_ILOCK(mp); if (TAILQ_EMPTY(&mp->mnt_uppers)) - goto unlock; - MNT_IUNLOCK(mp); + return; + mmp = malloc(sizeof(struct mount), M_TEMP, M_WAITOK | M_ZERO); mmp->mnt_op = &vgonel_vfsops; mmp->mnt_kern_flag |= MNTK_MARKER; @@ -3564,7 +3562,6 @@ vfs_notify_upper(struct vnode *vp, int event) mp->mnt_kern_flag &= ~MNTK_VGONE_WAITER; wakeup(&mp->mnt_uppers); } -unlock: MNT_IUNLOCK(mp); } |