.indirect_missing_keys = PREFTREE_INIT
};
+ if (unlikely(!root)) {
+ btrfs_err(ctx->fs_info,
+ "missing extent root for extent at bytenr %llu",
+ ctx->bytenr);
+ return -EUCLEAN;
+ }
+
/* Roots ulist is not needed when using a sharedness check context. */
if (sc)
ASSERT(ctx->roots == NULL);
struct btrfs_extent_item *ei;
struct btrfs_key key;
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ logical);
+ return -EUCLEAN;
+ }
+
key.objectid = logical;
if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
key.type = BTRFS_METADATA_ITEM_KEY;
struct btrfs_key key;
int ret;
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
key.type = BTRFS_METADATA_ITEM_KEY;
key.offset = (u64)-1;
/* We're at keyed items, there is no inline item, go to the next one */
extent_root = btrfs_extent_root(iter->fs_info, iter->bytenr);
+ if (unlikely(!extent_root)) {
+ btrfs_err(iter->fs_info,
+ "missing extent root for extent at bytenr %llu",
+ iter->bytenr);
+ return -EUCLEAN;
+ }
+
ret = btrfs_next_item(extent_root, iter->path);
if (ret)
return ret;
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
/*
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;
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);
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) {
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);
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.
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.
* this will bump the backup pointer by one when it is
* done
*/
-static void backup_super_roots(struct btrfs_fs_info *info)
+static int backup_super_roots(struct btrfs_fs_info *info)
{
const int next_backup = info->backup_root_index;
struct btrfs_root_backup *root_backup;
struct btrfs_root *extent_root = btrfs_extent_root(info, 0);
struct btrfs_root *csum_root = btrfs_csum_root(info, 0);
+ if (unlikely(!extent_root)) {
+ btrfs_err(info, "missing extent root for extent at bytenr 0");
+ return -EUCLEAN;
+ }
+
btrfs_set_backup_extent_root(root_backup,
extent_root->node->start);
btrfs_set_backup_extent_root_gen(root_backup,
memcpy(&info->super_copy->super_roots,
&info->super_for_commit->super_roots,
sizeof(*root_backup) * BTRFS_NUM_BACKUP_ROOTS);
+
+ return 0;
}
/*
* not from fsync where the tree roots in fs_info have not
* been consistent on disk.
*/
- if (max_mirrors == 0)
- backup_super_roots(fs_info);
+ if (max_mirrors == 0) {
+ ret = backup_super_roots(fs_info);
+ if (ret < 0)
+ return ret;
+ }
sb = fs_info->super_for_commit;
dev_item = &sb->dev_item;
struct btrfs_key key;
BTRFS_PATH_AUTO_FREE(path);
+ if (unlikely(!root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu", start);
+ return -EUCLEAN;
+ }
+
path = btrfs_alloc_path();
if (!path)
return -ENOMEM;
key.offset = offset;
extent_root = btrfs_extent_root(fs_info, bytenr);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
if (ret < 0)
return ret;
int recow;
int ret;
+ if (unlikely(!root)) {
+ btrfs_err(trans->fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
if (parent) {
key.type = BTRFS_SHARED_DATA_REF_KEY;
u32 num_refs;
int ret;
+ if (unlikely(!root)) {
+ btrfs_err(trans->fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
if (node->parent) {
key.type = BTRFS_SHARED_DATA_REF_KEY;
struct btrfs_key key;
int ret;
+ if (unlikely(!root)) {
+ btrfs_err(trans->fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
if (parent) {
key.type = BTRFS_SHARED_BLOCK_REF_KEY;
struct btrfs_key key;
int ret;
+ if (unlikely(!root)) {
+ btrfs_err(trans->fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
if (node->parent) {
key.type = BTRFS_SHARED_BLOCK_REF_KEY;
bool skinny_metadata = btrfs_fs_incompat(fs_info, SKINNY_METADATA);
int needed;
+ if (unlikely(!root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
key.type = BTRFS_EXTENT_ITEM_KEY;
key.offset = num_bytes;
}
root = btrfs_extent_root(fs_info, key.objectid);
+ if (unlikely(!root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ key.objectid);
+ return -EUCLEAN;
+ }
again:
ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
if (ret < 0) {
int type;
int ret;
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
+
key.objectid = bytenr;
key.type = BTRFS_EXTENT_ITEM_KEY;
key.offset = (u64)-1;
u64 delayed_ref_root = href->owning_root;
extent_root = btrfs_extent_root(info, bytenr);
- ASSERT(extent_root);
+ if (unlikely(!extent_root)) {
+ btrfs_err(info,
+ "missing extent root for extent at bytenr %llu", bytenr);
+ return -EUCLEAN;
+ }
path = btrfs_alloc_path();
if (!path)
size += btrfs_extent_inline_ref_size(BTRFS_EXTENT_OWNER_REF_KEY);
size += btrfs_extent_inline_ref_size(type);
+ extent_root = btrfs_extent_root(fs_info, ins->objectid);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ ins->objectid);
+ return -EUCLEAN;
+ }
+
path = btrfs_alloc_path();
if (!path)
return -ENOMEM;
- extent_root = btrfs_extent_root(fs_info, ins->objectid);
ret = btrfs_insert_empty_item(trans, extent_root, path, ins, size);
if (ret) {
btrfs_free_path(path);
size += sizeof(*block_info);
}
+ extent_root = btrfs_extent_root(fs_info, extent_key.objectid);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ extent_key.objectid);
+ return -EUCLEAN;
+ }
+
path = btrfs_alloc_path();
if (!path)
return -ENOMEM;
- extent_root = btrfs_extent_root(fs_info, extent_key.objectid);
ret = btrfs_insert_empty_item(trans, extent_root, path, &extent_key,
size);
if (ret) {
if (ret)
return ret;
+ extent_root = btrfs_extent_root(trans->fs_info, block_group->start);
+ if (unlikely(!extent_root)) {
+ btrfs_err(trans->fs_info,
+ "missing extent root for block group at offset %llu",
+ block_group->start);
+ return -EUCLEAN;
+ }
+
mutex_lock(&block_group->free_space_lock);
/*
key.type = BTRFS_EXTENT_ITEM_KEY;
key.offset = 0;
- extent_root = btrfs_extent_root(trans->fs_info, key.objectid);
ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0);
if (ret < 0)
goto out_locked;
mutex_lock(&fs_info->qgroup_rescan_lock);
extent_root = btrfs_extent_root(fs_info,
fs_info->qgroup_rescan_progress.objectid);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ fs_info->qgroup_rescan_progress.objectid);
+ mutex_unlock(&fs_info->qgroup_rescan_lock);
+ return -EUCLEAN;
+ }
+
ret = btrfs_search_slot_for_read(extent_root,
&fs_info->qgroup_rescan_progress,
path, 1, 0);
struct btrfs_space_info *sinfo = src_bg->space_info;
extent_root = btrfs_extent_root(fs_info, src_bg->start);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for block group at offset %llu",
+ src_bg->start);
+ return -EUCLEAN;
+ }
trans = btrfs_start_transaction(extent_root, 0);
if (IS_ERR(trans))
int ret;
bool bg_is_ro = false;
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for block group at offset %llu",
+ group_start);
+ return -EUCLEAN;
+ }
+
/*
* This only gets set if we had a half-deleted snapshot on mount. We
* cannot allow relocation to start while we're still trying to clean up
goto out;
}
+ rc->extent_root = btrfs_extent_root(fs_info, 0);
+ if (unlikely(!rc->extent_root)) {
+ btrfs_err(fs_info, "missing extent root for extent at bytenr 0");
+ ret = -EUCLEAN;
+ goto out;
+ }
+
ret = reloc_chunk_start(fs_info);
if (ret < 0)
goto out_end;
- rc->extent_root = btrfs_extent_root(fs_info, 0);
-
set_reloc_control(rc);
trans = btrfs_join_transaction(rc->extent_root);
key.offset = 0;
root = btrfs_extent_root(fs_info, key.objectid);
+ if (unlikely(!root)) {
+ btrfs_err(fs_info,
+ "missing extent root for extent at bytenr %llu",
+ key.objectid);
+ return -EUCLEAN;
+ }
+
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
/* We should not find the exact match */
if (unlikely(!ret))