summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Brown <zab@zabbo.net>2014-08-27 11:16:03 -0700
committerDavid Sterba <dsterba@suse.cz>2014-09-14 13:19:44 +0200
commit977f2baf363b59d4263d870b292975e2b791cd07 (patch)
tree1af5eeb97359b8a0bd6a8d8238ae5e038fba3c19
parentcf8599c33803932b73e00a54785103030a37a4ee (diff)
btrfs-progs: kill BUG_ON in readahead_tree_block()
David sent a quick patch that removed a BUG_ON(). I took a peek and found that the function was already leaking an eb ref and only returned 0. So this fixes the leak and makes the function void and fixes up the callers. Accidentally-motivated-by: David Sterba <dsterba@suse.cz> Signed-off-by: Zach Brown <zab@zabbo.net> Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r--cmds-check.c5
-rw-r--r--disk-io.c25
-rw-r--r--disk-io.h4
3 files changed, 13 insertions, 21 deletions
diff --git a/cmds-check.c b/cmds-check.c
index 268e588f..d479361a 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -1287,7 +1287,6 @@ static void reada_walk_down(struct btrfs_root *root,
u32 nritems;
u32 blocksize;
int i;
- int ret;
int level;
level = btrfs_header_level(node);
@@ -1299,9 +1298,7 @@ static void reada_walk_down(struct btrfs_root *root,
for (i = slot; i < nritems; i++) {
bytenr = btrfs_node_blockptr(node, i);
ptr_gen = btrfs_node_ptr_generation(node, i);
- ret = readahead_tree_block(root, bytenr, blocksize, ptr_gen);
- if (ret)
- break;
+ readahead_tree_block(root, bytenr, blocksize, ptr_gen);
}
}
diff --git a/disk-io.c b/disk-io.c
index f71f5ca7..1f1ce75f 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -134,31 +134,26 @@ struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root,
blocksize);
}
-int readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize,
- u64 parent_transid)
+void readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize,
+ u64 parent_transid)
{
- int ret;
struct extent_buffer *eb;
u64 length;
struct btrfs_multi_bio *multi = NULL;
struct btrfs_device *device;
eb = btrfs_find_tree_block(root, bytenr, blocksize);
- if (eb && btrfs_buffer_uptodate(eb, parent_transid)) {
- free_extent_buffer(eb);
- return 0;
+ if (!(eb && btrfs_buffer_uptodate(eb, parent_transid)) &&
+ !btrfs_map_block(&root->fs_info->mapping_tree, READ,
+ bytenr, &length, &multi, 0, NULL)) {
+ device = multi->stripes[0].dev;
+ device->total_ios++;
+ blocksize = min(blocksize, (u32)(64 * 1024));
+ readahead(device->fd, multi->stripes[0].physical, blocksize);
}
- length = blocksize;
- ret = btrfs_map_block(&root->fs_info->mapping_tree, READ,
- bytenr, &length, &multi, 0, NULL);
- BUG_ON(ret);
- device = multi->stripes[0].dev;
- device->total_ios++;
- blocksize = min(blocksize, (u32)(64 * 1024));
- readahead(device->fd, multi->stripes[0].physical, blocksize);
+ free_extent_buffer(eb);
kfree(multi);
- return 0;
}
static int verify_parent_transid(struct extent_io_tree *io_tree,
diff --git a/disk-io.h b/disk-io.h
index 13d4420a..c2960558 100644
--- a/disk-io.h
+++ b/disk-io.h
@@ -48,8 +48,8 @@ struct btrfs_device;
int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirror);
struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
u32 blocksize, u64 parent_transid);
-int readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize,
- u64 parent_transid);
+void readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize,
+ u64 parent_transid);
struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root,
u64 bytenr, u32 blocksize);