aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2026-03-05 02:57:34 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-03-05 23:46:53 +0000
commited87040311b88e2c95a791aa049f2c37c857f048 (patch)
treefaa0694280951df833ace437a7c677409d107546
parent347cec10e25eacb2906a0a8105eff036850db766 (diff)
zfs rename: properly cleanup on errors occuring before zfs_do_rename()
Reported and tested by: arrowd Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55539
-rw-r--r--sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
index 05ac77741d4f..31654ec82392 100644
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -5527,15 +5527,24 @@ zfs_freebsd_rename(struct vop_rename_args *ap)
}
#endif
- if (error == 0)
+ if (error == 0) {
error = zfs_do_rename(fdvp, &fvp, ap->a_fcnp, tdvp, &tvp,
ap->a_tcnp, ap->a_fcnp->cn_cred);
-
- vrele(fdvp);
- vrele(fvp);
- vrele(tdvp);
- if (tvp != NULL)
- vrele(tvp);
+ vrele(fdvp);
+ vrele(fvp);
+ vrele(tdvp);
+ if (tvp != NULL)
+ vrele(tvp);
+ } else {
+ if (tdvp == tvp)
+ vrele(tdvp);
+ else
+ vput(tdvp);
+ if (tvp != NULL)
+ vput(tvp);
+ vrele(fdvp);
+ vrele(fvp);
+ }
return (error);
}