Fix several bugs in the FreeBSD rename VOP implementation
commitded851b2e09b86553152bddd1d00d0ff75a8caeb
authorMark Johnston <markjdb@gmail.com>
Fri, 19 Nov 2021 22:26:39 +0000 (19 17:26 -0500)
committerGitHub <noreply@github.com>
Fri, 19 Nov 2021 22:26:39 +0000 (19 15:26 -0700)
tree81a7f75dbb6735145aa14bb7750b09345306faba
parentf9e39f98a0f649c90b47dc547ed65072daec79f6
Fix several bugs in the FreeBSD rename VOP implementation

- To avoid a use-after-free, zfsvfs->z_log needs to be loaded after the
  teardown lock is acquired with ZFS_ENTER().
- Avoid leaking vnode locks in zfs_rename_relock() and zfs_rename_()
  when the ZFS_ENTER() macros forces an early return.

Refactor the rename implementation so that ZFS_ENTER() can be used
safely.  As a bonus, this lets us use the ZFS_VERIFY_ZP() macro instead
of open-coding its implementation.

Reported-by: Peter Holm <pho@FreeBSD.org>
Tested-by: Peter Holm <pho@FreeBSD.org>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com>
Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Sponsored-by: The FreeBSD Foundation
Closes #12717
module/os/freebsd/zfs/zfs_vnops_os.c