]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blobdiff - fs/btrfs/disk-io.c
Btrfs: add sanity tests for new qgroup accounting code
[mirror_ubuntu-eoan-kernel.git] / fs / btrfs / disk-io.c
index 77f92a32e2303f2d58291bddf3af3984b5fdaba8..0c0fa78ef4525b1a1c8999fad619fb898ed7609d 100644 (file)
@@ -1110,6 +1110,11 @@ struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root,
 struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root,
                                                 u64 bytenr, u32 blocksize)
 {
+#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
+       if (unlikely(test_bit(BTRFS_ROOT_DUMMY_ROOT, &root->state)))
+               return alloc_test_extent_buffer(root->fs_info, bytenr,
+                                               blocksize);
+#endif
        return alloc_extent_buffer(root->fs_info, bytenr, blocksize);
 }
 
@@ -1288,6 +1293,7 @@ struct btrfs_root *btrfs_alloc_dummy_root(void)
                return ERR_PTR(-ENOMEM);
        __setup_root(4096, 4096, 4096, 4096, root, NULL, 1);
        set_bit(BTRFS_ROOT_DUMMY_ROOT, &root->state);
+       root->alloc_bytenr = 0;
 
        return root;
 }
@@ -2089,7 +2095,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root)
                free_root_extent_buffers(info->chunk_root);
 }
 
-static void del_fs_roots(struct btrfs_fs_info *fs_info)
+void btrfs_free_fs_roots(struct btrfs_fs_info *fs_info)
 {
        int ret;
        struct btrfs_root *gang[8];
@@ -2969,7 +2975,7 @@ fail_qgroup:
 fail_trans_kthread:
        kthread_stop(fs_info->transaction_kthread);
        btrfs_cleanup_transaction(fs_info->tree_root);
-       del_fs_roots(fs_info);
+       btrfs_free_fs_roots(fs_info);
 fail_cleaner:
        kthread_stop(fs_info->cleaner_kthread);
 
@@ -3504,8 +3510,10 @@ void btrfs_drop_and_free_fs_root(struct btrfs_fs_info *fs_info,
        if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
                btrfs_free_log(NULL, root);
 
-       __btrfs_remove_free_space_cache(root->free_ino_pinned);
-       __btrfs_remove_free_space_cache(root->free_ino_ctl);
+       if (root->free_ino_pinned)
+               __btrfs_remove_free_space_cache(root->free_ino_pinned);
+       if (root->free_ino_ctl)
+               __btrfs_remove_free_space_cache(root->free_ino_ctl);
        free_fs_root(root);
 }
 
@@ -3655,7 +3663,7 @@ int close_ctree(struct btrfs_root *root)
 
        btrfs_sysfs_remove_one(fs_info);
 
-       del_fs_roots(fs_info);
+       btrfs_free_fs_roots(fs_info);
 
        btrfs_put_block_group_cache(fs_info);