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;
}