On Wed, Aug 27, 2014 at 07:47:45PM +0200, David Sterba wrote:
> Kill the BUG_ON.
> 
> Signed-off-by: David Sterba <dste...@suse.cz>
> ---
>  disk-io.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/disk-io.c b/disk-io.c
> index 8db0335bc81b..7ddd4b90836f 100644
> --- a/disk-io.c
> +++ b/disk-io.c
> @@ -152,7 +152,8 @@ int readahead_tree_block(struct btrfs_root *root, u64 
> bytenr, u32 blocksize,
>       length = blocksize;
>       ret = btrfs_map_block(&root->fs_info->mapping_tree, READ,
>                             bytenr, &length, &multi, 0, NULL);
> -     BUG_ON(ret);
> +     if (ret)
> +             return 0
>       device = multi->stripes[0].dev;
>       device->total_ios++;
>       blocksize = min(blocksize, (u32)(64 * 1024));

Seems like this is already leaking a refcount and only returns 0..  so
maybe remove the bug_on something like this totally untested patch?

There's another "#if 0"-ed out caller in extent-tree.c but that nonsense
should just be removed.

- z

commit 69a668994c70cc1fd86d1c349d272b1cbfde23b1
Author: Zach Brown <z...@zabbo.net>
Date:   Wed Aug 27 11:07:23 2014 -0700

    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 <dste...@suse.cz>
    Signed-off-by: Zach Brown <z...@zabbo.net>

diff --git a/cmds-check.c b/cmds-check.c
index 268e588..d479361 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 f71f5ca..1f1ce75 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 13d4420..c296055 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);
 
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to