diff options
author | Chris Mason <chris.mason@oracle.com> | 2012-03-03 07:40:03 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2012-03-26 17:04:23 -0400 |
commit | cfed81a04eb555f5606d1b6a54bdbabab0ee1ac3 (patch) | |
tree | 2a763276869693b21c0e3a14f725f642c1f27fd3 /fs/btrfs/ctree.c | |
parent | 0b32f4bbb423f02acee6d43cd442f5f0775db7e0 (diff) |
Btrfs: add the ability to cache a pointer into the eb
This cuts down on the CPU time used by map_private_extent_buffer
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 80 |
1 files changed, 57 insertions, 23 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 74c03fb0ca1d..8af24da983b1 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -2333,6 +2333,7 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2333 | { | 2333 | { |
2334 | struct extent_buffer *left = path->nodes[0]; | 2334 | struct extent_buffer *left = path->nodes[0]; |
2335 | struct extent_buffer *upper = path->nodes[1]; | 2335 | struct extent_buffer *upper = path->nodes[1]; |
2336 | struct btrfs_map_token token; | ||
2336 | struct btrfs_disk_key disk_key; | 2337 | struct btrfs_disk_key disk_key; |
2337 | int slot; | 2338 | int slot; |
2338 | u32 i; | 2339 | u32 i; |
@@ -2344,6 +2345,8 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2344 | u32 data_end; | 2345 | u32 data_end; |
2345 | u32 this_item_size; | 2346 | u32 this_item_size; |
2346 | 2347 | ||
2348 | btrfs_init_map_token(&token); | ||
2349 | |||
2347 | if (empty) | 2350 | if (empty) |
2348 | nr = 0; | 2351 | nr = 0; |
2349 | else | 2352 | else |
@@ -2421,8 +2424,8 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2421 | push_space = BTRFS_LEAF_DATA_SIZE(root); | 2424 | push_space = BTRFS_LEAF_DATA_SIZE(root); |
2422 | for (i = 0; i < right_nritems; i++) { | 2425 | for (i = 0; i < right_nritems; i++) { |
2423 | item = btrfs_item_nr(right, i); | 2426 | item = btrfs_item_nr(right, i); |
2424 | push_space -= btrfs_item_size(right, item); | 2427 | push_space -= btrfs_token_item_size(right, item, &token); |
2425 | btrfs_set_item_offset(right, item, push_space); | 2428 | btrfs_set_token_item_offset(right, item, push_space, &token); |
2426 | } | 2429 | } |
2427 | 2430 | ||
2428 | left_nritems -= push_items; | 2431 | left_nritems -= push_items; |
@@ -2553,6 +2556,9 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2553 | int wret; | 2556 | int wret; |
2554 | u32 this_item_size; | 2557 | u32 this_item_size; |
2555 | u32 old_left_item_size; | 2558 | u32 old_left_item_size; |
2559 | struct btrfs_map_token token; | ||
2560 | |||
2561 | btrfs_init_map_token(&token); | ||
2556 | 2562 | ||
2557 | if (empty) | 2563 | if (empty) |
2558 | nr = min(right_nritems, max_slot); | 2564 | nr = min(right_nritems, max_slot); |
@@ -2613,9 +2619,10 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2613 | 2619 | ||
2614 | item = btrfs_item_nr(left, i); | 2620 | item = btrfs_item_nr(left, i); |
2615 | 2621 | ||
2616 | ioff = btrfs_item_offset(left, item); | 2622 | ioff = btrfs_token_item_offset(left, item, &token); |
2617 | btrfs_set_item_offset(left, item, | 2623 | btrfs_set_token_item_offset(left, item, |
2618 | ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size)); | 2624 | ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size), |
2625 | &token); | ||
2619 | } | 2626 | } |
2620 | btrfs_set_header_nritems(left, old_left_nritems + push_items); | 2627 | btrfs_set_header_nritems(left, old_left_nritems + push_items); |
2621 | 2628 | ||
@@ -2645,8 +2652,9 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2645 | for (i = 0; i < right_nritems; i++) { | 2652 | for (i = 0; i < right_nritems; i++) { |
2646 | item = btrfs_item_nr(right, i); | 2653 | item = btrfs_item_nr(right, i); |
2647 | 2654 | ||
2648 | push_space = push_space - btrfs_item_size(right, item); | 2655 | push_space = push_space - btrfs_token_item_size(right, |
2649 | btrfs_set_item_offset(right, item, push_space); | 2656 | item, &token); |
2657 | btrfs_set_token_item_offset(right, item, push_space, &token); | ||
2650 | } | 2658 | } |
2651 | 2659 | ||
2652 | btrfs_mark_buffer_dirty(left); | 2660 | btrfs_mark_buffer_dirty(left); |
@@ -2767,6 +2775,9 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
2767 | int ret = 0; | 2775 | int ret = 0; |
2768 | int wret; | 2776 | int wret; |
2769 | struct btrfs_disk_key disk_key; | 2777 | struct btrfs_disk_key disk_key; |
2778 | struct btrfs_map_token token; | ||
2779 | |||
2780 | btrfs_init_map_token(&token); | ||
2770 | 2781 | ||
2771 | nritems = nritems - mid; | 2782 | nritems = nritems - mid; |
2772 | btrfs_set_header_nritems(right, nritems); | 2783 | btrfs_set_header_nritems(right, nritems); |
@@ -2788,8 +2799,9 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
2788 | struct btrfs_item *item = btrfs_item_nr(right, i); | 2799 | struct btrfs_item *item = btrfs_item_nr(right, i); |
2789 | u32 ioff; | 2800 | u32 ioff; |
2790 | 2801 | ||
2791 | ioff = btrfs_item_offset(right, item); | 2802 | ioff = btrfs_token_item_offset(right, item, &token); |
2792 | btrfs_set_item_offset(right, item, ioff + rt_data_off); | 2803 | btrfs_set_token_item_offset(right, item, |
2804 | ioff + rt_data_off, &token); | ||
2793 | } | 2805 | } |
2794 | 2806 | ||
2795 | btrfs_set_header_nritems(l, mid); | 2807 | btrfs_set_header_nritems(l, mid); |
@@ -3284,6 +3296,9 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3284 | unsigned int old_size; | 3296 | unsigned int old_size; |
3285 | unsigned int size_diff; | 3297 | unsigned int size_diff; |
3286 | int i; | 3298 | int i; |
3299 | struct btrfs_map_token token; | ||
3300 | |||
3301 | btrfs_init_map_token(&token); | ||
3287 | 3302 | ||
3288 | leaf = path->nodes[0]; | 3303 | leaf = path->nodes[0]; |
3289 | slot = path->slots[0]; | 3304 | slot = path->slots[0]; |
@@ -3310,8 +3325,9 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3310 | u32 ioff; | 3325 | u32 ioff; |
3311 | item = btrfs_item_nr(leaf, i); | 3326 | item = btrfs_item_nr(leaf, i); |
3312 | 3327 | ||
3313 | ioff = btrfs_item_offset(leaf, item); | 3328 | ioff = btrfs_token_item_offset(leaf, item, &token); |
3314 | btrfs_set_item_offset(leaf, item, ioff + size_diff); | 3329 | btrfs_set_token_item_offset(leaf, item, |
3330 | ioff + size_diff, &token); | ||
3315 | } | 3331 | } |
3316 | 3332 | ||
3317 | /* shift the data */ | 3333 | /* shift the data */ |
@@ -3381,6 +3397,9 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3381 | unsigned int old_data; | 3397 | unsigned int old_data; |
3382 | unsigned int old_size; | 3398 | unsigned int old_size; |
3383 | int i; | 3399 | int i; |
3400 | struct btrfs_map_token token; | ||
3401 | |||
3402 | btrfs_init_map_token(&token); | ||
3384 | 3403 | ||
3385 | leaf = path->nodes[0]; | 3404 | leaf = path->nodes[0]; |
3386 | 3405 | ||
@@ -3410,8 +3429,9 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3410 | u32 ioff; | 3429 | u32 ioff; |
3411 | item = btrfs_item_nr(leaf, i); | 3430 | item = btrfs_item_nr(leaf, i); |
3412 | 3431 | ||
3413 | ioff = btrfs_item_offset(leaf, item); | 3432 | ioff = btrfs_token_item_offset(leaf, item, &token); |
3414 | btrfs_set_item_offset(leaf, item, ioff - data_size); | 3433 | btrfs_set_token_item_offset(leaf, item, |
3434 | ioff - data_size, &token); | ||
3415 | } | 3435 | } |
3416 | 3436 | ||
3417 | /* shift the data */ | 3437 | /* shift the data */ |
@@ -3454,6 +3474,9 @@ int btrfs_insert_some_items(struct btrfs_trans_handle *trans, | |||
3454 | unsigned int data_end; | 3474 | unsigned int data_end; |
3455 | struct btrfs_disk_key disk_key; | 3475 | struct btrfs_disk_key disk_key; |
3456 | struct btrfs_key found_key; | 3476 | struct btrfs_key found_key; |
3477 | struct btrfs_map_token token; | ||
3478 | |||
3479 | btrfs_init_map_token(&token); | ||
3457 | 3480 | ||
3458 | for (i = 0; i < nr; i++) { | 3481 | for (i = 0; i < nr; i++) { |
3459 | if (total_size + data_size[i] + sizeof(struct btrfs_item) > | 3482 | if (total_size + data_size[i] + sizeof(struct btrfs_item) > |
@@ -3519,8 +3542,9 @@ int btrfs_insert_some_items(struct btrfs_trans_handle *trans, | |||
3519 | u32 ioff; | 3542 | u32 ioff; |
3520 | 3543 | ||
3521 | item = btrfs_item_nr(leaf, i); | 3544 | item = btrfs_item_nr(leaf, i); |
3522 | ioff = btrfs_item_offset(leaf, item); | 3545 | ioff = btrfs_token_item_offset(leaf, item, &token); |
3523 | btrfs_set_item_offset(leaf, item, ioff - total_data); | 3546 | btrfs_set_token_item_offset(leaf, item, |
3547 | ioff - total_data, &token); | ||
3524 | } | 3548 | } |
3525 | /* shift the items */ | 3549 | /* shift the items */ |
3526 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), | 3550 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), |
@@ -3547,9 +3571,10 @@ int btrfs_insert_some_items(struct btrfs_trans_handle *trans, | |||
3547 | btrfs_cpu_key_to_disk(&disk_key, cpu_key + i); | 3571 | btrfs_cpu_key_to_disk(&disk_key, cpu_key + i); |
3548 | btrfs_set_item_key(leaf, &disk_key, slot + i); | 3572 | btrfs_set_item_key(leaf, &disk_key, slot + i); |
3549 | item = btrfs_item_nr(leaf, slot + i); | 3573 | item = btrfs_item_nr(leaf, slot + i); |
3550 | btrfs_set_item_offset(leaf, item, data_end - data_size[i]); | 3574 | btrfs_set_token_item_offset(leaf, item, |
3575 | data_end - data_size[i], &token); | ||
3551 | data_end -= data_size[i]; | 3576 | data_end -= data_size[i]; |
3552 | btrfs_set_item_size(leaf, item, data_size[i]); | 3577 | btrfs_set_token_item_size(leaf, item, data_size[i], &token); |
3553 | } | 3578 | } |
3554 | btrfs_set_header_nritems(leaf, nritems + nr); | 3579 | btrfs_set_header_nritems(leaf, nritems + nr); |
3555 | btrfs_mark_buffer_dirty(leaf); | 3580 | btrfs_mark_buffer_dirty(leaf); |
@@ -3588,6 +3613,9 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3588 | int ret; | 3613 | int ret; |
3589 | struct extent_buffer *leaf; | 3614 | struct extent_buffer *leaf; |
3590 | int slot; | 3615 | int slot; |
3616 | struct btrfs_map_token token; | ||
3617 | |||
3618 | btrfs_init_map_token(&token); | ||
3591 | 3619 | ||
3592 | leaf = path->nodes[0]; | 3620 | leaf = path->nodes[0]; |
3593 | slot = path->slots[0]; | 3621 | slot = path->slots[0]; |
@@ -3619,8 +3647,9 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3619 | u32 ioff; | 3647 | u32 ioff; |
3620 | 3648 | ||
3621 | item = btrfs_item_nr(leaf, i); | 3649 | item = btrfs_item_nr(leaf, i); |
3622 | ioff = btrfs_item_offset(leaf, item); | 3650 | ioff = btrfs_token_item_offset(leaf, item, &token); |
3623 | btrfs_set_item_offset(leaf, item, ioff - total_data); | 3651 | btrfs_set_token_item_offset(leaf, item, |
3652 | ioff - total_data, &token); | ||
3624 | } | 3653 | } |
3625 | /* shift the items */ | 3654 | /* shift the items */ |
3626 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), | 3655 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), |
@@ -3639,9 +3668,10 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3639 | btrfs_cpu_key_to_disk(&disk_key, cpu_key + i); | 3668 | btrfs_cpu_key_to_disk(&disk_key, cpu_key + i); |
3640 | btrfs_set_item_key(leaf, &disk_key, slot + i); | 3669 | btrfs_set_item_key(leaf, &disk_key, slot + i); |
3641 | item = btrfs_item_nr(leaf, slot + i); | 3670 | item = btrfs_item_nr(leaf, slot + i); |
3642 | btrfs_set_item_offset(leaf, item, data_end - data_size[i]); | 3671 | btrfs_set_token_item_offset(leaf, item, |
3672 | data_end - data_size[i], &token); | ||
3643 | data_end -= data_size[i]; | 3673 | data_end -= data_size[i]; |
3644 | btrfs_set_item_size(leaf, item, data_size[i]); | 3674 | btrfs_set_token_item_size(leaf, item, data_size[i], &token); |
3645 | } | 3675 | } |
3646 | 3676 | ||
3647 | btrfs_set_header_nritems(leaf, nritems + nr); | 3677 | btrfs_set_header_nritems(leaf, nritems + nr); |
@@ -3814,6 +3844,9 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3814 | int wret; | 3844 | int wret; |
3815 | int i; | 3845 | int i; |
3816 | u32 nritems; | 3846 | u32 nritems; |
3847 | struct btrfs_map_token token; | ||
3848 | |||
3849 | btrfs_init_map_token(&token); | ||
3817 | 3850 | ||
3818 | leaf = path->nodes[0]; | 3851 | leaf = path->nodes[0]; |
3819 | last_off = btrfs_item_offset_nr(leaf, slot + nr - 1); | 3852 | last_off = btrfs_item_offset_nr(leaf, slot + nr - 1); |
@@ -3835,8 +3868,9 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3835 | u32 ioff; | 3868 | u32 ioff; |
3836 | 3869 | ||
3837 | item = btrfs_item_nr(leaf, i); | 3870 | item = btrfs_item_nr(leaf, i); |
3838 | ioff = btrfs_item_offset(leaf, item); | 3871 | ioff = btrfs_token_item_offset(leaf, item, &token); |
3839 | btrfs_set_item_offset(leaf, item, ioff + dsize); | 3872 | btrfs_set_token_item_offset(leaf, item, |
3873 | ioff + dsize, &token); | ||
3840 | } | 3874 | } |
3841 | 3875 | ||
3842 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot), | 3876 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot), |