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