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 | ||
