summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-10-28 13:25:26 -0400
committerTony Hutter <hutter2@llnl.gov>2021-12-13 13:22:41 -0800
commit4b7bfcf8a0fd53137f8b4320166bb47decf31d66 (patch)
tree12ebc2b4f3c5b25ddbb8de99db032c60dd57f46e
parent07165ce540323bc80b7e25372ca60ac21a16b7f1 (diff)
Exit the teardown section later in rename on FreeBSD
We have to hold the teardown lock while dereferencing zfsvfs->z_os and, I believe, when committing to the ZIL. Note that jumping to the "out" label, "error" is always non-zero. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Signed-off-by: Mark Johnston <markj@FreeBSD.org> Closes #12704
-rw-r--r--module/os/freebsd/zfs/zfs_vnops_os.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/module/os/freebsd/zfs/zfs_vnops_os.c b/module/os/freebsd/zfs/zfs_vnops_os.c
index 2c225c453..0a3c12219 100644
--- a/module/os/freebsd/zfs/zfs_vnops_os.c
+++ b/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -3445,7 +3445,6 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
dmu_tx_commit(tx);
unlockout: /* all 4 vnodes are locked, ZFS_ENTER called */
- ZFS_EXIT(zfsvfs);
if (want_seqc_end) {
vn_seqc_write_end(*svpp);
vn_seqc_write_end(sdvp);
@@ -3458,10 +3457,12 @@ unlockout: /* all 4 vnodes are locked, ZFS_ENTER called */
VOP_UNLOCK1(*svpp);
VOP_UNLOCK1(sdvp);
-out: /* original two vnodes are locked */
- MPASS(!want_seqc_end);
if (error == 0 && zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
zil_commit(zilog, 0);
+ ZFS_EXIT(zfsvfs);
+
+out: /* original two vnodes are locked */
+ MPASS(!want_seqc_end);
if (*tvpp != NULL)
VOP_UNLOCK1(*tvpp);