Author: kib
Date: Mon May  2 13:13:32 2016
New Revision: 298921
URL: https://svnweb.freebsd.org/changeset/base/298921

Log:
  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 <w...@cicgroup.ru>
  NetBSD PR:    48958 (http://gnats.netbsd.org/48958)
  MFC after:    2 weeks
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/kern/vfs_subr.c

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c    Mon May  2 05:46:47 2016        (r298920)
+++ head/sys/kern/vfs_subr.c    Mon May  2 13:13:32 2016        (r298921)
@@ -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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to