/* clear out the rbtree of defraggable inodes */
        btrfs_cleanup_defrag_inodes(fs_info);
 
+       /*
+        * Handle the error fs first, as it will flush and wait for all ordered
+        * extents.  This will generate delayed iputs, thus we want to handle
+        * it first.
+        */
+       if (unlikely(BTRFS_FS_ERROR(fs_info)))
+               btrfs_error_commit_super(fs_info);
+
        /*
         * Wait for any fixup workers to complete.
         * If we don't wait for them here and they are still running by the time
                        btrfs_err(fs_info, "commit super ret %d", ret);
        }
 
-       if (BTRFS_FS_ERROR(fs_info))
-               btrfs_error_commit_super(fs_info);
-
        kthread_stop(fs_info->transaction_kthread);
        kthread_stop(fs_info->cleaner_kthread);
 
        /* cleanup FS via transaction */
        btrfs_cleanup_transaction(fs_info);
 
-       mutex_lock(&fs_info->cleaner_mutex);
-       btrfs_run_delayed_iputs(fs_info);
-       mutex_unlock(&fs_info->cleaner_mutex);
-
        down_write(&fs_info->cleanup_work_sem);
        up_write(&fs_info->cleanup_work_sem);
 }