aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2012-03-03 07:40:03 -0500
committerChris Mason <chris.mason@oracle.com>2012-03-26 17:04:23 -0400
commitcfed81a04eb555f5606d1b6a54bdbabab0ee1ac3 (patch)
tree2a763276869693b21c0e3a14f725f642c1f27fd3 /fs/btrfs/ctree.c
parent0b32f4bbb423f02acee6d43cd442f5f0775db7e0 (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.c80
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),