diff options
author | Josef Bacik <jbacik@fusionio.com> | 2013-08-30 21:09:51 +0200 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-09-21 16:58:54 +0200 |
commit | 83d4cfd4da57b6ff16296875a962de2158799de6 (patch) | |
tree | 4137d0e5d3a72243303a3cee5107f3db57963b7f /fs/btrfs/ctree.c | |
parent | Merge tag 'v3.11' into for-linus (diff) | |
download | linux-83d4cfd4da57b6ff16296875a962de2158799de6.tar.xz linux-83d4cfd4da57b6ff16296875a962de2158799de6.zip |
Btrfs: fixup error handling in btrfs_reloc_cow
If we failed to actually allocate the correct size of the extent to relocate we
will end up in an infinite loop because we won't return an error, we'll just
move on to the next extent. So fix this up by returning an error, and then fix
all the callers to return an error up the stack rather than BUG_ON()'ing.
Thanks,
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 64346721173f..61b5bcd57b7e 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -1005,8 +1005,11 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, return ret; } - if (root->ref_cows) - btrfs_reloc_cow_block(trans, root, buf, cow); + if (root->ref_cows) { + ret = btrfs_reloc_cow_block(trans, root, buf, cow); + if (ret) + return ret; + } if (buf == root->node) { WARN_ON(parent && parent != buf); |