]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/zpl_super.c
Fix zpl_mount() deadlock
[mirror_zfs.git] / module / zfs / zpl_super.c
index fc10271b787fbd3691314eaa840f683958e7bf2d..5c426b0a9fb2ec715104ba69f7681bcba9662277 100644 (file)
@@ -271,8 +271,17 @@ zpl_mount_impl(struct file_system_type *fs_type, int flags, zfs_mnt_t *zm)
        if (err)
                return (ERR_PTR(-err));
 
+       /*
+        * The dsl pool lock must be released prior to calling sget().
+        * It is possible sget() may block on the lock in grab_super()
+        * while deactivate_super() holds that same lock and waits for
+        * a txg sync.  If the dsl_pool lock is held over over sget()
+        * this can prevent the pool sync and cause a deadlock.
+        */
+       dsl_pool_rele(dmu_objset_pool(os), FTAG);
        s = zpl_sget(fs_type, zpl_test_super, set_anon_super, flags, os);
-       dmu_objset_rele(os, FTAG);
+       dsl_dataset_rele(dmu_objset_ds(os), FTAG);
+
        if (IS_ERR(s))
                return (ERR_CAST(s));