Module Name:    src
Committed By:   thorpej
Date:           Wed Oct 20 13:29:06 UTC 2021

Modified Files:
        src/sys/miscfs/genfs: genfs_rename.c

Log Message:
Don't use genfs_rename_knote() in the "rename foo over hard-link to itself"
case, which simply results in removing the "from" name; there are assertions
in genfs_rename_knote() that are too strong for that case.

PR kern/56460


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/miscfs/genfs/genfs_rename.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/miscfs/genfs/genfs_rename.c
diff -u src/sys/miscfs/genfs/genfs_rename.c:1.6 src/sys/miscfs/genfs/genfs_rename.c:1.7
--- src/sys/miscfs/genfs/genfs_rename.c:1.6	Wed Oct 20 03:08:18 2021
+++ src/sys/miscfs/genfs/genfs_rename.c	Wed Oct 20 13:29:06 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_rename.c,v 1.6 2021/10/20 03:08:18 thorpej Exp $	*/
+/*	$NetBSD: genfs_rename.c,v 1.7 2021/10/20 13:29:06 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_rename.c,v 1.6 2021/10/20 03:08:18 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_rename.c,v 1.7 2021/10/20 13:29:06 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/kauth.h>
@@ -312,10 +312,14 @@ genfs_sane_rename(const struct genfs_ren
 			fcnp->cn_namelen) == 0))
 			/* Renaming an entry over itself does nothing.  */
 			error = 0;
-		else
+		else {
 			/* XXX Can't use VOP_REMOVE because of locking.  */
 			error = genfs_rename_remove(ops, mp, cred,
 			    fdvp, fcnp, fde, fvp, &tvp_new_nlink);
+			VN_KNOTE(fdvp, NOTE_WRITE);
+			VN_KNOTE(fvp,
+			    tvp_new_nlink == 0 ? NOTE_DELETE : NOTE_LINK);
+		}
 		goto out;
 	}
 	KASSERT(fvp != tvp);
@@ -370,10 +374,9 @@ genfs_sane_rename(const struct genfs_ren
 		goto out;
 
 	/* Success!  */
+	genfs_rename_knote(fdvp, fvp, tdvp, tvp, tvp_new_nlink);
 
-out:	if (error == 0) {
-		genfs_rename_knote(fdvp, fvp, tdvp, tvp, tvp_new_nlink);
-	}
+out:
 	genfs_rename_exit(ops, mp, fdvp, fvp, tdvp, tvp);
 	return error;
 }

Reply via email to