diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index c3df14ce2cc2..9ac171599258 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -200,7 +200,6 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans, | |||
200 | struct extent_buffer **cow_ret, u64 new_root_objectid) | 200 | struct extent_buffer **cow_ret, u64 new_root_objectid) |
201 | { | 201 | { |
202 | struct extent_buffer *cow; | 202 | struct extent_buffer *cow; |
203 | u32 nritems; | ||
204 | int ret = 0; | 203 | int ret = 0; |
205 | int level; | 204 | int level; |
206 | struct btrfs_disk_key disk_key; | 205 | struct btrfs_disk_key disk_key; |
@@ -210,7 +209,6 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans, | |||
210 | WARN_ON(root->ref_cows && trans->transid != root->last_trans); | 209 | WARN_ON(root->ref_cows && trans->transid != root->last_trans); |
211 | 210 | ||
212 | level = btrfs_header_level(buf); | 211 | level = btrfs_header_level(buf); |
213 | nritems = btrfs_header_nritems(buf); | ||
214 | if (level == 0) | 212 | if (level == 0) |
215 | btrfs_item_key(buf, &disk_key, 0); | 213 | btrfs_item_key(buf, &disk_key, 0); |
216 | else | 214 | else |
@@ -1008,7 +1006,6 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1008 | int wret; | 1006 | int wret; |
1009 | int pslot; | 1007 | int pslot; |
1010 | int orig_slot = path->slots[level]; | 1008 | int orig_slot = path->slots[level]; |
1011 | int err_on_enospc = 0; | ||
1012 | u64 orig_ptr; | 1009 | u64 orig_ptr; |
1013 | 1010 | ||
1014 | if (level == 0) | 1011 | if (level == 0) |
@@ -1071,8 +1068,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1071 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) | 1068 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) |
1072 | return 0; | 1069 | return 0; |
1073 | 1070 | ||
1074 | if (btrfs_header_nritems(mid) < 2) | 1071 | btrfs_header_nritems(mid); |
1075 | err_on_enospc = 1; | ||
1076 | 1072 | ||
1077 | left = read_node_slot(root, parent, pslot - 1); | 1073 | left = read_node_slot(root, parent, pslot - 1); |
1078 | if (left) { | 1074 | if (left) { |
@@ -1103,8 +1099,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
1103 | wret = push_node_left(trans, root, left, mid, 1); | 1099 | wret = push_node_left(trans, root, left, mid, 1); |
1104 | if (wret < 0) | 1100 | if (wret < 0) |
1105 | ret = wret; | 1101 | ret = wret; |
1106 | if (btrfs_header_nritems(mid) < 2) | 1102 | btrfs_header_nritems(mid); |
1107 | err_on_enospc = 1; | ||
1108 | } | 1103 | } |
1109 | 1104 | ||
1110 | /* | 1105 | /* |
@@ -1224,14 +1219,12 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans, | |||
1224 | int wret; | 1219 | int wret; |
1225 | int pslot; | 1220 | int pslot; |
1226 | int orig_slot = path->slots[level]; | 1221 | int orig_slot = path->slots[level]; |
1227 | u64 orig_ptr; | ||
1228 | 1222 | ||
1229 | if (level == 0) | 1223 | if (level == 0) |
1230 | return 1; | 1224 | return 1; |
1231 | 1225 | ||
1232 | mid = path->nodes[level]; | 1226 | mid = path->nodes[level]; |
1233 | WARN_ON(btrfs_header_generation(mid) != trans->transid); | 1227 | WARN_ON(btrfs_header_generation(mid) != trans->transid); |
1234 | orig_ptr = btrfs_node_blockptr(mid, orig_slot); | ||
1235 | 1228 | ||
1236 | if (level < BTRFS_MAX_LEVEL - 1) | 1229 | if (level < BTRFS_MAX_LEVEL - 1) |
1237 | parent = path->nodes[level + 1]; | 1230 | parent = path->nodes[level + 1]; |
@@ -1577,13 +1570,33 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
1577 | blocksize = btrfs_level_size(root, level - 1); | 1570 | blocksize = btrfs_level_size(root, level - 1); |
1578 | 1571 | ||
1579 | tmp = btrfs_find_tree_block(root, blocknr, blocksize); | 1572 | tmp = btrfs_find_tree_block(root, blocknr, blocksize); |
1580 | if (tmp && btrfs_buffer_uptodate(tmp, gen)) { | 1573 | if (tmp) { |
1581 | /* | 1574 | if (btrfs_buffer_uptodate(tmp, 0)) { |
1582 | * we found an up to date block without sleeping, return | 1575 | if (btrfs_buffer_uptodate(tmp, gen)) { |
1583 | * right away | 1576 | /* |
1584 | */ | 1577 | * we found an up to date block without |
1585 | *eb_ret = tmp; | 1578 | * sleeping, return |
1586 | return 0; | 1579 | * right away |
1580 | */ | ||
1581 | *eb_ret = tmp; | ||
1582 | return 0; | ||
1583 | } | ||
1584 | /* the pages were up to date, but we failed | ||
1585 | * the generation number check. Do a full | ||
1586 | * read for the generation number that is correct. | ||
1587 | * We must do this without dropping locks so | ||
1588 | * we can trust our generation number | ||
1589 | */ | ||
1590 | free_extent_buffer(tmp); | ||
1591 | tmp = read_tree_block(root, blocknr, blocksize, gen); | ||
1592 | if (tmp && btrfs_buffer_uptodate(tmp, gen)) { | ||
1593 | *eb_ret = tmp; | ||
1594 | return 0; | ||
1595 | } | ||
1596 | free_extent_buffer(tmp); | ||
1597 | btrfs_release_path(NULL, p); | ||
1598 | return -EIO; | ||
1599 | } | ||
1587 | } | 1600 | } |
1588 | 1601 | ||
1589 | /* | 1602 | /* |
@@ -1596,8 +1609,7 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
1596 | btrfs_unlock_up_safe(p, level + 1); | 1609 | btrfs_unlock_up_safe(p, level + 1); |
1597 | btrfs_set_path_blocking(p); | 1610 | btrfs_set_path_blocking(p); |
1598 | 1611 | ||
1599 | if (tmp) | 1612 | free_extent_buffer(tmp); |
1600 | free_extent_buffer(tmp); | ||
1601 | if (p->reada) | 1613 | if (p->reada) |
1602 | reada_for_search(root, p, level, slot, key->objectid); | 1614 | reada_for_search(root, p, level, slot, key->objectid); |
1603 | 1615 | ||
@@ -2548,7 +2560,6 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2548 | { | 2560 | { |
2549 | struct btrfs_disk_key disk_key; | 2561 | struct btrfs_disk_key disk_key; |
2550 | struct extent_buffer *right = path->nodes[0]; | 2562 | struct extent_buffer *right = path->nodes[0]; |
2551 | int slot; | ||
2552 | int i; | 2563 | int i; |
2553 | int push_space = 0; | 2564 | int push_space = 0; |
2554 | int push_items = 0; | 2565 | int push_items = 0; |
@@ -2560,8 +2571,6 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2560 | u32 this_item_size; | 2571 | u32 this_item_size; |
2561 | u32 old_left_item_size; | 2572 | u32 old_left_item_size; |
2562 | 2573 | ||
2563 | slot = path->slots[1]; | ||
2564 | |||
2565 | if (empty) | 2574 | if (empty) |
2566 | nr = min(right_nritems, max_slot); | 2575 | nr = min(right_nritems, max_slot); |
2567 | else | 2576 | else |
@@ -3330,7 +3339,6 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3330 | { | 3339 | { |
3331 | int ret = 0; | 3340 | int ret = 0; |
3332 | int slot; | 3341 | int slot; |
3333 | int slot_orig; | ||
3334 | struct extent_buffer *leaf; | 3342 | struct extent_buffer *leaf; |
3335 | struct btrfs_item *item; | 3343 | struct btrfs_item *item; |
3336 | u32 nritems; | 3344 | u32 nritems; |
@@ -3340,7 +3348,6 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3340 | unsigned int size_diff; | 3348 | unsigned int size_diff; |
3341 | int i; | 3349 | int i; |
3342 | 3350 | ||
3343 | slot_orig = path->slots[0]; | ||
3344 | leaf = path->nodes[0]; | 3351 | leaf = path->nodes[0]; |
3345 | slot = path->slots[0]; | 3352 | slot = path->slots[0]; |
3346 | 3353 | ||
@@ -3445,7 +3452,6 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3445 | { | 3452 | { |
3446 | int ret = 0; | 3453 | int ret = 0; |
3447 | int slot; | 3454 | int slot; |
3448 | int slot_orig; | ||
3449 | struct extent_buffer *leaf; | 3455 | struct extent_buffer *leaf; |
3450 | struct btrfs_item *item; | 3456 | struct btrfs_item *item; |
3451 | u32 nritems; | 3457 | u32 nritems; |
@@ -3454,7 +3460,6 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3454 | unsigned int old_size; | 3460 | unsigned int old_size; |
3455 | int i; | 3461 | int i; |
3456 | 3462 | ||
3457 | slot_orig = path->slots[0]; | ||
3458 | leaf = path->nodes[0]; | 3463 | leaf = path->nodes[0]; |
3459 | 3464 | ||
3460 | nritems = btrfs_header_nritems(leaf); | 3465 | nritems = btrfs_header_nritems(leaf); |
@@ -3787,7 +3792,6 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, | |||
3787 | struct btrfs_key *cpu_key, u32 *data_size, | 3792 | struct btrfs_key *cpu_key, u32 *data_size, |
3788 | int nr) | 3793 | int nr) |
3789 | { | 3794 | { |
3790 | struct extent_buffer *leaf; | ||
3791 | int ret = 0; | 3795 | int ret = 0; |
3792 | int slot; | 3796 | int slot; |
3793 | int i; | 3797 | int i; |
@@ -3804,7 +3808,6 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, | |||
3804 | if (ret < 0) | 3808 | if (ret < 0) |
3805 | goto out; | 3809 | goto out; |
3806 | 3810 | ||
3807 | leaf = path->nodes[0]; | ||
3808 | slot = path->slots[0]; | 3811 | slot = path->slots[0]; |
3809 | BUG_ON(slot < 0); | 3812 | BUG_ON(slot < 0); |
3810 | 3813 | ||