Message ID | 1422328363-11405-1-git-send-email-quwenruo@cn.fujitsu.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
On Mon, Jan 26, 2015 at 10:12 PM, Qu Wenruo <quwenruo@cn.fujitsu.com> wrote: > Allow read_tree_block() and read_node_slot() to return error pointer. > This should help caller to get more specified error number. > > For existing callers, change (!eb) judgmentt to > (!extent_buffer_uptodate(eb)) to keep the compatibility, and for caller > missing the check, use PTR_ERR(eb) if possible. > > Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> > --- > backref.c | 4 ++-- > btrfs-calc-size.c | 2 +- > btrfs-corrupt-block.c | 6 +++--- > btrfs-debug-tree.c | 7 +++++-- > btrfs-image.c | 6 +++--- > cmds-check.c | 6 +++--- > cmds-restore.c | 6 +++--- > ctree.c | 29 ++++++++++++++++++++++------- > disk-io.c | 10 +++++----- > extent-tree.c | 6 ++++++ > extent_io.c | 3 +-- > print-tree.c | 2 +- > qgroup-verify.c | 2 +- > 13 files changed, 56 insertions(+), 33 deletions(-) > > diff --git a/backref.c b/backref.c > index 593f936..9a2efca 100644 > --- a/backref.c > +++ b/backref.c > @@ -451,7 +451,7 @@ static int __add_missing_keys(struct btrfs_fs_info *fs_info, > BUG_ON(!ref->wanted_disk_byte); > eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte, > fs_info->tree_root->leafsize, 0); > - if (!eb || !extent_buffer_uptodate(eb)) { > + if (!extent_buffer_uptodate(eb)) { > free_extent_buffer(eb); > return -EIO; > } > @@ -808,7 +808,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, > ref->level); > eb = read_tree_block(fs_info->extent_root, > ref->parent, bsz, 0); > - if (!eb || !extent_buffer_uptodate(eb)) { > + if (!extent_buffer_uptodate(eb)) { > free_extent_buffer(eb); > ret = -EIO; > goto out; > diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c > index 501111c..354f70d 100644 > --- a/btrfs-calc-size.c > +++ b/btrfs-calc-size.c > @@ -159,7 +159,7 @@ static int walk_nodes(struct btrfs_root *root, struct btrfs_path *path, > tmp = read_tree_block(root, cur_blocknr, > btrfs_level_size(root, level - 1), > btrfs_node_ptr_generation(b, i)); > - if (!tmp) { > + if (!extent_buffer_uptodate(tmp)) { > fprintf(stderr, "Failed to read blocknr %Lu\n", > btrfs_node_blockptr(b, i)); > continue; > diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c > index b477e87..af03ad1 100644 > --- a/btrfs-corrupt-block.c > +++ b/btrfs-corrupt-block.c > @@ -160,7 +160,7 @@ static int corrupt_keys_in_block(struct btrfs_root *root, u64 bytenr) > struct extent_buffer *eb; > > eb = read_tree_block(root, bytenr, root->leafsize, 0); > - if (!eb) > + if (!extent_buffer_uptodate(eb)) > return -EIO;; > > corrupt_keys(NULL, root, eb); > @@ -288,7 +288,7 @@ static void btrfs_corrupt_extent_tree(struct btrfs_trans_handle *trans, > next = read_tree_block(root, btrfs_node_blockptr(eb, i), > root->leafsize, > btrfs_node_ptr_generation(eb, i)); > - if (!next) > + if (!extent_buffer_uptodate(next)) > continue; > btrfs_corrupt_extent_tree(trans, root, next); > free_extent_buffer(next); > @@ -696,7 +696,7 @@ static int corrupt_metadata_block(struct btrfs_root *root, u64 block, > } > > eb = read_tree_block(root, block, root->leafsize, 0); > - if (!eb) { > + if (!extent_buffer_uptodate(eb)) { > fprintf(stderr, "Couldn't read in tree block %s\n", field); > return -EINVAL; > } > diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c > index 9cdb35f..3efd434 100644 > --- a/btrfs-debug-tree.c > +++ b/btrfs-debug-tree.c > @@ -68,6 +68,8 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) > btrfs_node_blockptr(eb, i), > size, > btrfs_node_ptr_generation(eb, i)); > + if (!extent_buffer_uptodate(next)) > + continue; > if (btrfs_is_leaf(next) && > btrfs_header_level(eb) != 1) > BUG(); > @@ -202,7 +204,8 @@ int main(int ac, char **av) > block_only, > root->leafsize, 0); > > - if (leaf && btrfs_header_level(leaf) != 0) { > + if (extent_buffer_uptodate(leaf) && > + btrfs_header_level(leaf) != 0) { > free_extent_buffer(leaf); > leaf = NULL; > } > @@ -212,7 +215,7 @@ int main(int ac, char **av) > block_only, > root->nodesize, 0); > } > - if (!leaf) { > + if (!extent_buffer_uptodate(leaf)) { > fprintf(stderr, "failed to read %llu\n", > (unsigned long long)block_only); > goto close_root; > diff --git a/btrfs-image.c b/btrfs-image.c > index cb17f16..667822c 100644 > --- a/btrfs-image.c > +++ b/btrfs-image.c > @@ -910,7 +910,7 @@ static int flush_pending(struct metadump_struct *md, int done) > while (!md->data && size > 0) { > u64 this_read = min(blocksize, size); > eb = read_tree_block(md->root, start, this_read, 0); > - if (!eb) { > + if (!extent_buffer_uptodate(eb)) { > free(async->buffer); > free(async); > fprintf(stderr, > @@ -1039,7 +1039,7 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb, > ri = btrfs_item_ptr(eb, i, struct btrfs_root_item); > bytenr = btrfs_disk_root_bytenr(eb, ri); > tmp = read_tree_block(root, bytenr, root->leafsize, 0); > - if (!tmp) { > + if (!extent_buffer_uptodate(tmp)) { > fprintf(stderr, > "Error reading log root block\n"); > return -EIO; > @@ -1051,7 +1051,7 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb, > } else { > bytenr = btrfs_node_blockptr(eb, i); > tmp = read_tree_block(root, bytenr, root->leafsize, 0); > - if (!tmp) { > + if (!extent_buffer_uptodate(tmp)) { > fprintf(stderr, "Error reading log block\n"); > return -EIO; > } > diff --git a/cmds-check.c b/cmds-check.c > index bafa743..bbbf432 100644 > --- a/cmds-check.c > +++ b/cmds-check.c > @@ -1759,7 +1759,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path, > reada_walk_down(root, cur, path->slots[*level]); > next = read_tree_block(root, bytenr, blocksize, > ptr_gen); > - if (!next) { > + if (!extent_buffer_uptodate(next)) { > struct btrfs_key node_key; > > btrfs_node_key_to_cpu(path->nodes[*level], > @@ -8099,7 +8099,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info, > */ > tmp = read_tree_block(fs_info->extent_root, bytenr, > leafsize, 0); > - if (!tmp) { > + if (!extent_buffer_uptodate(tmp)) { > fprintf(stderr, "Error reading root block\n"); > return -EIO; > } > @@ -8118,7 +8118,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info, > > tmp = read_tree_block(fs_info->extent_root, bytenr, > leafsize, 0); > - if (!tmp) { > + if (!extent_buffer_uptodate(tmp)) { > fprintf(stderr, "Error reading tree block\n"); > return -EIO; > } > diff --git a/cmds-restore.c b/cmds-restore.c > index 859deaf..efc2414 100644 > --- a/cmds-restore.c > +++ b/cmds-restore.c > @@ -199,7 +199,7 @@ again: > reada_for_search(root, path, level, slot, 0); > > next = read_node_slot(root, c, slot); > - if (next) > + if (extent_buffer_uptodate(next)) > break; > offset++; > } > @@ -215,7 +215,7 @@ again: > if (path->reada) > reada_for_search(root, path, level, 0, 0); > next = read_node_slot(root, next, 0); > - if (!next) > + if (!extent_buffer_uptodate(next)) > goto again; > } > return 0; > @@ -1263,7 +1263,7 @@ int cmd_restore(int argc, char **argv) > if (fs_location != 0) { > free_extent_buffer(root->node); > root->node = read_tree_block(root, fs_location, root->leafsize, 0); > - if (!root->node) { > + if (!extent_buffer_uptodate(root->node)) { > fprintf(stderr, "Failed to read fs location\n"); > ret = 1; > goto out; > diff --git a/ctree.c b/ctree.c > index 589efa3..130c61f 100644 > --- a/ctree.c > +++ b/ctree.c > @@ -677,7 +677,7 @@ static int balance_level(struct btrfs_trans_handle *trans, > > /* promote the child to a root */ > child = read_node_slot(root, mid, 0); > - BUG_ON(!child); > + BUG_ON(!extent_buffer_uptodate(child)); > ret = btrfs_cow_block(trans, root, child, mid, 0, &child); > BUG_ON(ret); > > @@ -701,7 +701,7 @@ static int balance_level(struct btrfs_trans_handle *trans, > return 0; > > left = read_node_slot(root, parent, pslot - 1); > - if (left) { > + if (extent_buffer_uptodate(left)) { > wret = btrfs_cow_block(trans, root, left, > parent, pslot - 1, &left); > if (wret) { > @@ -710,7 +710,7 @@ static int balance_level(struct btrfs_trans_handle *trans, > } > } > right = read_node_slot(root, parent, pslot + 1); > - if (right) { > + if (extent_buffer_uptodate(right)) { > wret = btrfs_cow_block(trans, root, right, > parent, pslot + 1, &right); > if (wret) { > @@ -864,7 +864,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans, > left = read_node_slot(root, parent, pslot - 1); > > /* first, try to make some room in the middle buffer */ > - if (left) { > + if (extent_buffer_uptodate(left)) { > u32 left_nr; > left_nr = btrfs_header_nritems(left); > if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { > @@ -907,7 +907,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans, > /* > * then try to empty the right most buffer into the middle > */ > - if (right) { > + if (extent_buffer_uptodate(right)) { > u32 right_nr; > right_nr = btrfs_header_nritems(right); > if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { > @@ -1651,6 +1651,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root > return 1; > > right = read_node_slot(root, upper, slot + 1); > + if (!extent_buffer_uptodate(right)) { > + if (IS_ERR(right)) > + return PTR_ERR(right); > + return -EIO; > + } > free_space = btrfs_leaf_free_space(root, right); > if (free_space < data_size) { > free_extent_buffer(right); > @@ -2770,6 +2775,11 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) > slot--; > > next = read_node_slot(root, c, slot); > + if (!extent_buffer_uptodate(next)) { > + if (IS_ERR(next)) > + return PTR_ERR(next); > + return -EIO; > + } > break; > } > path->slots[level] = slot; > @@ -2785,6 +2795,11 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) > if (!level) > break; > next = read_node_slot(root, next, slot); > + if (!extent_buffer_uptodate(next)) { > + if (IS_ERR(next)) > + return PTR_ERR(next); > + return -EIO; > + } > } > return 0; > } > @@ -2818,7 +2833,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path) > reada_for_search(root, path, level, slot, 0); > > next = read_node_slot(root, c, slot); > - if (!next) > + if (!extent_buffer_uptodate(next)) > return -EIO; > break; > } > @@ -2834,7 +2849,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path) > if (path->reada) > reada_for_search(root, path, level, 0, 0); > next = read_node_slot(root, next, 0); > - if (!next) > + if (!extent_buffer_uptodate(next)) > return -EIO; > } > return 0; > diff --git a/disk-io.c b/disk-io.c > index 521e1bd..a4d236f 100644 > --- a/disk-io.c > +++ b/disk-io.c > @@ -261,7 +261,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, > > eb = btrfs_find_create_tree_block(root, bytenr, blocksize); > if (!eb) > - return NULL; > + return ERR_PTR(-ENOMEM); > > if (btrfs_buffer_uptodate(eb, parent_transid)) > return eb; > @@ -286,6 +286,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, > printk("read block failed check_tree_block\n"); > else > printk("Csum didn't match\n"); > + ret = -EIO; > break; > } > num_copies = btrfs_num_copies(&root->fs_info->mapping_tree, > @@ -306,7 +307,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, > } > } > free_extent_buffer(eb); > - return NULL; > + return ERR_PTR(ret); > } > > int write_and_map_eb(struct btrfs_trans_handle *trans, > @@ -642,7 +643,7 @@ out: > blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); > root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), > blocksize, generation); > - if (!root->node) { > + if (!extent_buffer_uptodate(root->node)) { > free(root); > return ERR_PTR(-EIO); > } > @@ -1071,8 +1072,7 @@ int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info) > fs_info->chunk_root->node = read_tree_block(fs_info->chunk_root, > btrfs_super_chunk_root(sb), > blocksize, generation); > - if (!fs_info->chunk_root->node || > - !extent_buffer_uptodate(fs_info->chunk_root->node)) { > + if (!extent_buffer_uptodate(fs_info->chunk_root->node)) { > fprintf(stderr, "Couldn't read chunk root\n"); > return -EIO; > } > diff --git a/extent-tree.c b/extent-tree.c > index d614e7e..9eea55d 100644 > --- a/extent-tree.c > +++ b/extent-tree.c > @@ -2962,6 +2962,12 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans, > next = read_tree_block(root, bytenr, blocksize, > ptr_gen); > mutex_lock(&root->fs_info->fs_mutex); > + if (!extent_buffer_uptodate(next)) { > + if (IS_ERR(next)) > + ret = PTR_ERR(next); + else > + ret = -EIO; > + break; > + } > } > WARN_ON(*level <= 0); > if (path->nodes[*level-1]) > diff --git a/extent_io.c b/extent_io.c > index 9c982f9..3a8f96b 100644 > --- a/extent_io.c > +++ b/extent_io.c > @@ -845,9 +845,8 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, > > int extent_buffer_uptodate(struct extent_buffer *eb) > { > - if (!eb) > + if (!eb || IS_ERR(eb)) > return 0; > - > if (eb->flags & EXTENT_UPTODATE) > return 1; > return 0; > diff --git a/print-tree.c b/print-tree.c > index 70a7acc..3a7c13c 100644 > --- a/print-tree.c > +++ b/print-tree.c > @@ -1060,7 +1060,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol > btrfs_node_blockptr(eb, i), > size, > btrfs_node_ptr_generation(eb, i)); > - if (!next) { > + if (!extent_buffer_uptodate(next)) { > fprintf(stderr, "failed to read %llu in tree %llu\n", > (unsigned long long)btrfs_node_blockptr(eb, i), > (unsigned long long)btrfs_header_owner(eb)); > diff --git a/qgroup-verify.c b/qgroup-verify.c > index c98c751..f7a94bf 100644 > --- a/qgroup-verify.c > +++ b/qgroup-verify.c > @@ -513,7 +513,7 @@ static int travel_tree(struct btrfs_fs_info *info, struct btrfs_root *root, > // bytenr, num_bytes, ref_parent); > > eb = read_tree_block(root, bytenr, num_bytes, 0); > - if (!eb) > + if (!extent_buffer_uptodate(eb)) > return -EIO; > > ret = 0; > -- > 2.2.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
-------- Original Message -------- Subject: Re: [PATCH 1/2] btrfs-progs: read_tree_block() and read_node_slot() cleanup. From: Noah Massey <noah.massey@gmail.com> To: Qu Wenruo <quwenruo@cn.fujitsu.com> Date: 2015?01?28? 00:48 > On Mon, Jan 26, 2015 at 10:12 PM, Qu Wenruo <quwenruo@cn.fujitsu.com> wrote: >> Allow read_tree_block() and read_node_slot() to return error pointer. >> This should help caller to get more specified error number. >> >> For existing callers, change (!eb) judgmentt to >> (!extent_buffer_uptodate(eb)) to keep the compatibility, and for caller >> missing the check, use PTR_ERR(eb) if possible. >> >> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> >> [...snipped...] >> @@ -2962,6 +2962,12 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans, >> next = read_tree_block(root, bytenr, blocksize, >> ptr_gen); >> mutex_lock(&root->fs_info->fs_mutex); >> + if (!extent_buffer_uptodate(next)) { >> + if (IS_ERR(next)) >> + ret = PTR_ERR(next); > + else Oh, my fault. Thanks for pointing it out. Thanks, Qu > > >> + ret = -EIO; >> + break; >> + } >> } >> WARN_ON(*level <= 0); >> if (path->nodes[*level-1]) >> diff --git a/extent_io.c b/extent_io.c >> index 9c982f9..3a8f96b 100644 >> --- a/extent_io.c >> +++ b/extent_io.c >> @@ -845,9 +845,8 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, >> >> int extent_buffer_uptodate(struct extent_buffer *eb) >> { >> - if (!eb) >> + if (!eb || IS_ERR(eb)) >> return 0; >> - >> if (eb->flags & EXTENT_UPTODATE) >> return 1; >> return 0; >> diff --git a/print-tree.c b/print-tree.c >> index 70a7acc..3a7c13c 100644 >> --- a/print-tree.c >> +++ b/print-tree.c >> @@ -1060,7 +1060,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol >> btrfs_node_blockptr(eb, i), >> size, >> btrfs_node_ptr_generation(eb, i)); >> - if (!next) { >> + if (!extent_buffer_uptodate(next)) { >> fprintf(stderr, "failed to read %llu in tree %llu\n", >> (unsigned long long)btrfs_node_blockptr(eb, i), >> (unsigned long long)btrfs_header_owner(eb)); >> diff --git a/qgroup-verify.c b/qgroup-verify.c >> index c98c751..f7a94bf 100644 >> --- a/qgroup-verify.c >> +++ b/qgroup-verify.c >> @@ -513,7 +513,7 @@ static int travel_tree(struct btrfs_fs_info *info, struct btrfs_root *root, >> // bytenr, num_bytes, ref_parent); >> >> eb = read_tree_block(root, bytenr, num_bytes, 0); >> - if (!eb) >> + if (!extent_buffer_uptodate(eb)) >> return -EIO; >> >> ret = 0; >> -- >> 2.2.2 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/backref.c b/backref.c index 593f936..9a2efca 100644 --- a/backref.c +++ b/backref.c @@ -451,7 +451,7 @@ static int __add_missing_keys(struct btrfs_fs_info *fs_info, BUG_ON(!ref->wanted_disk_byte); eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte, fs_info->tree_root->leafsize, 0); - if (!eb || !extent_buffer_uptodate(eb)) { + if (!extent_buffer_uptodate(eb)) { free_extent_buffer(eb); return -EIO; } @@ -808,7 +808,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, ref->level); eb = read_tree_block(fs_info->extent_root, ref->parent, bsz, 0); - if (!eb || !extent_buffer_uptodate(eb)) { + if (!extent_buffer_uptodate(eb)) { free_extent_buffer(eb); ret = -EIO; goto out; diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c index 501111c..354f70d 100644 --- a/btrfs-calc-size.c +++ b/btrfs-calc-size.c @@ -159,7 +159,7 @@ static int walk_nodes(struct btrfs_root *root, struct btrfs_path *path, tmp = read_tree_block(root, cur_blocknr, btrfs_level_size(root, level - 1), btrfs_node_ptr_generation(b, i)); - if (!tmp) { + if (!extent_buffer_uptodate(tmp)) { fprintf(stderr, "Failed to read blocknr %Lu\n", btrfs_node_blockptr(b, i)); continue; diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c index b477e87..af03ad1 100644 --- a/btrfs-corrupt-block.c +++ b/btrfs-corrupt-block.c @@ -160,7 +160,7 @@ static int corrupt_keys_in_block(struct btrfs_root *root, u64 bytenr) struct extent_buffer *eb; eb = read_tree_block(root, bytenr, root->leafsize, 0); - if (!eb) + if (!extent_buffer_uptodate(eb)) return -EIO;; corrupt_keys(NULL, root, eb); @@ -288,7 +288,7 @@ static void btrfs_corrupt_extent_tree(struct btrfs_trans_handle *trans, next = read_tree_block(root, btrfs_node_blockptr(eb, i), root->leafsize, btrfs_node_ptr_generation(eb, i)); - if (!next) + if (!extent_buffer_uptodate(next)) continue; btrfs_corrupt_extent_tree(trans, root, next); free_extent_buffer(next); @@ -696,7 +696,7 @@ static int corrupt_metadata_block(struct btrfs_root *root, u64 block, } eb = read_tree_block(root, block, root->leafsize, 0); - if (!eb) { + if (!extent_buffer_uptodate(eb)) { fprintf(stderr, "Couldn't read in tree block %s\n", field); return -EINVAL; } diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c index 9cdb35f..3efd434 100644 --- a/btrfs-debug-tree.c +++ b/btrfs-debug-tree.c @@ -68,6 +68,8 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) btrfs_node_blockptr(eb, i), size, btrfs_node_ptr_generation(eb, i)); + if (!extent_buffer_uptodate(next)) + continue; if (btrfs_is_leaf(next) && btrfs_header_level(eb) != 1) BUG(); @@ -202,7 +204,8 @@ int main(int ac, char **av) block_only, root->leafsize, 0); - if (leaf && btrfs_header_level(leaf) != 0) { + if (extent_buffer_uptodate(leaf) && + btrfs_header_level(leaf) != 0) { free_extent_buffer(leaf); leaf = NULL; } @@ -212,7 +215,7 @@ int main(int ac, char **av) block_only, root->nodesize, 0); } - if (!leaf) { + if (!extent_buffer_uptodate(leaf)) { fprintf(stderr, "failed to read %llu\n", (unsigned long long)block_only); goto close_root; diff --git a/btrfs-image.c b/btrfs-image.c index cb17f16..667822c 100644 --- a/btrfs-image.c +++ b/btrfs-image.c @@ -910,7 +910,7 @@ static int flush_pending(struct metadump_struct *md, int done) while (!md->data && size > 0) { u64 this_read = min(blocksize, size); eb = read_tree_block(md->root, start, this_read, 0); - if (!eb) { + if (!extent_buffer_uptodate(eb)) { free(async->buffer); free(async); fprintf(stderr, @@ -1039,7 +1039,7 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb, ri = btrfs_item_ptr(eb, i, struct btrfs_root_item); bytenr = btrfs_disk_root_bytenr(eb, ri); tmp = read_tree_block(root, bytenr, root->leafsize, 0); - if (!tmp) { + if (!extent_buffer_uptodate(tmp)) { fprintf(stderr, "Error reading log root block\n"); return -EIO; @@ -1051,7 +1051,7 @@ static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb, } else { bytenr = btrfs_node_blockptr(eb, i); tmp = read_tree_block(root, bytenr, root->leafsize, 0); - if (!tmp) { + if (!extent_buffer_uptodate(tmp)) { fprintf(stderr, "Error reading log block\n"); return -EIO; } diff --git a/cmds-check.c b/cmds-check.c index bafa743..bbbf432 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -1759,7 +1759,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path, reada_walk_down(root, cur, path->slots[*level]); next = read_tree_block(root, bytenr, blocksize, ptr_gen); - if (!next) { + if (!extent_buffer_uptodate(next)) { struct btrfs_key node_key; btrfs_node_key_to_cpu(path->nodes[*level], @@ -8099,7 +8099,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info, */ tmp = read_tree_block(fs_info->extent_root, bytenr, leafsize, 0); - if (!tmp) { + if (!extent_buffer_uptodate(tmp)) { fprintf(stderr, "Error reading root block\n"); return -EIO; } @@ -8118,7 +8118,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info, tmp = read_tree_block(fs_info->extent_root, bytenr, leafsize, 0); - if (!tmp) { + if (!extent_buffer_uptodate(tmp)) { fprintf(stderr, "Error reading tree block\n"); return -EIO; } diff --git a/cmds-restore.c b/cmds-restore.c index 859deaf..efc2414 100644 --- a/cmds-restore.c +++ b/cmds-restore.c @@ -199,7 +199,7 @@ again: reada_for_search(root, path, level, slot, 0); next = read_node_slot(root, c, slot); - if (next) + if (extent_buffer_uptodate(next)) break; offset++; } @@ -215,7 +215,7 @@ again: if (path->reada) reada_for_search(root, path, level, 0, 0); next = read_node_slot(root, next, 0); - if (!next) + if (!extent_buffer_uptodate(next)) goto again; } return 0; @@ -1263,7 +1263,7 @@ int cmd_restore(int argc, char **argv) if (fs_location != 0) { free_extent_buffer(root->node); root->node = read_tree_block(root, fs_location, root->leafsize, 0); - if (!root->node) { + if (!extent_buffer_uptodate(root->node)) { fprintf(stderr, "Failed to read fs location\n"); ret = 1; goto out; diff --git a/ctree.c b/ctree.c index 589efa3..130c61f 100644 --- a/ctree.c +++ b/ctree.c @@ -677,7 +677,7 @@ static int balance_level(struct btrfs_trans_handle *trans, /* promote the child to a root */ child = read_node_slot(root, mid, 0); - BUG_ON(!child); + BUG_ON(!extent_buffer_uptodate(child)); ret = btrfs_cow_block(trans, root, child, mid, 0, &child); BUG_ON(ret); @@ -701,7 +701,7 @@ static int balance_level(struct btrfs_trans_handle *trans, return 0; left = read_node_slot(root, parent, pslot - 1); - if (left) { + if (extent_buffer_uptodate(left)) { wret = btrfs_cow_block(trans, root, left, parent, pslot - 1, &left); if (wret) { @@ -710,7 +710,7 @@ static int balance_level(struct btrfs_trans_handle *trans, } } right = read_node_slot(root, parent, pslot + 1); - if (right) { + if (extent_buffer_uptodate(right)) { wret = btrfs_cow_block(trans, root, right, parent, pslot + 1, &right); if (wret) { @@ -864,7 +864,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans, left = read_node_slot(root, parent, pslot - 1); /* first, try to make some room in the middle buffer */ - if (left) { + if (extent_buffer_uptodate(left)) { u32 left_nr; left_nr = btrfs_header_nritems(left); if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { @@ -907,7 +907,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans, /* * then try to empty the right most buffer into the middle */ - if (right) { + if (extent_buffer_uptodate(right)) { u32 right_nr; right_nr = btrfs_header_nritems(right); if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { @@ -1651,6 +1651,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root return 1; right = read_node_slot(root, upper, slot + 1); + if (!extent_buffer_uptodate(right)) { + if (IS_ERR(right)) + return PTR_ERR(right); + return -EIO; + } free_space = btrfs_leaf_free_space(root, right); if (free_space < data_size) { free_extent_buffer(right); @@ -2770,6 +2775,11 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) slot--; next = read_node_slot(root, c, slot); + if (!extent_buffer_uptodate(next)) { + if (IS_ERR(next)) + return PTR_ERR(next); + return -EIO; + } break; } path->slots[level] = slot; @@ -2785,6 +2795,11 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) if (!level) break; next = read_node_slot(root, next, slot); + if (!extent_buffer_uptodate(next)) { + if (IS_ERR(next)) + return PTR_ERR(next); + return -EIO; + } } return 0; } @@ -2818,7 +2833,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path) reada_for_search(root, path, level, slot, 0); next = read_node_slot(root, c, slot); - if (!next) + if (!extent_buffer_uptodate(next)) return -EIO; break; } @@ -2834,7 +2849,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path) if (path->reada) reada_for_search(root, path, level, 0, 0); next = read_node_slot(root, next, 0); - if (!next) + if (!extent_buffer_uptodate(next)) return -EIO; } return 0; diff --git a/disk-io.c b/disk-io.c index 521e1bd..a4d236f 100644 --- a/disk-io.c +++ b/disk-io.c @@ -261,7 +261,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, eb = btrfs_find_create_tree_block(root, bytenr, blocksize); if (!eb) - return NULL; + return ERR_PTR(-ENOMEM); if (btrfs_buffer_uptodate(eb, parent_transid)) return eb; @@ -286,6 +286,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, printk("read block failed check_tree_block\n"); else printk("Csum didn't match\n"); + ret = -EIO; break; } num_copies = btrfs_num_copies(&root->fs_info->mapping_tree, @@ -306,7 +307,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, } } free_extent_buffer(eb); - return NULL; + return ERR_PTR(ret); } int write_and_map_eb(struct btrfs_trans_handle *trans, @@ -642,7 +643,7 @@ out: blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), blocksize, generation); - if (!root->node) { + if (!extent_buffer_uptodate(root->node)) { free(root); return ERR_PTR(-EIO); } @@ -1071,8 +1072,7 @@ int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info) fs_info->chunk_root->node = read_tree_block(fs_info->chunk_root, btrfs_super_chunk_root(sb), blocksize, generation); - if (!fs_info->chunk_root->node || - !extent_buffer_uptodate(fs_info->chunk_root->node)) { + if (!extent_buffer_uptodate(fs_info->chunk_root->node)) { fprintf(stderr, "Couldn't read chunk root\n"); return -EIO; } diff --git a/extent-tree.c b/extent-tree.c index d614e7e..9eea55d 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -2962,6 +2962,12 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans, next = read_tree_block(root, bytenr, blocksize, ptr_gen); mutex_lock(&root->fs_info->fs_mutex); + if (!extent_buffer_uptodate(next)) { + if (IS_ERR(next)) + ret = PTR_ERR(next); + ret = -EIO; + break; + } } WARN_ON(*level <= 0); if (path->nodes[*level-1]) diff --git a/extent_io.c b/extent_io.c index 9c982f9..3a8f96b 100644 --- a/extent_io.c +++ b/extent_io.c @@ -845,9 +845,8 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, int extent_buffer_uptodate(struct extent_buffer *eb) { - if (!eb) + if (!eb || IS_ERR(eb)) return 0; - if (eb->flags & EXTENT_UPTODATE) return 1; return 0; diff --git a/print-tree.c b/print-tree.c index 70a7acc..3a7c13c 100644 --- a/print-tree.c +++ b/print-tree.c @@ -1060,7 +1060,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol btrfs_node_blockptr(eb, i), size, btrfs_node_ptr_generation(eb, i)); - if (!next) { + if (!extent_buffer_uptodate(next)) { fprintf(stderr, "failed to read %llu in tree %llu\n", (unsigned long long)btrfs_node_blockptr(eb, i), (unsigned long long)btrfs_header_owner(eb)); diff --git a/qgroup-verify.c b/qgroup-verify.c index c98c751..f7a94bf 100644 --- a/qgroup-verify.c +++ b/qgroup-verify.c @@ -513,7 +513,7 @@ static int travel_tree(struct btrfs_fs_info *info, struct btrfs_root *root, // bytenr, num_bytes, ref_parent); eb = read_tree_block(root, bytenr, num_bytes, 0); - if (!eb) + if (!extent_buffer_uptodate(eb)) return -EIO; ret = 0;
Allow read_tree_block() and read_node_slot() to return error pointer. This should help caller to get more specified error number. For existing callers, change (!eb) judgmentt to (!extent_buffer_uptodate(eb)) to keep the compatibility, and for caller missing the check, use PTR_ERR(eb) if possible. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> --- backref.c | 4 ++-- btrfs-calc-size.c | 2 +- btrfs-corrupt-block.c | 6 +++--- btrfs-debug-tree.c | 7 +++++-- btrfs-image.c | 6 +++--- cmds-check.c | 6 +++--- cmds-restore.c | 6 +++--- ctree.c | 29 ++++++++++++++++++++++------- disk-io.c | 10 +++++----- extent-tree.c | 6 ++++++ extent_io.c | 3 +-- print-tree.c | 2 +- qgroup-verify.c | 2 +- 13 files changed, 56 insertions(+), 33 deletions(-)