svn commit: r298921 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Mon May 2 13:13:33 UTC 2016


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 <wulf at 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);


More information about the svn-src-head mailing list