Fix zfs_sb_teardown/zfs_resume_fs NULL dereference
[zfs.git] / module / zfs / zfs_vfsops.c
index 620e39b..602c332 100644 (file)
@@ -1056,10 +1056,12 @@ zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting)
        }
 
        /*
-        * Drain the iput_taskq to ensure all active references to the
+        * If someone has not already unmounted this file system,
+        * drain the iput_taskq to ensure all active references to the
         * zfs_sb_t have been handled only then can it be safely destroyed.
         */
-       taskq_wait(dsl_pool_iput_taskq(dmu_objset_pool(zsb->z_os)));
+       if (zsb->z_os)
+               taskq_wait(dsl_pool_iput_taskq(dmu_objset_pool(zsb->z_os)));
 
        /*
         * Close the zil. NB: Can't close the zil while zfs_inactive
@@ -1480,10 +1482,11 @@ bail:
 
        if (err) {
                /*
-                * Since we couldn't reopen zfs_sb_t, force
-                * unmount this file system.
+                * Since we couldn't reopen zfs_sb_t or, setup the
+                * sa framework, force unmount this file system.
                 */
-               (void) zfs_umount(zsb->z_sb);
+               if (zsb->z_os)
+                       (void) zfs_umount(zsb->z_sb);
        }
        return (err);
 }
@@ -1537,7 +1540,7 @@ zfs_set_version(zfs_sb_t *zsb, uint64_t newvers)
 
                error = zap_add(os, MASTER_NODE_OBJ,
                    ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
-               ASSERT3U(error, ==, 0);
+               ASSERT0(error);
 
                VERIFY(0 == sa_set_sa_object(os, sa_obj));
                sa_register_update_callback(os, zfs_sa_upgrade);