]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
btrfs: selftests: Add support for dummy devices
authorNikolay Borisov <nborisov@suse.com>
Tue, 19 Nov 2019 12:05:51 +0000 (14:05 +0200)
committerDavid Sterba <dsterba@suse.com>
Thu, 23 Jan 2020 16:24:34 +0000 (17:24 +0100)
Add basic infrastructure to create and link dummy btrfs_devices. This
will be used in the pending btrfs_rmap_block test which deals with
the block groups.

Calling btrfs_alloc_dummy_device will link the newly created device to
the passed fs_info and the test framework will free them once the test
is finished.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tests/btrfs-tests.c
fs/btrfs/tests/btrfs-tests.h

index a7aca41417887c1212c77304075bf85a32071d78..c12b91ff5f56a2b8967d737eab74338b67efe216 100644 (file)
@@ -86,6 +86,27 @@ static void btrfs_destroy_test_fs(void)
        unregister_filesystem(&test_type);
 }
 
+struct btrfs_device *btrfs_alloc_dummy_device(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_device *dev;
+
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               return ERR_PTR(-ENOMEM);
+
+       extent_io_tree_init(NULL, &dev->alloc_state, 0, NULL);
+       INIT_LIST_HEAD(&dev->dev_list);
+       list_add(&dev->dev_list, &fs_info->fs_devices->devices);
+
+       return dev;
+}
+
+static void btrfs_free_dummy_device(struct btrfs_device *dev)
+{
+       extent_io_tree_release(&dev->alloc_state);
+       kfree(dev);
+}
+
 struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize)
 {
        struct btrfs_fs_info *fs_info = kzalloc(sizeof(struct btrfs_fs_info),
@@ -132,12 +153,14 @@ struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize)
        INIT_LIST_HEAD(&fs_info->dirty_qgroups);
        INIT_LIST_HEAD(&fs_info->dead_roots);
        INIT_LIST_HEAD(&fs_info->tree_mod_seq_list);
+       INIT_LIST_HEAD(&fs_info->fs_devices->devices);
        INIT_RADIX_TREE(&fs_info->buffer_radix, GFP_ATOMIC);
        INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC);
        extent_io_tree_init(fs_info, &fs_info->freed_extents[0],
                            IO_TREE_FS_INFO_FREED_EXTENTS0, NULL);
        extent_io_tree_init(fs_info, &fs_info->freed_extents[1],
                            IO_TREE_FS_INFO_FREED_EXTENTS1, NULL);
+       extent_map_tree_init(&fs_info->mapping_tree);
        fs_info->pinned_extents = &fs_info->freed_extents[0];
        set_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state);
 
@@ -150,6 +173,7 @@ void btrfs_free_dummy_fs_info(struct btrfs_fs_info *fs_info)
 {
        struct radix_tree_iter iter;
        void **slot;
+       struct btrfs_device *dev, *tmp;
 
        if (!fs_info)
                return;
@@ -180,6 +204,11 @@ void btrfs_free_dummy_fs_info(struct btrfs_fs_info *fs_info)
        }
        spin_unlock(&fs_info->buffer_lock);
 
+       btrfs_mapping_tree_free(&fs_info->mapping_tree);
+       list_for_each_entry_safe(dev, tmp, &fs_info->fs_devices->devices,
+                                dev_list) {
+               btrfs_free_dummy_device(dev);
+       }
        btrfs_free_qgroup_config(fs_info);
        btrfs_free_fs_roots(fs_info);
        cleanup_srcu_struct(&fs_info->subvol_srcu);
index 9e52527357d8432a0e198757e60e7bea25b63d61..7a2d7ffbe30e85b01984f325ffa015e066f6c8a6 100644 (file)
@@ -46,6 +46,7 @@ btrfs_alloc_dummy_block_group(struct btrfs_fs_info *fs_info, unsigned long lengt
 void btrfs_free_dummy_block_group(struct btrfs_block_group *cache);
 void btrfs_init_dummy_trans(struct btrfs_trans_handle *trans,
                            struct btrfs_fs_info *fs_info);
+struct btrfs_device *btrfs_alloc_dummy_device(struct btrfs_fs_info *fs_info);
 #else
 static inline int btrfs_run_sanity_tests(void)
 {