|
@@ -1149,12 +1149,12 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
|
|
|
|
|
|
buf = btrfs_find_create_tree_block(root, bytenr);
|
|
|
if (!buf)
|
|
|
- return NULL;
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid);
|
|
|
if (ret) {
|
|
|
free_extent_buffer(buf);
|
|
|
- return NULL;
|
|
|
+ return ERR_PTR(ret);
|
|
|
}
|
|
|
return buf;
|
|
|
|
|
@@ -1509,20 +1509,19 @@ static struct btrfs_root *btrfs_read_tree_root(struct btrfs_root *tree_root,
|
|
|
generation = btrfs_root_generation(&root->root_item);
|
|
|
root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),
|
|
|
generation);
|
|
|
- if (!root->node) {
|
|
|
- ret = -ENOMEM;
|
|
|
+ if (IS_ERR(root->node)) {
|
|
|
+ ret = PTR_ERR(root->node);
|
|
|
goto find_fail;
|
|
|
} else if (!btrfs_buffer_uptodate(root->node, generation, 0)) {
|
|
|
ret = -EIO;
|
|
|
- goto read_fail;
|
|
|
+ free_extent_buffer(root->node);
|
|
|
+ goto find_fail;
|
|
|
}
|
|
|
root->commit_root = btrfs_root_node(root);
|
|
|
out:
|
|
|
btrfs_free_path(path);
|
|
|
return root;
|
|
|
|
|
|
-read_fail:
|
|
|
- free_extent_buffer(root->node);
|
|
|
find_fail:
|
|
|
kfree(root);
|
|
|
alloc_fail:
|
|
@@ -2320,8 +2319,11 @@ static int btrfs_replay_log(struct btrfs_fs_info *fs_info,
|
|
|
|
|
|
log_tree_root->node = read_tree_block(tree_root, bytenr,
|
|
|
fs_info->generation + 1);
|
|
|
- if (!log_tree_root->node ||
|
|
|
- !extent_buffer_uptodate(log_tree_root->node)) {
|
|
|
+ if (IS_ERR(log_tree_root->node)) {
|
|
|
+ printk(KERN_ERR "BTRFS: failed to read log tree\n");
|
|
|
+ kfree(log_tree_root);
|
|
|
+ return PTR_ERR(log_tree_root->node);
|
|
|
+ } else if (!extent_buffer_uptodate(log_tree_root->node)) {
|
|
|
printk(KERN_ERR "BTRFS: failed to read log tree\n");
|
|
|
free_extent_buffer(log_tree_root->node);
|
|
|
kfree(log_tree_root);
|
|
@@ -2797,8 +2799,8 @@ int open_ctree(struct super_block *sb,
|
|
|
chunk_root->node = read_tree_block(chunk_root,
|
|
|
btrfs_super_chunk_root(disk_super),
|
|
|
generation);
|
|
|
- if (!chunk_root->node ||
|
|
|
- !test_bit(EXTENT_BUFFER_UPTODATE, &chunk_root->node->bflags)) {
|
|
|
+ if (IS_ERR(chunk_root->node) ||
|
|
|
+ !extent_buffer_uptodate(chunk_root->node)) {
|
|
|
printk(KERN_ERR "BTRFS: failed to read chunk root on %s\n",
|
|
|
sb->s_id);
|
|
|
goto fail_tree_roots;
|
|
@@ -2834,8 +2836,8 @@ retry_root_backup:
|
|
|
tree_root->node = read_tree_block(tree_root,
|
|
|
btrfs_super_root(disk_super),
|
|
|
generation);
|
|
|
- if (!tree_root->node ||
|
|
|
- !test_bit(EXTENT_BUFFER_UPTODATE, &tree_root->node->bflags)) {
|
|
|
+ if (IS_ERR(tree_root->node) ||
|
|
|
+ !extent_buffer_uptodate(tree_root->node)) {
|
|
|
printk(KERN_WARNING "BTRFS: failed to read tree root on %s\n",
|
|
|
sb->s_id);
|
|
|
|