diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2026-03-05 02:57:34 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2026-03-05 23:46:53 +0000 |
| commit | ed87040311b88e2c95a791aa049f2c37c857f048 (patch) | |
| tree | faa0694280951df833ace437a7c677409d107546 | |
| parent | 347cec10e25eacb2906a0a8105eff036850db766 (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.c | 23 |
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); } |
