|
@@ -2011,6 +2011,36 @@ static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void del_fs_roots(struct btrfs_fs_info *fs_info)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ struct btrfs_root *gang[8];
|
|
|
+ int i;
|
|
|
+
|
|
|
+ while (!list_empty(&fs_info->dead_roots)) {
|
|
|
+ gang[0] = list_entry(fs_info->dead_roots.next,
|
|
|
+ struct btrfs_root, root_list);
|
|
|
+ list_del(&gang[0]->root_list);
|
|
|
+
|
|
|
+ if (gang[0]->in_radix) {
|
|
|
+ btrfs_free_fs_root(fs_info, gang[0]);
|
|
|
+ } else {
|
|
|
+ free_extent_buffer(gang[0]->node);
|
|
|
+ free_extent_buffer(gang[0]->commit_root);
|
|
|
+ kfree(gang[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ while (1) {
|
|
|
+ ret = radix_tree_gang_lookup(&fs_info->fs_roots_radix,
|
|
|
+ (void **)gang, 0,
|
|
|
+ ARRAY_SIZE(gang));
|
|
|
+ if (!ret)
|
|
|
+ break;
|
|
|
+ for (i = 0; i < ret; i++)
|
|
|
+ btrfs_free_fs_root(fs_info, gang[i]);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
int open_ctree(struct super_block *sb,
|
|
|
struct btrfs_fs_devices *fs_devices,
|
|
@@ -2795,6 +2825,7 @@ fail_qgroup:
|
|
|
btrfs_free_qgroup_config(fs_info);
|
|
|
fail_trans_kthread:
|
|
|
kthread_stop(fs_info->transaction_kthread);
|
|
|
+ del_fs_roots(fs_info);
|
|
|
fail_cleaner:
|
|
|
kthread_stop(fs_info->cleaner_kthread);
|
|
|
|
|
@@ -3323,37 +3354,6 @@ static void free_fs_root(struct btrfs_root *root)
|
|
|
kfree(root);
|
|
|
}
|
|
|
|
|
|
-static void del_fs_roots(struct btrfs_fs_info *fs_info)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct btrfs_root *gang[8];
|
|
|
- int i;
|
|
|
-
|
|
|
- while (!list_empty(&fs_info->dead_roots)) {
|
|
|
- gang[0] = list_entry(fs_info->dead_roots.next,
|
|
|
- struct btrfs_root, root_list);
|
|
|
- list_del(&gang[0]->root_list);
|
|
|
-
|
|
|
- if (gang[0]->in_radix) {
|
|
|
- btrfs_free_fs_root(fs_info, gang[0]);
|
|
|
- } else {
|
|
|
- free_extent_buffer(gang[0]->node);
|
|
|
- free_extent_buffer(gang[0]->commit_root);
|
|
|
- kfree(gang[0]);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- while (1) {
|
|
|
- ret = radix_tree_gang_lookup(&fs_info->fs_roots_radix,
|
|
|
- (void **)gang, 0,
|
|
|
- ARRAY_SIZE(gang));
|
|
|
- if (!ret)
|
|
|
- break;
|
|
|
- for (i = 0; i < ret; i++)
|
|
|
- btrfs_free_fs_root(fs_info, gang[i]);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info)
|
|
|
{
|
|
|
u64 root_objectid = 0;
|