From aa7817c15162b23c214722f4ad0e9f0b2faff024 Mon Sep 17 00:00:00 2001 From: John Poduska Date: Thu, 17 Sep 2020 13:53:02 -0400 Subject: [PATCH] Need a long hold in zpl_mount_impl In zpl_mount_impl, there is: dmu_objset_hold ; returns with pool & ds held dsl_pool_rele sget dsl_dataset_rele As spelled out in the "DSL Pool Configuration Lock" in dsl_pool.c, this requires a long hold. Reviewed-by: Brian Behlendorf Reviewed-by: Paul Zuchowski Signed-off-by: John Poduska Closes #10936 --- module/os/linux/zfs/zpl_super.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/os/linux/zfs/zpl_super.c b/module/os/linux/zfs/zpl_super.c index 5aaf82793f..9db8bda4cc 100644 --- a/module/os/linux/zfs/zpl_super.c +++ b/module/os/linux/zfs/zpl_super.c @@ -274,8 +274,12 @@ zpl_mount_impl(struct file_system_type *fs_type, int flags, zfs_mnt_t *zm) * a txg sync. If the dsl_pool lock is held over sget() * this can prevent the pool sync and cause a deadlock. */ + dsl_dataset_long_hold(dmu_objset_ds(os), FTAG); dsl_pool_rele(dmu_objset_pool(os), FTAG); + s = sget(fs_type, zpl_test_super, set_anon_super, flags, os); + + dsl_dataset_long_rele(dmu_objset_ds(os), FTAG); dsl_dataset_rele(dmu_objset_ds(os), FTAG); if (IS_ERR(s))