mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-23 15:35:18 +00:00
btrfs-progs: Refactor read_tree_block to get rid of btrfs_root
The only reasom read_tree_block() needs a btrfs_root parameter is to get its node/sector size. And long ago, I have already introduced a compactible interface, read_tree_block_fs_info() to pass btrfs_fs_info instead of btrfs_root. Since we have cleaned up all root->sector/node/stripesize users, we should be OK to refactor read_tree_block() function. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
This commit is contained in:
parent
060c7b3a1a
commit
8690c887d1
@ -450,7 +450,7 @@ static int __add_missing_keys(struct btrfs_fs_info *fs_info,
|
|||||||
if (ref->key_for_search.type)
|
if (ref->key_for_search.type)
|
||||||
continue;
|
continue;
|
||||||
BUG_ON(!ref->wanted_disk_byte);
|
BUG_ON(!ref->wanted_disk_byte);
|
||||||
eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte,
|
eb = read_tree_block(fs_info, ref->wanted_disk_byte,
|
||||||
fs_info->nodesize, 0);
|
fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
free_extent_buffer(eb);
|
free_extent_buffer(eb);
|
||||||
@ -805,7 +805,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
|
|||||||
u32 bsz;
|
u32 bsz;
|
||||||
struct extent_buffer *eb;
|
struct extent_buffer *eb;
|
||||||
bsz = fs_info->nodesize;
|
bsz = fs_info->nodesize;
|
||||||
eb = read_tree_block(fs_info->extent_root,
|
eb = read_tree_block(fs_info,
|
||||||
ref->parent, bsz, 0);
|
ref->parent, bsz, 0);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
free_extent_buffer(eb);
|
free_extent_buffer(eb);
|
||||||
|
@ -169,7 +169,7 @@ static int corrupt_keys_in_block(struct btrfs_fs_info *fs_info, u64 bytenr)
|
|||||||
{
|
{
|
||||||
struct extent_buffer *eb;
|
struct extent_buffer *eb;
|
||||||
|
|
||||||
eb = read_tree_block_fs_info(fs_info, bytenr, fs_info->nodesize, 0);
|
eb = read_tree_block(fs_info, bytenr, fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb))
|
if (!extent_buffer_uptodate(eb))
|
||||||
return -EIO;;
|
return -EIO;;
|
||||||
|
|
||||||
@ -278,6 +278,7 @@ static void btrfs_corrupt_extent_tree(struct btrfs_trans_handle *trans,
|
|||||||
struct btrfs_root *root,
|
struct btrfs_root *root,
|
||||||
struct extent_buffer *eb)
|
struct extent_buffer *eb)
|
||||||
{
|
{
|
||||||
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!eb)
|
if (!eb)
|
||||||
@ -296,8 +297,8 @@ static void btrfs_corrupt_extent_tree(struct btrfs_trans_handle *trans,
|
|||||||
for (i = 0; i < btrfs_header_nritems(eb); i++) {
|
for (i = 0; i < btrfs_header_nritems(eb); i++) {
|
||||||
struct extent_buffer *next;
|
struct extent_buffer *next;
|
||||||
|
|
||||||
next = read_tree_block(root, btrfs_node_blockptr(eb, i),
|
next = read_tree_block(fs_info, btrfs_node_blockptr(eb, i),
|
||||||
root->fs_info->nodesize,
|
fs_info->nodesize,
|
||||||
btrfs_node_ptr_generation(eb, i));
|
btrfs_node_ptr_generation(eb, i));
|
||||||
if (!extent_buffer_uptodate(next))
|
if (!extent_buffer_uptodate(next))
|
||||||
continue;
|
continue;
|
||||||
@ -765,7 +766,7 @@ static int corrupt_metadata_block(struct btrfs_fs_info *fs_info, u64 block,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
eb = read_tree_block_fs_info(fs_info, block, fs_info->nodesize, 0);
|
eb = read_tree_block(fs_info, block, fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
fprintf(stderr, "Couldn't read in tree block %s\n", field);
|
fprintf(stderr, "Couldn't read in tree block %s\n", field);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -149,7 +149,7 @@ static int change_extents_uuid(struct btrfs_fs_info *fs_info)
|
|||||||
goto next;
|
goto next;
|
||||||
|
|
||||||
bytenr = key.objectid;
|
bytenr = key.objectid;
|
||||||
eb = read_tree_block(root, bytenr, root->fs_info->nodesize, 0);
|
eb = read_tree_block(fs_info, bytenr, fs_info->nodesize, 0);
|
||||||
if (IS_ERR(eb)) {
|
if (IS_ERR(eb)) {
|
||||||
error("failed to read tree block: %llu", bytenr);
|
error("failed to read tree block: %llu", bytenr);
|
||||||
ret = PTR_ERR(eb);
|
ret = PTR_ERR(eb);
|
||||||
|
24
cmds-check.c
24
cmds-check.c
@ -2183,7 +2183,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
|
|||||||
if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
|
if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
|
||||||
free_extent_buffer(next);
|
free_extent_buffer(next);
|
||||||
reada_walk_down(root, cur, path->slots[*level]);
|
reada_walk_down(root, cur, path->slots[*level]);
|
||||||
next = read_tree_block(root, bytenr, blocksize,
|
next = read_tree_block(root->fs_info, bytenr, blocksize,
|
||||||
ptr_gen);
|
ptr_gen);
|
||||||
if (!extent_buffer_uptodate(next)) {
|
if (!extent_buffer_uptodate(next)) {
|
||||||
struct btrfs_key node_key;
|
struct btrfs_key node_key;
|
||||||
@ -2298,7 +2298,7 @@ static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
|
|||||||
if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
|
if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
|
||||||
free_extent_buffer(next);
|
free_extent_buffer(next);
|
||||||
reada_walk_down(root, cur, path->slots[*level]);
|
reada_walk_down(root, cur, path->slots[*level]);
|
||||||
next = read_tree_block(root, bytenr, blocksize,
|
next = read_tree_block(root->fs_info, bytenr, blocksize,
|
||||||
ptr_gen);
|
ptr_gen);
|
||||||
if (!extent_buffer_uptodate(next)) {
|
if (!extent_buffer_uptodate(next)) {
|
||||||
struct btrfs_key node_key;
|
struct btrfs_key node_key;
|
||||||
@ -7667,7 +7667,7 @@ static int run_next_block(struct btrfs_root *root,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* fixme, get the real parent transid */
|
/* fixme, get the real parent transid */
|
||||||
buf = read_tree_block(root, bytenr, size, gen);
|
buf = read_tree_block(root->fs_info, bytenr, size, gen);
|
||||||
if (!extent_buffer_uptodate(buf)) {
|
if (!extent_buffer_uptodate(buf)) {
|
||||||
record_bad_block_io(root->fs_info,
|
record_bad_block_io(root->fs_info,
|
||||||
extent_cache, bytenr, size);
|
extent_cache, bytenr, size);
|
||||||
@ -9780,7 +9780,7 @@ static int deal_root_from_list(struct list_head *list,
|
|||||||
rec = list_entry(list->next,
|
rec = list_entry(list->next,
|
||||||
struct root_item_record, list);
|
struct root_item_record, list);
|
||||||
last = 0;
|
last = 0;
|
||||||
buf = read_tree_block(root->fs_info->tree_root,
|
buf = read_tree_block(root->fs_info,
|
||||||
rec->bytenr, rec->level_size, 0);
|
rec->bytenr, rec->level_size, 0);
|
||||||
if (!extent_buffer_uptodate(buf)) {
|
if (!extent_buffer_uptodate(buf)) {
|
||||||
free_extent_buffer(buf);
|
free_extent_buffer(buf);
|
||||||
@ -10426,7 +10426,7 @@ static int query_tree_block_level(struct btrfs_fs_info *fs_info, u64 bytenr)
|
|||||||
btrfs_release_path(&path);
|
btrfs_release_path(&path);
|
||||||
|
|
||||||
/* Get level from tree block as an alternative source */
|
/* Get level from tree block as an alternative source */
|
||||||
eb = read_tree_block_fs_info(fs_info, bytenr, nodesize, transid);
|
eb = read_tree_block(fs_info, bytenr, nodesize, transid);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
free_extent_buffer(eb);
|
free_extent_buffer(eb);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -10479,7 +10479,7 @@ static int check_tree_block_backref(struct btrfs_fs_info *fs_info, u64 root_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read out the tree block to get item/node key */
|
/* Read out the tree block to get item/node key */
|
||||||
eb = read_tree_block(root, bytenr, root->fs_info->nodesize, 0);
|
eb = read_tree_block(fs_info, bytenr, root->fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
err |= REFERENCER_MISSING;
|
err |= REFERENCER_MISSING;
|
||||||
free_extent_buffer(eb);
|
free_extent_buffer(eb);
|
||||||
@ -10581,7 +10581,7 @@ static int check_shared_block_backref(struct btrfs_fs_info *fs_info,
|
|||||||
int found_parent = 0;
|
int found_parent = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
|
eb = read_tree_block(fs_info, parent, nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb))
|
if (!extent_buffer_uptodate(eb))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -10735,7 +10735,7 @@ static int check_shared_data_backref(struct btrfs_fs_info *fs_info,
|
|||||||
int found_parent = 0;
|
int found_parent = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
|
eb = read_tree_block(fs_info, parent, nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(eb))
|
if (!extent_buffer_uptodate(eb))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -11502,7 +11502,8 @@ static int traverse_tree_block(struct btrfs_root *root,
|
|||||||
* As a btrfs tree has most 8 levels (0..7), so it's quite safe
|
* As a btrfs tree has most 8 levels (0..7), so it's quite safe
|
||||||
* to call the function itself.
|
* to call the function itself.
|
||||||
*/
|
*/
|
||||||
eb = read_tree_block(root, blocknr, root->fs_info->nodesize, 0);
|
eb = read_tree_block(root->fs_info, blocknr,
|
||||||
|
root->fs_info->nodesize, 0);
|
||||||
if (extent_buffer_uptodate(eb)) {
|
if (extent_buffer_uptodate(eb)) {
|
||||||
ret = traverse_tree_block(root, eb);
|
ret = traverse_tree_block(root, eb);
|
||||||
err |= ret;
|
err |= ret;
|
||||||
@ -11688,8 +11689,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
|
|||||||
* in, but for now this doesn't actually use the root so
|
* in, but for now this doesn't actually use the root so
|
||||||
* just pass in extent_root.
|
* just pass in extent_root.
|
||||||
*/
|
*/
|
||||||
tmp = read_tree_block(fs_info->extent_root, bytenr,
|
tmp = read_tree_block(fs_info, bytenr, nodesize, 0);
|
||||||
nodesize, 0);
|
|
||||||
if (!extent_buffer_uptodate(tmp)) {
|
if (!extent_buffer_uptodate(tmp)) {
|
||||||
fprintf(stderr, "Error reading root block\n");
|
fprintf(stderr, "Error reading root block\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -11707,7 +11707,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = read_tree_block(fs_info->extent_root, bytenr,
|
tmp = read_tree_block(fs_info, bytenr,
|
||||||
nodesize, 0);
|
nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(tmp)) {
|
if (!extent_buffer_uptodate(tmp)) {
|
||||||
fprintf(stderr, "Error reading tree block\n");
|
fprintf(stderr, "Error reading tree block\n");
|
||||||
|
@ -52,7 +52,8 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb)
|
|||||||
size = root->fs_info->nodesize;
|
size = root->fs_info->nodesize;
|
||||||
nr = btrfs_header_nritems(eb);
|
nr = btrfs_header_nritems(eb);
|
||||||
for (i = 0; i < nr; i++) {
|
for (i = 0; i < nr; i++) {
|
||||||
next = read_tree_block(root, btrfs_node_blockptr(eb, i),
|
next = read_tree_block(root->fs_info,
|
||||||
|
btrfs_node_blockptr(eb, i),
|
||||||
size, btrfs_node_ptr_generation(eb, i));
|
size, btrfs_node_ptr_generation(eb, i));
|
||||||
if (!extent_buffer_uptodate(next))
|
if (!extent_buffer_uptodate(next))
|
||||||
continue;
|
continue;
|
||||||
@ -311,7 +312,7 @@ int cmd_inspect_dump_tree(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (block_only) {
|
if (block_only) {
|
||||||
leaf = read_tree_block(root,
|
leaf = read_tree_block(info,
|
||||||
block_only,
|
block_only,
|
||||||
info->nodesize, 0);
|
info->nodesize, 0);
|
||||||
|
|
||||||
@ -322,7 +323,7 @@ int cmd_inspect_dump_tree(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!leaf) {
|
if (!leaf) {
|
||||||
leaf = read_tree_block(root,
|
leaf = read_tree_block(info,
|
||||||
block_only,
|
block_only,
|
||||||
info->nodesize, 0);
|
info->nodesize, 0);
|
||||||
}
|
}
|
||||||
@ -439,8 +440,7 @@ again:
|
|||||||
|
|
||||||
offset = btrfs_item_ptr_offset(leaf, slot);
|
offset = btrfs_item_ptr_offset(leaf, slot);
|
||||||
read_extent_buffer(leaf, &ri, offset, sizeof(ri));
|
read_extent_buffer(leaf, &ri, offset, sizeof(ri));
|
||||||
buf = read_tree_block(tree_root_scan,
|
buf = read_tree_block(info, btrfs_root_bytenr(&ri),
|
||||||
btrfs_root_bytenr(&ri),
|
|
||||||
info->nodesize, 0);
|
info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(buf))
|
if (!extent_buffer_uptodate(buf))
|
||||||
goto next;
|
goto next;
|
||||||
|
@ -153,7 +153,7 @@ static int walk_nodes(struct btrfs_root *root, struct btrfs_path *path,
|
|||||||
|
|
||||||
path->slots[level] = i;
|
path->slots[level] = i;
|
||||||
if ((level - 1) > 0 || find_inline) {
|
if ((level - 1) > 0 || find_inline) {
|
||||||
tmp = read_tree_block(root, cur_blocknr,
|
tmp = read_tree_block(root->fs_info, cur_blocknr,
|
||||||
nodesize,
|
nodesize,
|
||||||
btrfs_node_ptr_generation(b, i));
|
btrfs_node_ptr_generation(b, i));
|
||||||
if (!extent_buffer_uptodate(tmp)) {
|
if (!extent_buffer_uptodate(tmp)) {
|
||||||
|
@ -1255,7 +1255,7 @@ static struct btrfs_root *open_fs(const char *dev, u64 root_location,
|
|||||||
if (!root_location)
|
if (!root_location)
|
||||||
root_location = btrfs_super_root(fs_info->super_copy);
|
root_location = btrfs_super_root(fs_info->super_copy);
|
||||||
generation = btrfs_super_generation(fs_info->super_copy);
|
generation = btrfs_super_generation(fs_info->super_copy);
|
||||||
root->node = read_tree_block(root, root_location,
|
root->node = read_tree_block(fs_info, root_location,
|
||||||
fs_info->nodesize, generation);
|
fs_info->nodesize, generation);
|
||||||
if (!extent_buffer_uptodate(root->node)) {
|
if (!extent_buffer_uptodate(root->node)) {
|
||||||
fprintf(stderr, "Error opening tree root\n");
|
fprintf(stderr, "Error opening tree root\n");
|
||||||
@ -1502,7 +1502,7 @@ int cmd_restore(int argc, char **argv)
|
|||||||
|
|
||||||
if (fs_location != 0) {
|
if (fs_location != 0) {
|
||||||
free_extent_buffer(root->node);
|
free_extent_buffer(root->node);
|
||||||
root->node = read_tree_block(root, fs_location,
|
root->node = read_tree_block(root->fs_info, fs_location,
|
||||||
root->fs_info->nodesize, 0);
|
root->fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(root->node)) {
|
if (!extent_buffer_uptodate(root->node)) {
|
||||||
fprintf(stderr, "Failed to read fs location\n");
|
fprintf(stderr, "Failed to read fs location\n");
|
||||||
|
2
ctree.c
2
ctree.c
@ -649,7 +649,7 @@ struct extent_buffer *read_node_slot(struct btrfs_root *root,
|
|||||||
if (level == 0)
|
if (level == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return read_tree_block(root, btrfs_node_blockptr(parent, slot),
|
return read_tree_block(root->fs_info, btrfs_node_blockptr(parent, slot),
|
||||||
root->fs_info->nodesize,
|
root->fs_info->nodesize,
|
||||||
btrfs_node_ptr_generation(parent, slot));
|
btrfs_node_ptr_generation(parent, slot));
|
||||||
}
|
}
|
||||||
|
14
disk-io.c
14
disk-io.c
@ -306,7 +306,7 @@ int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirr
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct extent_buffer* read_tree_block_fs_info(
|
struct extent_buffer* read_tree_block(
|
||||||
struct btrfs_fs_info *fs_info, u64 bytenr, u32 blocksize,
|
struct btrfs_fs_info *fs_info, u64 bytenr, u32 blocksize,
|
||||||
u64 parent_transid)
|
u64 parent_transid)
|
||||||
{
|
{
|
||||||
@ -634,7 +634,8 @@ static int find_and_setup_root(struct btrfs_root *tree_root,
|
|||||||
|
|
||||||
blocksize = fs_info->nodesize;
|
blocksize = fs_info->nodesize;
|
||||||
generation = btrfs_root_generation(&root->root_item);
|
generation = btrfs_root_generation(&root->root_item);
|
||||||
root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),
|
root->node = read_tree_block(fs_info,
|
||||||
|
btrfs_root_bytenr(&root->root_item),
|
||||||
blocksize, generation);
|
blocksize, generation);
|
||||||
if (!extent_buffer_uptodate(root->node))
|
if (!extent_buffer_uptodate(root->node))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -663,7 +664,7 @@ static int find_and_setup_log_root(struct btrfs_root *tree_root,
|
|||||||
btrfs_setup_root(log_root, fs_info,
|
btrfs_setup_root(log_root, fs_info,
|
||||||
BTRFS_TREE_LOG_OBJECTID);
|
BTRFS_TREE_LOG_OBJECTID);
|
||||||
|
|
||||||
log_root->node = read_tree_block(tree_root, blocknr,
|
log_root->node = read_tree_block(fs_info, blocknr,
|
||||||
blocksize,
|
blocksize,
|
||||||
btrfs_super_generation(disk_super) + 1);
|
btrfs_super_generation(disk_super) + 1);
|
||||||
|
|
||||||
@ -752,7 +753,8 @@ out:
|
|||||||
}
|
}
|
||||||
generation = btrfs_root_generation(&root->root_item);
|
generation = btrfs_root_generation(&root->root_item);
|
||||||
blocksize = fs_info->nodesize;
|
blocksize = fs_info->nodesize;
|
||||||
root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),
|
root->node = read_tree_block(fs_info,
|
||||||
|
btrfs_root_bytenr(&root->root_item),
|
||||||
blocksize, generation);
|
blocksize, generation);
|
||||||
if (!extent_buffer_uptodate(root->node)) {
|
if (!extent_buffer_uptodate(root->node)) {
|
||||||
free(root);
|
free(root);
|
||||||
@ -1012,7 +1014,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr,
|
|||||||
generation = btrfs_backup_tree_root_gen(backup);
|
generation = btrfs_backup_tree_root_gen(backup);
|
||||||
}
|
}
|
||||||
|
|
||||||
root->node = read_tree_block(root, root_tree_bytenr, blocksize,
|
root->node = read_tree_block(fs_info, root_tree_bytenr, blocksize,
|
||||||
generation);
|
generation);
|
||||||
if (!extent_buffer_uptodate(root->node)) {
|
if (!extent_buffer_uptodate(root->node)) {
|
||||||
fprintf(stderr, "Couldn't read tree root\n");
|
fprintf(stderr, "Couldn't read tree root\n");
|
||||||
@ -1197,7 +1199,7 @@ int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info,
|
|||||||
else
|
else
|
||||||
generation = 0;
|
generation = 0;
|
||||||
|
|
||||||
fs_info->chunk_root->node = read_tree_block(fs_info->chunk_root,
|
fs_info->chunk_root->node = read_tree_block(fs_info,
|
||||||
chunk_root_bytenr,
|
chunk_root_bytenr,
|
||||||
fs_info->nodesize,
|
fs_info->nodesize,
|
||||||
generation);
|
generation);
|
||||||
|
@ -115,16 +115,9 @@ static inline u64 btrfs_sb_offset(int mirror)
|
|||||||
struct btrfs_device;
|
struct btrfs_device;
|
||||||
|
|
||||||
int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirror);
|
int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirror);
|
||||||
struct extent_buffer* read_tree_block_fs_info(
|
struct extent_buffer* read_tree_block(
|
||||||
struct btrfs_fs_info *fs_info, u64 bytenr, u32 blocksize,
|
struct btrfs_fs_info *fs_info, u64 bytenr, u32 blocksize,
|
||||||
u64 parent_transid);
|
u64 parent_transid);
|
||||||
static inline struct extent_buffer* read_tree_block(
|
|
||||||
struct btrfs_root *root, u64 bytenr, u32 blocksize,
|
|
||||||
u64 parent_transid)
|
|
||||||
{
|
|
||||||
return read_tree_block_fs_info(root->fs_info, bytenr, blocksize,
|
|
||||||
parent_transid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int read_extent_data(struct btrfs_root *root, char *data, u64 logical,
|
int read_extent_data(struct btrfs_root *root, char *data, u64 logical,
|
||||||
u64 *len, int mirror);
|
u64 *len, int mirror);
|
||||||
|
@ -133,8 +133,7 @@ int btrfs_find_root_search(struct btrfs_fs_info *fs_info,
|
|||||||
for (offset = chunk_offset;
|
for (offset = chunk_offset;
|
||||||
offset < chunk_offset + chunk_size;
|
offset < chunk_offset + chunk_size;
|
||||||
offset += nodesize) {
|
offset += nodesize) {
|
||||||
eb = read_tree_block_fs_info(fs_info, offset, nodesize,
|
eb = read_tree_block(fs_info, offset, nodesize, 0);
|
||||||
0);
|
|
||||||
if (!eb || IS_ERR(eb))
|
if (!eb || IS_ERR(eb))
|
||||||
continue;
|
continue;
|
||||||
ret = add_eb_to_result(eb, result, nodesize, filter,
|
ret = add_eb_to_result(eb, result, nodesize, filter,
|
||||||
|
14
image/main.c
14
image/main.c
@ -973,7 +973,8 @@ static int flush_pending(struct metadump_struct *md, int done)
|
|||||||
|
|
||||||
while (!md->data && size > 0) {
|
while (!md->data && size > 0) {
|
||||||
u64 this_read = min(blocksize, size);
|
u64 this_read = min(blocksize, size);
|
||||||
eb = read_tree_block(md->root, start, this_read, 0);
|
eb = read_tree_block(md->root->fs_info, start,
|
||||||
|
this_read, 0);
|
||||||
if (!extent_buffer_uptodate(eb)) {
|
if (!extent_buffer_uptodate(eb)) {
|
||||||
free(async->buffer);
|
free(async->buffer);
|
||||||
free(async);
|
free(async);
|
||||||
@ -1077,13 +1078,14 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb,
|
|||||||
struct extent_buffer *tmp;
|
struct extent_buffer *tmp;
|
||||||
struct btrfs_root_item *ri;
|
struct btrfs_root_item *ri;
|
||||||
struct btrfs_key key;
|
struct btrfs_key key;
|
||||||
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||||
u64 bytenr;
|
u64 bytenr;
|
||||||
int level;
|
int level;
|
||||||
int nritems = 0;
|
int nritems = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = add_extent(btrfs_header_bytenr(eb), root->fs_info->nodesize,
|
ret = add_extent(btrfs_header_bytenr(eb), fs_info->nodesize,
|
||||||
metadump, 0);
|
metadump, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error("unable to add metadata block %llu: %d",
|
error("unable to add metadata block %llu: %d",
|
||||||
@ -1103,8 +1105,8 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb,
|
|||||||
continue;
|
continue;
|
||||||
ri = btrfs_item_ptr(eb, i, struct btrfs_root_item);
|
ri = btrfs_item_ptr(eb, i, struct btrfs_root_item);
|
||||||
bytenr = btrfs_disk_root_bytenr(eb, ri);
|
bytenr = btrfs_disk_root_bytenr(eb, ri);
|
||||||
tmp = read_tree_block(root, bytenr,
|
tmp = read_tree_block(fs_info, bytenr,
|
||||||
root->fs_info->nodesize, 0);
|
fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(tmp)) {
|
if (!extent_buffer_uptodate(tmp)) {
|
||||||
error("unable to read log root block");
|
error("unable to read log root block");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -1115,8 +1117,8 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb,
|
|||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
bytenr = btrfs_node_blockptr(eb, i);
|
bytenr = btrfs_node_blockptr(eb, i);
|
||||||
tmp = read_tree_block(root, bytenr,
|
tmp = read_tree_block(fs_info, bytenr,
|
||||||
root->fs_info->nodesize, 0);
|
fs_info->nodesize, 0);
|
||||||
if (!extent_buffer_uptodate(tmp)) {
|
if (!extent_buffer_uptodate(tmp)) {
|
||||||
error("unable to read log root block");
|
error("unable to read log root block");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -1314,7 +1314,8 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < nr; i++) {
|
for (i = 0; i < nr; i++) {
|
||||||
next = read_tree_block(root, btrfs_node_blockptr(eb, i), size,
|
next = read_tree_block(root->fs_info,
|
||||||
|
btrfs_node_blockptr(eb, i), size,
|
||||||
btrfs_node_ptr_generation(eb, i));
|
btrfs_node_ptr_generation(eb, i));
|
||||||
if (!extent_buffer_uptodate(next)) {
|
if (!extent_buffer_uptodate(next)) {
|
||||||
fprintf(stderr, "failed to read %llu in tree %llu\n",
|
fprintf(stderr, "failed to read %llu in tree %llu\n",
|
||||||
|
@ -711,7 +711,7 @@ static int travel_tree(struct btrfs_fs_info *info, struct btrfs_root *root,
|
|||||||
// printf("travel_tree: bytenr: %llu\tnum_bytes: %llu\tref_parent: %llu\n",
|
// printf("travel_tree: bytenr: %llu\tnum_bytes: %llu\tref_parent: %llu\n",
|
||||||
// bytenr, num_bytes, ref_parent);
|
// bytenr, num_bytes, ref_parent);
|
||||||
|
|
||||||
eb = read_tree_block(root, bytenr, num_bytes, 0);
|
eb = read_tree_block(info, bytenr, num_bytes, 0);
|
||||||
if (!extent_buffer_uptodate(eb))
|
if (!extent_buffer_uptodate(eb))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user