From 4b7bfcf8a0fd53137f8b4320166bb47decf31d66 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Thu, 28 Oct 2021 13:25:26 -0400 Subject: [PATCH] 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 Reviewed-by: Ryan Moeller Signed-off-by: Mark Johnston Closes #12704 --- module/os/freebsd/zfs/zfs_vnops_os.c | 7 ++++--- 1 file 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 2c225c453e..0a3c12219c 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);