diff options
author | Chris Mason <chris.mason@oracle.com> | 2012-03-28 20:31:37 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2012-03-28 20:31:37 -0400 |
commit | 1d4284bd6e8d7dd1d5521a6747bdb6dc1caf0225 (patch) | |
tree | a7dde6312ec24eb6368cad7a3efedbf368a5a70c /fs/btrfs/ctree.c | |
parent | b5d67f64f9bc656970dacba245410f0faedad18e (diff) | |
parent | 65139ed99234d8505948cdb7a835452eb5c191f9 (diff) |
Merge branch 'error-handling' into for-linus
Conflicts:
fs/btrfs/ctree.c
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/inode.c
fs/btrfs/scrub.c
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 250 |
1 files changed, 102 insertions, 148 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 270655da11d1..e801f226d7e0 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -36,7 +36,7 @@ static int balance_node_right(struct btrfs_trans_handle *trans, | |||
36 | struct btrfs_root *root, | 36 | struct btrfs_root *root, |
37 | struct extent_buffer *dst_buf, | 37 | struct extent_buffer *dst_buf, |
38 | struct extent_buffer *src_buf); | 38 | struct extent_buffer *src_buf); |
39 | static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 39 | static void del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
40 | struct btrfs_path *path, int level, int slot); | 40 | struct btrfs_path *path, int level, int slot); |
41 | 41 | ||
42 | struct btrfs_path *btrfs_alloc_path(void) | 42 | struct btrfs_path *btrfs_alloc_path(void) |
@@ -344,8 +344,13 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
344 | if (btrfs_block_can_be_shared(root, buf)) { | 344 | if (btrfs_block_can_be_shared(root, buf)) { |
345 | ret = btrfs_lookup_extent_info(trans, root, buf->start, | 345 | ret = btrfs_lookup_extent_info(trans, root, buf->start, |
346 | buf->len, &refs, &flags); | 346 | buf->len, &refs, &flags); |
347 | BUG_ON(ret); | 347 | if (ret) |
348 | BUG_ON(refs == 0); | 348 | return ret; |
349 | if (refs == 0) { | ||
350 | ret = -EROFS; | ||
351 | btrfs_std_error(root->fs_info, ret); | ||
352 | return ret; | ||
353 | } | ||
349 | } else { | 354 | } else { |
350 | refs = 1; | 355 | refs = 1; |
351 | if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || | 356 | if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || |
@@ -364,14 +369,14 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
364 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && | 369 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && |
365 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { | 370 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { |
366 | ret = btrfs_inc_ref(trans, root, buf, 1, 1); | 371 | ret = btrfs_inc_ref(trans, root, buf, 1, 1); |
367 | BUG_ON(ret); | 372 | BUG_ON(ret); /* -ENOMEM */ |
368 | 373 | ||
369 | if (root->root_key.objectid == | 374 | if (root->root_key.objectid == |
370 | BTRFS_TREE_RELOC_OBJECTID) { | 375 | BTRFS_TREE_RELOC_OBJECTID) { |
371 | ret = btrfs_dec_ref(trans, root, buf, 0, 1); | 376 | ret = btrfs_dec_ref(trans, root, buf, 0, 1); |
372 | BUG_ON(ret); | 377 | BUG_ON(ret); /* -ENOMEM */ |
373 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 378 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
374 | BUG_ON(ret); | 379 | BUG_ON(ret); /* -ENOMEM */ |
375 | } | 380 | } |
376 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; | 381 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; |
377 | } else { | 382 | } else { |
@@ -381,14 +386,15 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
381 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 386 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
382 | else | 387 | else |
383 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 388 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); |
384 | BUG_ON(ret); | 389 | BUG_ON(ret); /* -ENOMEM */ |
385 | } | 390 | } |
386 | if (new_flags != 0) { | 391 | if (new_flags != 0) { |
387 | ret = btrfs_set_disk_extent_flags(trans, root, | 392 | ret = btrfs_set_disk_extent_flags(trans, root, |
388 | buf->start, | 393 | buf->start, |
389 | buf->len, | 394 | buf->len, |
390 | new_flags, 0); | 395 | new_flags, 0); |
391 | BUG_ON(ret); | 396 | if (ret) |
397 | return ret; | ||
392 | } | 398 | } |
393 | } else { | 399 | } else { |
394 | if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) { | 400 | if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) { |
@@ -397,9 +403,9 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
397 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 403 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
398 | else | 404 | else |
399 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 405 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); |
400 | BUG_ON(ret); | 406 | BUG_ON(ret); /* -ENOMEM */ |
401 | ret = btrfs_dec_ref(trans, root, buf, 1, 1); | 407 | ret = btrfs_dec_ref(trans, root, buf, 1, 1); |
402 | BUG_ON(ret); | 408 | BUG_ON(ret); /* -ENOMEM */ |
403 | } | 409 | } |
404 | clean_tree_block(trans, root, buf); | 410 | clean_tree_block(trans, root, buf); |
405 | *last_ref = 1; | 411 | *last_ref = 1; |
@@ -428,7 +434,7 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
428 | { | 434 | { |
429 | struct btrfs_disk_key disk_key; | 435 | struct btrfs_disk_key disk_key; |
430 | struct extent_buffer *cow; | 436 | struct extent_buffer *cow; |
431 | int level; | 437 | int level, ret; |
432 | int last_ref = 0; | 438 | int last_ref = 0; |
433 | int unlock_orig = 0; | 439 | int unlock_orig = 0; |
434 | u64 parent_start; | 440 | u64 parent_start; |
@@ -480,7 +486,11 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
480 | (unsigned long)btrfs_header_fsid(cow), | 486 | (unsigned long)btrfs_header_fsid(cow), |
481 | BTRFS_FSID_SIZE); | 487 | BTRFS_FSID_SIZE); |
482 | 488 | ||
483 | update_ref_for_cow(trans, root, buf, cow, &last_ref); | 489 | ret = update_ref_for_cow(trans, root, buf, cow, &last_ref); |
490 | if (ret) { | ||
491 | btrfs_abort_transaction(trans, root, ret); | ||
492 | return ret; | ||
493 | } | ||
484 | 494 | ||
485 | if (root->ref_cows) | 495 | if (root->ref_cows) |
486 | btrfs_reloc_cow_block(trans, root, buf, cow); | 496 | btrfs_reloc_cow_block(trans, root, buf, cow); |
@@ -947,7 +957,12 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
947 | 957 | ||
948 | /* promote the child to a root */ | 958 | /* promote the child to a root */ |
949 | child = read_node_slot(root, mid, 0); | 959 | child = read_node_slot(root, mid, 0); |
950 | BUG_ON(!child); | 960 | if (!child) { |
961 | ret = -EROFS; | ||
962 | btrfs_std_error(root->fs_info, ret); | ||
963 | goto enospc; | ||
964 | } | ||
965 | |||
951 | btrfs_tree_lock(child); | 966 | btrfs_tree_lock(child); |
952 | btrfs_set_lock_blocking(child); | 967 | btrfs_set_lock_blocking(child); |
953 | ret = btrfs_cow_block(trans, root, child, mid, 0, &child); | 968 | ret = btrfs_cow_block(trans, root, child, mid, 0, &child); |
@@ -1023,10 +1038,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1023 | if (btrfs_header_nritems(right) == 0) { | 1038 | if (btrfs_header_nritems(right) == 0) { |
1024 | clean_tree_block(trans, root, right); | 1039 | clean_tree_block(trans, root, right); |
1025 | btrfs_tree_unlock(right); | 1040 | btrfs_tree_unlock(right); |
1026 | wret = del_ptr(trans, root, path, level + 1, pslot + | 1041 | del_ptr(trans, root, path, level + 1, pslot + 1); |
1027 | 1); | ||
1028 | if (wret) | ||
1029 | ret = wret; | ||
1030 | root_sub_used(root, right->len); | 1042 | root_sub_used(root, right->len); |
1031 | btrfs_free_tree_block(trans, root, right, 0, 1, 0); | 1043 | btrfs_free_tree_block(trans, root, right, 0, 1, 0); |
1032 | free_extent_buffer_stale(right); | 1044 | free_extent_buffer_stale(right); |
@@ -1048,7 +1060,11 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1048 | * otherwise we would have pulled some pointers from the | 1060 | * otherwise we would have pulled some pointers from the |
1049 | * right | 1061 | * right |
1050 | */ | 1062 | */ |
1051 | BUG_ON(!left); | 1063 | if (!left) { |
1064 | ret = -EROFS; | ||
1065 | btrfs_std_error(root->fs_info, ret); | ||
1066 | goto enospc; | ||
1067 | } | ||
1052 | wret = balance_node_right(trans, root, mid, left); | 1068 | wret = balance_node_right(trans, root, mid, left); |
1053 | if (wret < 0) { | 1069 | if (wret < 0) { |
1054 | ret = wret; | 1070 | ret = wret; |
@@ -1064,9 +1080,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1064 | if (btrfs_header_nritems(mid) == 0) { | 1080 | if (btrfs_header_nritems(mid) == 0) { |
1065 | clean_tree_block(trans, root, mid); | 1081 | clean_tree_block(trans, root, mid); |
1066 | btrfs_tree_unlock(mid); | 1082 | btrfs_tree_unlock(mid); |
1067 | wret = del_ptr(trans, root, path, level + 1, pslot); | 1083 | del_ptr(trans, root, path, level + 1, pslot); |
1068 | if (wret) | ||
1069 | ret = wret; | ||
1070 | root_sub_used(root, mid->len); | 1084 | root_sub_used(root, mid->len); |
1071 | btrfs_free_tree_block(trans, root, mid, 0, 1, 0); | 1085 | btrfs_free_tree_block(trans, root, mid, 0, 1, 0); |
1072 | free_extent_buffer_stale(mid); | 1086 | free_extent_buffer_stale(mid); |
@@ -1905,15 +1919,12 @@ done: | |||
1905 | * fixing up pointers when a given leaf/node is not in slot 0 of the | 1919 | * fixing up pointers when a given leaf/node is not in slot 0 of the |
1906 | * higher levels | 1920 | * higher levels |
1907 | * | 1921 | * |
1908 | * If this fails to write a tree block, it returns -1, but continues | ||
1909 | * fixing up the blocks in ram so the tree is consistent. | ||
1910 | */ | 1922 | */ |
1911 | static int fixup_low_keys(struct btrfs_trans_handle *trans, | 1923 | static void fixup_low_keys(struct btrfs_trans_handle *trans, |
1912 | struct btrfs_root *root, struct btrfs_path *path, | 1924 | struct btrfs_root *root, struct btrfs_path *path, |
1913 | struct btrfs_disk_key *key, int level) | 1925 | struct btrfs_disk_key *key, int level) |
1914 | { | 1926 | { |
1915 | int i; | 1927 | int i; |
1916 | int ret = 0; | ||
1917 | struct extent_buffer *t; | 1928 | struct extent_buffer *t; |
1918 | 1929 | ||
1919 | for (i = level; i < BTRFS_MAX_LEVEL; i++) { | 1930 | for (i = level; i < BTRFS_MAX_LEVEL; i++) { |
@@ -1926,7 +1937,6 @@ static int fixup_low_keys(struct btrfs_trans_handle *trans, | |||
1926 | if (tslot != 0) | 1937 | if (tslot != 0) |
1927 | break; | 1938 | break; |
1928 | } | 1939 | } |
1929 | return ret; | ||
1930 | } | 1940 | } |
1931 | 1941 | ||
1932 | /* | 1942 | /* |
@@ -1935,9 +1945,9 @@ static int fixup_low_keys(struct btrfs_trans_handle *trans, | |||
1935 | * This function isn't completely safe. It's the caller's responsibility | 1945 | * This function isn't completely safe. It's the caller's responsibility |
1936 | * that the new key won't break the order | 1946 | * that the new key won't break the order |
1937 | */ | 1947 | */ |
1938 | int btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, | 1948 | void btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, |
1939 | struct btrfs_root *root, struct btrfs_path *path, | 1949 | struct btrfs_root *root, struct btrfs_path *path, |
1940 | struct btrfs_key *new_key) | 1950 | struct btrfs_key *new_key) |
1941 | { | 1951 | { |
1942 | struct btrfs_disk_key disk_key; | 1952 | struct btrfs_disk_key disk_key; |
1943 | struct extent_buffer *eb; | 1953 | struct extent_buffer *eb; |
@@ -1947,13 +1957,11 @@ int btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, | |||
1947 | slot = path->slots[0]; | 1957 | slot = path->slots[0]; |
1948 | if (slot > 0) { | 1958 | if (slot > 0) { |
1949 | btrfs_item_key(eb, &disk_key, slot - 1); | 1959 | btrfs_item_key(eb, &disk_key, slot - 1); |
1950 | if (comp_keys(&disk_key, new_key) >= 0) | 1960 | BUG_ON(comp_keys(&disk_key, new_key) >= 0); |
1951 | return -1; | ||
1952 | } | 1961 | } |
1953 | if (slot < btrfs_header_nritems(eb) - 1) { | 1962 | if (slot < btrfs_header_nritems(eb) - 1) { |
1954 | btrfs_item_key(eb, &disk_key, slot + 1); | 1963 | btrfs_item_key(eb, &disk_key, slot + 1); |
1955 | if (comp_keys(&disk_key, new_key) <= 0) | 1964 | BUG_ON(comp_keys(&disk_key, new_key) <= 0); |
1956 | return -1; | ||
1957 | } | 1965 | } |
1958 | 1966 | ||
1959 | btrfs_cpu_key_to_disk(&disk_key, new_key); | 1967 | btrfs_cpu_key_to_disk(&disk_key, new_key); |
@@ -1961,7 +1969,6 @@ int btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, | |||
1961 | btrfs_mark_buffer_dirty(eb); | 1969 | btrfs_mark_buffer_dirty(eb); |
1962 | if (slot == 0) | 1970 | if (slot == 0) |
1963 | fixup_low_keys(trans, root, path, &disk_key, 1); | 1971 | fixup_low_keys(trans, root, path, &disk_key, 1); |
1964 | return 0; | ||
1965 | } | 1972 | } |
1966 | 1973 | ||
1967 | /* | 1974 | /* |
@@ -2164,12 +2171,11 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans, | |||
2164 | * | 2171 | * |
2165 | * slot and level indicate where you want the key to go, and | 2172 | * slot and level indicate where you want the key to go, and |
2166 | * blocknr is the block the key points to. | 2173 | * blocknr is the block the key points to. |
2167 | * | ||
2168 | * returns zero on success and < 0 on any error | ||
2169 | */ | 2174 | */ |
2170 | static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root | 2175 | static void insert_ptr(struct btrfs_trans_handle *trans, |
2171 | *root, struct btrfs_path *path, struct btrfs_disk_key | 2176 | struct btrfs_root *root, struct btrfs_path *path, |
2172 | *key, u64 bytenr, int slot, int level) | 2177 | struct btrfs_disk_key *key, u64 bytenr, |
2178 | int slot, int level) | ||
2173 | { | 2179 | { |
2174 | struct extent_buffer *lower; | 2180 | struct extent_buffer *lower; |
2175 | int nritems; | 2181 | int nritems; |
@@ -2179,8 +2185,7 @@ static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root | |||
2179 | lower = path->nodes[level]; | 2185 | lower = path->nodes[level]; |
2180 | nritems = btrfs_header_nritems(lower); | 2186 | nritems = btrfs_header_nritems(lower); |
2181 | BUG_ON(slot > nritems); | 2187 | BUG_ON(slot > nritems); |
2182 | if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root)) | 2188 | BUG_ON(nritems == BTRFS_NODEPTRS_PER_BLOCK(root)); |
2183 | BUG(); | ||
2184 | if (slot != nritems) { | 2189 | if (slot != nritems) { |
2185 | memmove_extent_buffer(lower, | 2190 | memmove_extent_buffer(lower, |
2186 | btrfs_node_key_ptr_offset(slot + 1), | 2191 | btrfs_node_key_ptr_offset(slot + 1), |
@@ -2193,7 +2198,6 @@ static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root | |||
2193 | btrfs_set_node_ptr_generation(lower, slot, trans->transid); | 2198 | btrfs_set_node_ptr_generation(lower, slot, trans->transid); |
2194 | btrfs_set_header_nritems(lower, nritems + 1); | 2199 | btrfs_set_header_nritems(lower, nritems + 1); |
2195 | btrfs_mark_buffer_dirty(lower); | 2200 | btrfs_mark_buffer_dirty(lower); |
2196 | return 0; | ||
2197 | } | 2201 | } |
2198 | 2202 | ||
2199 | /* | 2203 | /* |
@@ -2214,7 +2218,6 @@ static noinline int split_node(struct btrfs_trans_handle *trans, | |||
2214 | struct btrfs_disk_key disk_key; | 2218 | struct btrfs_disk_key disk_key; |
2215 | int mid; | 2219 | int mid; |
2216 | int ret; | 2220 | int ret; |
2217 | int wret; | ||
2218 | u32 c_nritems; | 2221 | u32 c_nritems; |
2219 | 2222 | ||
2220 | c = path->nodes[level]; | 2223 | c = path->nodes[level]; |
@@ -2271,11 +2274,8 @@ static noinline int split_node(struct btrfs_trans_handle *trans, | |||
2271 | btrfs_mark_buffer_dirty(c); | 2274 | btrfs_mark_buffer_dirty(c); |
2272 | btrfs_mark_buffer_dirty(split); | 2275 | btrfs_mark_buffer_dirty(split); |
2273 | 2276 | ||
2274 | wret = insert_ptr(trans, root, path, &disk_key, split->start, | 2277 | insert_ptr(trans, root, path, &disk_key, split->start, |
2275 | path->slots[level + 1] + 1, | 2278 | path->slots[level + 1] + 1, level + 1); |
2276 | level + 1); | ||
2277 | if (wret) | ||
2278 | ret = wret; | ||
2279 | 2279 | ||
2280 | if (path->slots[level] >= mid) { | 2280 | if (path->slots[level] >= mid) { |
2281 | path->slots[level] -= mid; | 2281 | path->slots[level] -= mid; |
@@ -2564,7 +2564,6 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2564 | u32 old_left_nritems; | 2564 | u32 old_left_nritems; |
2565 | u32 nr; | 2565 | u32 nr; |
2566 | int ret = 0; | 2566 | int ret = 0; |
2567 | int wret; | ||
2568 | u32 this_item_size; | 2567 | u32 this_item_size; |
2569 | u32 old_left_item_size; | 2568 | u32 old_left_item_size; |
2570 | struct btrfs_map_token token; | 2569 | struct btrfs_map_token token; |
@@ -2675,9 +2674,7 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2675 | clean_tree_block(trans, root, right); | 2674 | clean_tree_block(trans, root, right); |
2676 | 2675 | ||
2677 | btrfs_item_key(right, &disk_key, 0); | 2676 | btrfs_item_key(right, &disk_key, 0); |
2678 | wret = fixup_low_keys(trans, root, path, &disk_key, 1); | 2677 | fixup_low_keys(trans, root, path, &disk_key, 1); |
2679 | if (wret) | ||
2680 | ret = wret; | ||
2681 | 2678 | ||
2682 | /* then fixup the leaf pointer in the path */ | 2679 | /* then fixup the leaf pointer in the path */ |
2683 | if (path->slots[0] < push_items) { | 2680 | if (path->slots[0] < push_items) { |
@@ -2748,7 +2745,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root | |||
2748 | path->nodes[1], slot - 1, &left); | 2745 | path->nodes[1], slot - 1, &left); |
2749 | if (ret) { | 2746 | if (ret) { |
2750 | /* we hit -ENOSPC, but it isn't fatal here */ | 2747 | /* we hit -ENOSPC, but it isn't fatal here */ |
2751 | ret = 1; | 2748 | if (ret == -ENOSPC) |
2749 | ret = 1; | ||
2752 | goto out; | 2750 | goto out; |
2753 | } | 2751 | } |
2754 | 2752 | ||
@@ -2770,21 +2768,17 @@ out: | |||
2770 | /* | 2768 | /* |
2771 | * split the path's leaf in two, making sure there is at least data_size | 2769 | * split the path's leaf in two, making sure there is at least data_size |
2772 | * available for the resulting leaf level of the path. | 2770 | * available for the resulting leaf level of the path. |
2773 | * | ||
2774 | * returns 0 if all went well and < 0 on failure. | ||
2775 | */ | 2771 | */ |
2776 | static noinline int copy_for_split(struct btrfs_trans_handle *trans, | 2772 | static noinline void copy_for_split(struct btrfs_trans_handle *trans, |
2777 | struct btrfs_root *root, | 2773 | struct btrfs_root *root, |
2778 | struct btrfs_path *path, | 2774 | struct btrfs_path *path, |
2779 | struct extent_buffer *l, | 2775 | struct extent_buffer *l, |
2780 | struct extent_buffer *right, | 2776 | struct extent_buffer *right, |
2781 | int slot, int mid, int nritems) | 2777 | int slot, int mid, int nritems) |
2782 | { | 2778 | { |
2783 | int data_copy_size; | 2779 | int data_copy_size; |
2784 | int rt_data_off; | 2780 | int rt_data_off; |
2785 | int i; | 2781 | int i; |
2786 | int ret = 0; | ||
2787 | int wret; | ||
2788 | struct btrfs_disk_key disk_key; | 2782 | struct btrfs_disk_key disk_key; |
2789 | struct btrfs_map_token token; | 2783 | struct btrfs_map_token token; |
2790 | 2784 | ||
@@ -2816,12 +2810,9 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
2816 | } | 2810 | } |
2817 | 2811 | ||
2818 | btrfs_set_header_nritems(l, mid); | 2812 | btrfs_set_header_nritems(l, mid); |
2819 | ret = 0; | ||
2820 | btrfs_item_key(right, &disk_key, 0); | 2813 | btrfs_item_key(right, &disk_key, 0); |
2821 | wret = insert_ptr(trans, root, path, &disk_key, right->start, | 2814 | insert_ptr(trans, root, path, &disk_key, right->start, |
2822 | path->slots[1] + 1, 1); | 2815 | path->slots[1] + 1, 1); |
2823 | if (wret) | ||
2824 | ret = wret; | ||
2825 | 2816 | ||
2826 | btrfs_mark_buffer_dirty(right); | 2817 | btrfs_mark_buffer_dirty(right); |
2827 | btrfs_mark_buffer_dirty(l); | 2818 | btrfs_mark_buffer_dirty(l); |
@@ -2839,8 +2830,6 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
2839 | } | 2830 | } |
2840 | 2831 | ||
2841 | BUG_ON(path->slots[0] < 0); | 2832 | BUG_ON(path->slots[0] < 0); |
2842 | |||
2843 | return ret; | ||
2844 | } | 2833 | } |
2845 | 2834 | ||
2846 | /* | 2835 | /* |
@@ -3029,12 +3018,8 @@ again: | |||
3029 | if (split == 0) { | 3018 | if (split == 0) { |
3030 | if (mid <= slot) { | 3019 | if (mid <= slot) { |
3031 | btrfs_set_header_nritems(right, 0); | 3020 | btrfs_set_header_nritems(right, 0); |
3032 | wret = insert_ptr(trans, root, path, | 3021 | insert_ptr(trans, root, path, &disk_key, right->start, |
3033 | &disk_key, right->start, | 3022 | path->slots[1] + 1, 1); |
3034 | path->slots[1] + 1, 1); | ||
3035 | if (wret) | ||
3036 | ret = wret; | ||
3037 | |||
3038 | btrfs_tree_unlock(path->nodes[0]); | 3023 | btrfs_tree_unlock(path->nodes[0]); |
3039 | free_extent_buffer(path->nodes[0]); | 3024 | free_extent_buffer(path->nodes[0]); |
3040 | path->nodes[0] = right; | 3025 | path->nodes[0] = right; |
@@ -3042,29 +3027,21 @@ again: | |||
3042 | path->slots[1] += 1; | 3027 | path->slots[1] += 1; |
3043 | } else { | 3028 | } else { |
3044 | btrfs_set_header_nritems(right, 0); | 3029 | btrfs_set_header_nritems(right, 0); |
3045 | wret = insert_ptr(trans, root, path, | 3030 | insert_ptr(trans, root, path, &disk_key, right->start, |
3046 | &disk_key, | ||
3047 | right->start, | ||
3048 | path->slots[1], 1); | 3031 | path->slots[1], 1); |
3049 | if (wret) | ||
3050 | ret = wret; | ||
3051 | btrfs_tree_unlock(path->nodes[0]); | 3032 | btrfs_tree_unlock(path->nodes[0]); |
3052 | free_extent_buffer(path->nodes[0]); | 3033 | free_extent_buffer(path->nodes[0]); |
3053 | path->nodes[0] = right; | 3034 | path->nodes[0] = right; |
3054 | path->slots[0] = 0; | 3035 | path->slots[0] = 0; |
3055 | if (path->slots[1] == 0) { | 3036 | if (path->slots[1] == 0) |
3056 | wret = fixup_low_keys(trans, root, | 3037 | fixup_low_keys(trans, root, path, |
3057 | path, &disk_key, 1); | 3038 | &disk_key, 1); |
3058 | if (wret) | ||
3059 | ret = wret; | ||
3060 | } | ||
3061 | } | 3039 | } |
3062 | btrfs_mark_buffer_dirty(right); | 3040 | btrfs_mark_buffer_dirty(right); |
3063 | return ret; | 3041 | return ret; |
3064 | } | 3042 | } |
3065 | 3043 | ||
3066 | ret = copy_for_split(trans, root, path, l, right, slot, mid, nritems); | 3044 | copy_for_split(trans, root, path, l, right, slot, mid, nritems); |
3067 | BUG_ON(ret); | ||
3068 | 3045 | ||
3069 | if (split == 2) { | 3046 | if (split == 2) { |
3070 | BUG_ON(num_doubles != 0); | 3047 | BUG_ON(num_doubles != 0); |
@@ -3072,7 +3049,7 @@ again: | |||
3072 | goto again; | 3049 | goto again; |
3073 | } | 3050 | } |
3074 | 3051 | ||
3075 | return ret; | 3052 | return 0; |
3076 | 3053 | ||
3077 | push_for_double: | 3054 | push_for_double: |
3078 | push_for_double_split(trans, root, path, data_size); | 3055 | push_for_double_split(trans, root, path, data_size); |
@@ -3274,11 +3251,9 @@ int btrfs_duplicate_item(struct btrfs_trans_handle *trans, | |||
3274 | return ret; | 3251 | return ret; |
3275 | 3252 | ||
3276 | path->slots[0]++; | 3253 | path->slots[0]++; |
3277 | ret = setup_items_for_insert(trans, root, path, new_key, &item_size, | 3254 | setup_items_for_insert(trans, root, path, new_key, &item_size, |
3278 | item_size, item_size + | 3255 | item_size, item_size + |
3279 | sizeof(struct btrfs_item), 1); | 3256 | sizeof(struct btrfs_item), 1); |
3280 | BUG_ON(ret); | ||
3281 | |||
3282 | leaf = path->nodes[0]; | 3257 | leaf = path->nodes[0]; |
3283 | memcpy_extent_buffer(leaf, | 3258 | memcpy_extent_buffer(leaf, |
3284 | btrfs_item_ptr_offset(leaf, path->slots[0]), | 3259 | btrfs_item_ptr_offset(leaf, path->slots[0]), |
@@ -3293,10 +3268,10 @@ int btrfs_duplicate_item(struct btrfs_trans_handle *trans, | |||
3293 | * off the end of the item or if we shift the item to chop bytes off | 3268 | * off the end of the item or if we shift the item to chop bytes off |
3294 | * the front. | 3269 | * the front. |
3295 | */ | 3270 | */ |
3296 | int btrfs_truncate_item(struct btrfs_trans_handle *trans, | 3271 | void btrfs_truncate_item(struct btrfs_trans_handle *trans, |
3297 | struct btrfs_root *root, | 3272 | struct btrfs_root *root, |
3298 | struct btrfs_path *path, | 3273 | struct btrfs_path *path, |
3299 | u32 new_size, int from_end) | 3274 | u32 new_size, int from_end) |
3300 | { | 3275 | { |
3301 | int slot; | 3276 | int slot; |
3302 | struct extent_buffer *leaf; | 3277 | struct extent_buffer *leaf; |
@@ -3316,7 +3291,7 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3316 | 3291 | ||
3317 | old_size = btrfs_item_size_nr(leaf, slot); | 3292 | old_size = btrfs_item_size_nr(leaf, slot); |
3318 | if (old_size == new_size) | 3293 | if (old_size == new_size) |
3319 | return 0; | 3294 | return; |
3320 | 3295 | ||
3321 | nritems = btrfs_header_nritems(leaf); | 3296 | nritems = btrfs_header_nritems(leaf); |
3322 | data_end = leaf_data_end(root, leaf); | 3297 | data_end = leaf_data_end(root, leaf); |
@@ -3390,15 +3365,14 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3390 | btrfs_print_leaf(root, leaf); | 3365 | btrfs_print_leaf(root, leaf); |
3391 | BUG(); | 3366 | BUG(); |
3392 | } | 3367 | } |
3393 | return 0; | ||
3394 | } | 3368 | } |
3395 | 3369 | ||
3396 | /* | 3370 | /* |
3397 | * make the item pointed to by the path bigger, data_size is the new size. | 3371 | * make the item pointed to by the path bigger, data_size is the new size. |
3398 | */ | 3372 | */ |
3399 | int btrfs_extend_item(struct btrfs_trans_handle *trans, | 3373 | void btrfs_extend_item(struct btrfs_trans_handle *trans, |
3400 | struct btrfs_root *root, struct btrfs_path *path, | 3374 | struct btrfs_root *root, struct btrfs_path *path, |
3401 | u32 data_size) | 3375 | u32 data_size) |
3402 | { | 3376 | { |
3403 | int slot; | 3377 | int slot; |
3404 | struct extent_buffer *leaf; | 3378 | struct extent_buffer *leaf; |
@@ -3460,7 +3434,6 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3460 | btrfs_print_leaf(root, leaf); | 3434 | btrfs_print_leaf(root, leaf); |
3461 | BUG(); | 3435 | BUG(); |
3462 | } | 3436 | } |
3463 | return 0; | ||
3464 | } | 3437 | } |
3465 | 3438 | ||
3466 | /* | 3439 | /* |
@@ -3593,7 +3566,7 @@ int btrfs_insert_some_items(struct btrfs_trans_handle *trans, | |||
3593 | ret = 0; | 3566 | ret = 0; |
3594 | if (slot == 0) { | 3567 | if (slot == 0) { |
3595 | btrfs_cpu_key_to_disk(&disk_key, cpu_key); | 3568 | btrfs_cpu_key_to_disk(&disk_key, cpu_key); |
3596 | ret = fixup_low_keys(trans, root, path, &disk_key, 1); | 3569 | fixup_low_keys(trans, root, path, &disk_key, 1); |
3597 | } | 3570 | } |
3598 | 3571 | ||
3599 | if (btrfs_leaf_free_space(root, leaf) < 0) { | 3572 | if (btrfs_leaf_free_space(root, leaf) < 0) { |
@@ -3611,17 +3584,16 @@ out: | |||
3611 | * to save stack depth by doing the bulk of the work in a function | 3584 | * to save stack depth by doing the bulk of the work in a function |
3612 | * that doesn't call btrfs_search_slot | 3585 | * that doesn't call btrfs_search_slot |
3613 | */ | 3586 | */ |
3614 | int setup_items_for_insert(struct btrfs_trans_handle *trans, | 3587 | void setup_items_for_insert(struct btrfs_trans_handle *trans, |
3615 | struct btrfs_root *root, struct btrfs_path *path, | 3588 | struct btrfs_root *root, struct btrfs_path *path, |
3616 | struct btrfs_key *cpu_key, u32 *data_size, | 3589 | struct btrfs_key *cpu_key, u32 *data_size, |
3617 | u32 total_data, u32 total_size, int nr) | 3590 | u32 total_data, u32 total_size, int nr) |
3618 | { | 3591 | { |
3619 | struct btrfs_item *item; | 3592 | struct btrfs_item *item; |
3620 | int i; | 3593 | int i; |
3621 | u32 nritems; | 3594 | u32 nritems; |
3622 | unsigned int data_end; | 3595 | unsigned int data_end; |
3623 | struct btrfs_disk_key disk_key; | 3596 | struct btrfs_disk_key disk_key; |
3624 | int ret; | ||
3625 | struct extent_buffer *leaf; | 3597 | struct extent_buffer *leaf; |
3626 | int slot; | 3598 | int slot; |
3627 | struct btrfs_map_token token; | 3599 | struct btrfs_map_token token; |
@@ -3687,10 +3659,9 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3687 | 3659 | ||
3688 | btrfs_set_header_nritems(leaf, nritems + nr); | 3660 | btrfs_set_header_nritems(leaf, nritems + nr); |
3689 | 3661 | ||
3690 | ret = 0; | ||
3691 | if (slot == 0) { | 3662 | if (slot == 0) { |
3692 | btrfs_cpu_key_to_disk(&disk_key, cpu_key); | 3663 | btrfs_cpu_key_to_disk(&disk_key, cpu_key); |
3693 | ret = fixup_low_keys(trans, root, path, &disk_key, 1); | 3664 | fixup_low_keys(trans, root, path, &disk_key, 1); |
3694 | } | 3665 | } |
3695 | btrfs_unlock_up_safe(path, 1); | 3666 | btrfs_unlock_up_safe(path, 1); |
3696 | btrfs_mark_buffer_dirty(leaf); | 3667 | btrfs_mark_buffer_dirty(leaf); |
@@ -3699,7 +3670,6 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3699 | btrfs_print_leaf(root, leaf); | 3670 | btrfs_print_leaf(root, leaf); |
3700 | BUG(); | 3671 | BUG(); |
3701 | } | 3672 | } |
3702 | return ret; | ||
3703 | } | 3673 | } |
3704 | 3674 | ||
3705 | /* | 3675 | /* |
@@ -3726,16 +3696,14 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, | |||
3726 | if (ret == 0) | 3696 | if (ret == 0) |
3727 | return -EEXIST; | 3697 | return -EEXIST; |
3728 | if (ret < 0) | 3698 | if (ret < 0) |
3729 | goto out; | 3699 | return ret; |
3730 | 3700 | ||
3731 | slot = path->slots[0]; | 3701 | slot = path->slots[0]; |
3732 | BUG_ON(slot < 0); | 3702 | BUG_ON(slot < 0); |
3733 | 3703 | ||
3734 | ret = setup_items_for_insert(trans, root, path, cpu_key, data_size, | 3704 | setup_items_for_insert(trans, root, path, cpu_key, data_size, |
3735 | total_data, total_size, nr); | 3705 | total_data, total_size, nr); |
3736 | 3706 | return 0; | |
3737 | out: | ||
3738 | return ret; | ||
3739 | } | 3707 | } |
3740 | 3708 | ||
3741 | /* | 3709 | /* |
@@ -3771,13 +3739,11 @@ int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root | |||
3771 | * the tree should have been previously balanced so the deletion does not | 3739 | * the tree should have been previously balanced so the deletion does not |
3772 | * empty a node. | 3740 | * empty a node. |
3773 | */ | 3741 | */ |
3774 | static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 3742 | static void del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
3775 | struct btrfs_path *path, int level, int slot) | 3743 | struct btrfs_path *path, int level, int slot) |
3776 | { | 3744 | { |
3777 | struct extent_buffer *parent = path->nodes[level]; | 3745 | struct extent_buffer *parent = path->nodes[level]; |
3778 | u32 nritems; | 3746 | u32 nritems; |
3779 | int ret = 0; | ||
3780 | int wret; | ||
3781 | 3747 | ||
3782 | nritems = btrfs_header_nritems(parent); | 3748 | nritems = btrfs_header_nritems(parent); |
3783 | if (slot != nritems - 1) { | 3749 | if (slot != nritems - 1) { |
@@ -3797,12 +3763,9 @@ static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3797 | struct btrfs_disk_key disk_key; | 3763 | struct btrfs_disk_key disk_key; |
3798 | 3764 | ||
3799 | btrfs_node_key(parent, &disk_key, 0); | 3765 | btrfs_node_key(parent, &disk_key, 0); |
3800 | wret = fixup_low_keys(trans, root, path, &disk_key, level + 1); | 3766 | fixup_low_keys(trans, root, path, &disk_key, level + 1); |
3801 | if (wret) | ||
3802 | ret = wret; | ||
3803 | } | 3767 | } |
3804 | btrfs_mark_buffer_dirty(parent); | 3768 | btrfs_mark_buffer_dirty(parent); |
3805 | return ret; | ||
3806 | } | 3769 | } |
3807 | 3770 | ||
3808 | /* | 3771 | /* |
@@ -3815,17 +3778,13 @@ static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3815 | * The path must have already been setup for deleting the leaf, including | 3778 | * The path must have already been setup for deleting the leaf, including |
3816 | * all the proper balancing. path->nodes[1] must be locked. | 3779 | * all the proper balancing. path->nodes[1] must be locked. |
3817 | */ | 3780 | */ |
3818 | static noinline int btrfs_del_leaf(struct btrfs_trans_handle *trans, | 3781 | static noinline void btrfs_del_leaf(struct btrfs_trans_handle *trans, |
3819 | struct btrfs_root *root, | 3782 | struct btrfs_root *root, |
3820 | struct btrfs_path *path, | 3783 | struct btrfs_path *path, |
3821 | struct extent_buffer *leaf) | 3784 | struct extent_buffer *leaf) |
3822 | { | 3785 | { |
3823 | int ret; | ||
3824 | |||
3825 | WARN_ON(btrfs_header_generation(leaf) != trans->transid); | 3786 | WARN_ON(btrfs_header_generation(leaf) != trans->transid); |
3826 | ret = del_ptr(trans, root, path, 1, path->slots[1]); | 3787 | del_ptr(trans, root, path, 1, path->slots[1]); |
3827 | if (ret) | ||
3828 | return ret; | ||
3829 | 3788 | ||
3830 | /* | 3789 | /* |
3831 | * btrfs_free_extent is expensive, we want to make sure we | 3790 | * btrfs_free_extent is expensive, we want to make sure we |
@@ -3838,7 +3797,6 @@ static noinline int btrfs_del_leaf(struct btrfs_trans_handle *trans, | |||
3838 | extent_buffer_get(leaf); | 3797 | extent_buffer_get(leaf); |
3839 | btrfs_free_tree_block(trans, root, leaf, 0, 1, 0); | 3798 | btrfs_free_tree_block(trans, root, leaf, 0, 1, 0); |
3840 | free_extent_buffer_stale(leaf); | 3799 | free_extent_buffer_stale(leaf); |
3841 | return 0; | ||
3842 | } | 3800 | } |
3843 | /* | 3801 | /* |
3844 | * delete the item at the leaf level in path. If that empties | 3802 | * delete the item at the leaf level in path. If that empties |
@@ -3899,8 +3857,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3899 | } else { | 3857 | } else { |
3900 | btrfs_set_path_blocking(path); | 3858 | btrfs_set_path_blocking(path); |
3901 | clean_tree_block(trans, root, leaf); | 3859 | clean_tree_block(trans, root, leaf); |
3902 | ret = btrfs_del_leaf(trans, root, path, leaf); | 3860 | btrfs_del_leaf(trans, root, path, leaf); |
3903 | BUG_ON(ret); | ||
3904 | } | 3861 | } |
3905 | } else { | 3862 | } else { |
3906 | int used = leaf_space_used(leaf, 0, nritems); | 3863 | int used = leaf_space_used(leaf, 0, nritems); |
@@ -3908,10 +3865,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3908 | struct btrfs_disk_key disk_key; | 3865 | struct btrfs_disk_key disk_key; |
3909 | 3866 | ||
3910 | btrfs_item_key(leaf, &disk_key, 0); | 3867 | btrfs_item_key(leaf, &disk_key, 0); |
3911 | wret = fixup_low_keys(trans, root, path, | 3868 | fixup_low_keys(trans, root, path, &disk_key, 1); |
3912 | &disk_key, 1); | ||
3913 | if (wret) | ||
3914 | ret = wret; | ||
3915 | } | 3869 | } |
3916 | 3870 | ||
3917 | /* delete the leaf if it is mostly empty */ | 3871 | /* delete the leaf if it is mostly empty */ |
@@ -3939,9 +3893,9 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3939 | 3893 | ||
3940 | if (btrfs_header_nritems(leaf) == 0) { | 3894 | if (btrfs_header_nritems(leaf) == 0) { |
3941 | path->slots[1] = slot; | 3895 | path->slots[1] = slot; |
3942 | ret = btrfs_del_leaf(trans, root, path, leaf); | 3896 | btrfs_del_leaf(trans, root, path, leaf); |
3943 | BUG_ON(ret); | ||
3944 | free_extent_buffer(leaf); | 3897 | free_extent_buffer(leaf); |
3898 | ret = 0; | ||
3945 | } else { | 3899 | } else { |
3946 | /* if we're still in the path, make sure | 3900 | /* if we're still in the path, make sure |
3947 | * we're dirty. Otherwise, one of the | 3901 | * we're dirty. Otherwise, one of the |
@@ -4124,7 +4078,7 @@ find_next_key: | |||
4124 | } | 4078 | } |
4125 | btrfs_set_path_blocking(path); | 4079 | btrfs_set_path_blocking(path); |
4126 | cur = read_node_slot(root, cur, slot); | 4080 | cur = read_node_slot(root, cur, slot); |
4127 | BUG_ON(!cur); | 4081 | BUG_ON(!cur); /* -ENOMEM */ |
4128 | 4082 | ||
4129 | btrfs_tree_read_lock(cur); | 4083 | btrfs_tree_read_lock(cur); |
4130 | 4084 | ||