diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 531e0a8645b0..1e74cf826532 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -1032,14 +1032,17 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
1032 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && | 1032 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && |
1033 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { | 1033 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { |
1034 | ret = btrfs_inc_ref(trans, root, buf, 1); | 1034 | ret = btrfs_inc_ref(trans, root, buf, 1); |
1035 | BUG_ON(ret); /* -ENOMEM */ | 1035 | if (ret) |
1036 | return ret; | ||
1036 | 1037 | ||
1037 | if (root->root_key.objectid == | 1038 | if (root->root_key.objectid == |
1038 | BTRFS_TREE_RELOC_OBJECTID) { | 1039 | BTRFS_TREE_RELOC_OBJECTID) { |
1039 | ret = btrfs_dec_ref(trans, root, buf, 0); | 1040 | ret = btrfs_dec_ref(trans, root, buf, 0); |
1040 | BUG_ON(ret); /* -ENOMEM */ | 1041 | if (ret) |
1042 | return ret; | ||
1041 | ret = btrfs_inc_ref(trans, root, cow, 1); | 1043 | ret = btrfs_inc_ref(trans, root, cow, 1); |
1042 | BUG_ON(ret); /* -ENOMEM */ | 1044 | if (ret) |
1045 | return ret; | ||
1043 | } | 1046 | } |
1044 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; | 1047 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; |
1045 | } else { | 1048 | } else { |
@@ -1049,7 +1052,8 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
1049 | ret = btrfs_inc_ref(trans, root, cow, 1); | 1052 | ret = btrfs_inc_ref(trans, root, cow, 1); |
1050 | else | 1053 | else |
1051 | ret = btrfs_inc_ref(trans, root, cow, 0); | 1054 | ret = btrfs_inc_ref(trans, root, cow, 0); |
1052 | BUG_ON(ret); /* -ENOMEM */ | 1055 | if (ret) |
1056 | return ret; | ||
1053 | } | 1057 | } |
1054 | if (new_flags != 0) { | 1058 | if (new_flags != 0) { |
1055 | int level = btrfs_header_level(buf); | 1059 | int level = btrfs_header_level(buf); |
@@ -1068,9 +1072,11 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
1068 | ret = btrfs_inc_ref(trans, root, cow, 1); | 1072 | ret = btrfs_inc_ref(trans, root, cow, 1); |
1069 | else | 1073 | else |
1070 | ret = btrfs_inc_ref(trans, root, cow, 0); | 1074 | ret = btrfs_inc_ref(trans, root, cow, 0); |
1071 | BUG_ON(ret); /* -ENOMEM */ | 1075 | if (ret) |
1076 | return ret; | ||
1072 | ret = btrfs_dec_ref(trans, root, buf, 1); | 1077 | ret = btrfs_dec_ref(trans, root, buf, 1); |
1073 | BUG_ON(ret); /* -ENOMEM */ | 1078 | if (ret) |
1079 | return ret; | ||
1074 | } | 1080 | } |
1075 | clean_tree_block(fs_info, buf); | 1081 | clean_tree_block(fs_info, buf); |
1076 | *last_ref = 1; | 1082 | *last_ref = 1; |