aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2016-05-02 13:13:32 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2016-05-02 13:13:32 +0000
commitbd2ead6b2e7a73ee117a549704c9f0827f26eebb (patch)
tree77b99af90f8fbc7629d62d4ee5b4ca64ea7b8391 /sys/kern
parentb35978d0da3992f6878ea37e50b7126320ceea20 (diff)
downloadsrc-bd2ead6b2e7a73ee117a549704c9f0827f26eebb.tar.gz
src-bd2ead6b2e7a73ee117a549704c9f0827f26eebb.zip
Fix reporting of NOTE_LINK when directory link count changes due to
rename removing or adding subdirectory entry. Discussed with and tested by: Vladimir Kondratyev <wulf@cicgroup.ru> NetBSD PR: 48958 (http://gnats.netbsd.org/48958) MFC after: 2 weeks Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=298921
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_subr.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index a81fce3a4bc9..e1711eafd2ed 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -4650,10 +4650,26 @@ void
vop_rename_post(void *ap, int rc)
{
struct vop_rename_args *a = ap;
+ long hint;
if (!rc) {
- VFS_KNOTE_UNLOCKED(a->a_fdvp, NOTE_WRITE);
- VFS_KNOTE_UNLOCKED(a->a_tdvp, NOTE_WRITE);
+ hint = NOTE_WRITE;
+ if (a->a_fdvp == a->a_tdvp) {
+ if (a->a_tvp != NULL && a->a_tvp->v_type == VDIR)
+ hint |= NOTE_LINK;
+ VFS_KNOTE_UNLOCKED(a->a_fdvp, hint);
+ VFS_KNOTE_UNLOCKED(a->a_tdvp, hint);
+ } else {
+ if (a->a_fvp->v_type == VDIR)
+ hint |= NOTE_LINK;
+ VFS_KNOTE_UNLOCKED(a->a_fdvp, hint);
+
+ if (a->a_fvp->v_type == VDIR && a->a_tvp != NULL &&
+ a->a_tvp->v_type == VDIR)
+ hint &= ~NOTE_LINK;
+ VFS_KNOTE_UNLOCKED(a->a_tdvp, hint);
+ }
+
VFS_KNOTE_UNLOCKED(a->a_fvp, NOTE_RENAME);
if (a->a_tvp)
VFS_KNOTE_UNLOCKED(a->a_tvp, NOTE_DELETE);