aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2012-03-28 20:31:37 -0400
committerChris Mason <chris.mason@oracle.com>2012-03-28 20:31:37 -0400
commit1d4284bd6e8d7dd1d5521a6747bdb6dc1caf0225 (patch)
treea7dde6312ec24eb6368cad7a3efedbf368a5a70c /fs/btrfs/ctree.c
parentb5d67f64f9bc656970dacba245410f0faedad18e (diff)
parent65139ed99234d8505948cdb7a835452eb5c191f9 (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.c250
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);
39static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, 39static 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
42struct btrfs_path *btrfs_alloc_path(void) 42struct 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 */
1911static int fixup_low_keys(struct btrfs_trans_handle *trans, 1923static 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 */
1938int btrfs_set_item_key_safe(struct btrfs_trans_handle *trans, 1948void 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 */
2170static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root 2175static 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 */
2776static noinline int copy_for_split(struct btrfs_trans_handle *trans, 2772static 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
3077push_for_double: 3054push_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 */
3296int btrfs_truncate_item(struct btrfs_trans_handle *trans, 3271void 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 */
3399int btrfs_extend_item(struct btrfs_trans_handle *trans, 3373void 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 */
3614int setup_items_for_insert(struct btrfs_trans_handle *trans, 3587void 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;
3737out:
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 */
3774static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, 3742static 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 */
3818static noinline int btrfs_del_leaf(struct btrfs_trans_handle *trans, 3781static 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