summaryrefslogtreecommitdiff
path: root/fs/btrfs/block-group.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/block-group.c')
-rw-r--r--fs/btrfs/block-group.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 2a886bece810..c0d17a369bda 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -739,6 +739,12 @@ static int load_extent_tree_free(struct btrfs_caching_control *caching_ctl)
last = max_t(u64, block_group->start, BTRFS_SUPER_INFO_OFFSET);
extent_root = btrfs_extent_root(fs_info, last);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for block group at offset %llu",
+ block_group->start);
+ return -EUCLEAN;
+ }
#ifdef CONFIG_BTRFS_DEBUG
/*
@@ -1061,6 +1067,11 @@ static int remove_block_group_item(struct btrfs_trans_handle *trans,
int ret;
root = btrfs_block_group_root(fs_info);
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return -EUCLEAN;
+ }
+
key.objectid = block_group->start;
key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
key.offset = block_group->length;
@@ -1349,6 +1360,11 @@ struct btrfs_trans_handle *btrfs_start_trans_remove_block_group(
struct btrfs_chunk_map *map;
unsigned int num_items;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return ERR_PTR(-EUCLEAN);
+ }
+
map = btrfs_find_chunk_map(fs_info, chunk_offset, 1);
ASSERT(map != NULL);
ASSERT(map->start == chunk_offset);
@@ -2140,6 +2156,11 @@ static int find_first_block_group(struct btrfs_fs_info *fs_info,
int ret;
struct btrfs_key found_key;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return -EUCLEAN;
+ }
+
btrfs_for_each_slot(root, key, &found_key, path, ret) {
if (found_key.objectid >= key->objectid &&
found_key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
@@ -2713,6 +2734,11 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans,
size_t size;
int ret;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return -EUCLEAN;
+ }
+
spin_lock(&block_group->lock);
btrfs_set_stack_block_group_v2_used(&bgi, block_group->used);
btrfs_set_stack_block_group_v2_chunk_objectid(&bgi, block_group->global_root_id);
@@ -3048,6 +3074,11 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group *cache,
int ret;
bool dirty_bg_running;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return -EUCLEAN;
+ }
+
/*
* This can only happen when we are doing read-only scrub on read-only
* mount.
@@ -3192,6 +3223,11 @@ static int update_block_group_item(struct btrfs_trans_handle *trans,
u64 used, remap_bytes;
u32 identity_remap_count;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info, "missing block group root");
+ return -EUCLEAN;
+ }
+
/*
* Block group items update can be triggered out of commit transaction
* critical section, thus we need a consistent view of used bytes.
@@ -4547,7 +4583,7 @@ static void check_removing_space_info(struct btrfs_space_info *space_info)
for (int i = 0; i < BTRFS_SPACE_INFO_SUB_GROUP_MAX; i++) {
if (space_info->sub_group[i]) {
check_removing_space_info(space_info->sub_group[i]);
- kfree(space_info->sub_group[i]);
+ btrfs_sysfs_remove_space_info(space_info->sub_group[i]);
space_info->sub_group[i] = NULL;
}
}