diff options
author | David Sterba <dsterba@suse.com> | 2019-08-09 11:48:21 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-09-09 08:59:16 -0400 |
commit | c82f823c9b006c31059341af41da9f8b2e3e64d9 (patch) | |
tree | b6b9204325f78f83df3a1a871ee4a7abc6e29b07 | |
parent | 48bc39501a549ec978c8aad28eb89ca3a2a7ca03 (diff) |
btrfs: tie extent buffer and it's token together
Further simplifaction of the get/set helpers is possible when the token
is uniquely tied to an extent buffer. A condition and an assignment can
be avoided.
The initializations are moved closer to the first use when the extent
buffer is valid. There's one exception in __push_leaf_left where the
token is reused.
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | fs/btrfs/ctree.c | 27 | ||||
-rw-r--r-- | fs/btrfs/ctree.h | 4 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 2 | ||||
-rw-r--r-- | fs/btrfs/struct-funcs.c | 6 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 7 |
5 files changed, 20 insertions, 26 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index fbf94e28fba8..88c3b338508d 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -3574,7 +3574,7 @@ static int leaf_space_used(struct extent_buffer *l, int start, int nr) | |||
3574 | 3574 | ||
3575 | if (!nr) | 3575 | if (!nr) |
3576 | return 0; | 3576 | return 0; |
3577 | btrfs_init_map_token(&token); | 3577 | btrfs_init_map_token(&token, l); |
3578 | start_item = btrfs_item_nr(start); | 3578 | start_item = btrfs_item_nr(start); |
3579 | end_item = btrfs_item_nr(end); | 3579 | end_item = btrfs_item_nr(end); |
3580 | data_len = btrfs_token_item_offset(l, start_item, &token) + | 3580 | data_len = btrfs_token_item_offset(l, start_item, &token) + |
@@ -3632,8 +3632,6 @@ static noinline int __push_leaf_right(struct btrfs_path *path, | |||
3632 | u32 data_end; | 3632 | u32 data_end; |
3633 | u32 this_item_size; | 3633 | u32 this_item_size; |
3634 | 3634 | ||
3635 | btrfs_init_map_token(&token); | ||
3636 | |||
3637 | if (empty) | 3635 | if (empty) |
3638 | nr = 0; | 3636 | nr = 0; |
3639 | else | 3637 | else |
@@ -3706,6 +3704,7 @@ static noinline int __push_leaf_right(struct btrfs_path *path, | |||
3706 | push_items * sizeof(struct btrfs_item)); | 3704 | push_items * sizeof(struct btrfs_item)); |
3707 | 3705 | ||
3708 | /* update the item pointers */ | 3706 | /* update the item pointers */ |
3707 | btrfs_init_map_token(&token, right); | ||
3709 | right_nritems += push_items; | 3708 | right_nritems += push_items; |
3710 | btrfs_set_header_nritems(right, right_nritems); | 3709 | btrfs_set_header_nritems(right, right_nritems); |
3711 | push_space = BTRFS_LEAF_DATA_SIZE(fs_info); | 3710 | push_space = BTRFS_LEAF_DATA_SIZE(fs_info); |
@@ -3860,8 +3859,6 @@ static noinline int __push_leaf_left(struct btrfs_path *path, int data_size, | |||
3860 | u32 old_left_item_size; | 3859 | u32 old_left_item_size; |
3861 | struct btrfs_map_token token; | 3860 | struct btrfs_map_token token; |
3862 | 3861 | ||
3863 | btrfs_init_map_token(&token); | ||
3864 | |||
3865 | if (empty) | 3862 | if (empty) |
3866 | nr = min(right_nritems, max_slot); | 3863 | nr = min(right_nritems, max_slot); |
3867 | else | 3864 | else |
@@ -3915,6 +3912,7 @@ static noinline int __push_leaf_left(struct btrfs_path *path, int data_size, | |||
3915 | old_left_nritems = btrfs_header_nritems(left); | 3912 | old_left_nritems = btrfs_header_nritems(left); |
3916 | BUG_ON(old_left_nritems <= 0); | 3913 | BUG_ON(old_left_nritems <= 0); |
3917 | 3914 | ||
3915 | btrfs_init_map_token(&token, left); | ||
3918 | old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1); | 3916 | old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1); |
3919 | for (i = old_left_nritems; i < old_left_nritems + push_items; i++) { | 3917 | for (i = old_left_nritems; i < old_left_nritems + push_items; i++) { |
3920 | u32 ioff; | 3918 | u32 ioff; |
@@ -3946,6 +3944,8 @@ static noinline int __push_leaf_left(struct btrfs_path *path, int data_size, | |||
3946 | (btrfs_header_nritems(right) - push_items) * | 3944 | (btrfs_header_nritems(right) - push_items) * |
3947 | sizeof(struct btrfs_item)); | 3945 | sizeof(struct btrfs_item)); |
3948 | } | 3946 | } |
3947 | |||
3948 | btrfs_init_map_token(&token, right); | ||
3949 | right_nritems -= push_items; | 3949 | right_nritems -= push_items; |
3950 | btrfs_set_header_nritems(right, right_nritems); | 3950 | btrfs_set_header_nritems(right, right_nritems); |
3951 | push_space = BTRFS_LEAF_DATA_SIZE(fs_info); | 3951 | push_space = BTRFS_LEAF_DATA_SIZE(fs_info); |
@@ -4076,8 +4076,6 @@ static noinline void copy_for_split(struct btrfs_trans_handle *trans, | |||
4076 | struct btrfs_disk_key disk_key; | 4076 | struct btrfs_disk_key disk_key; |
4077 | struct btrfs_map_token token; | 4077 | struct btrfs_map_token token; |
4078 | 4078 | ||
4079 | btrfs_init_map_token(&token); | ||
4080 | |||
4081 | nritems = nritems - mid; | 4079 | nritems = nritems - mid; |
4082 | btrfs_set_header_nritems(right, nritems); | 4080 | btrfs_set_header_nritems(right, nritems); |
4083 | data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(l); | 4081 | data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(l); |
@@ -4093,6 +4091,7 @@ static noinline void copy_for_split(struct btrfs_trans_handle *trans, | |||
4093 | 4091 | ||
4094 | rt_data_off = BTRFS_LEAF_DATA_SIZE(fs_info) - btrfs_item_end_nr(l, mid); | 4092 | rt_data_off = BTRFS_LEAF_DATA_SIZE(fs_info) - btrfs_item_end_nr(l, mid); |
4095 | 4093 | ||
4094 | btrfs_init_map_token(&token, right); | ||
4096 | for (i = 0; i < nritems; i++) { | 4095 | for (i = 0; i < nritems; i++) { |
4097 | struct btrfs_item *item = btrfs_item_nr(i); | 4096 | struct btrfs_item *item = btrfs_item_nr(i); |
4098 | u32 ioff; | 4097 | u32 ioff; |
@@ -4576,8 +4575,6 @@ void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end) | |||
4576 | int i; | 4575 | int i; |
4577 | struct btrfs_map_token token; | 4576 | struct btrfs_map_token token; |
4578 | 4577 | ||
4579 | btrfs_init_map_token(&token); | ||
4580 | |||
4581 | leaf = path->nodes[0]; | 4578 | leaf = path->nodes[0]; |
4582 | slot = path->slots[0]; | 4579 | slot = path->slots[0]; |
4583 | 4580 | ||
@@ -4599,6 +4596,7 @@ void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end) | |||
4599 | * item0..itemN ... dataN.offset..dataN.size .. data0.size | 4596 | * item0..itemN ... dataN.offset..dataN.size .. data0.size |
4600 | */ | 4597 | */ |
4601 | /* first correct the data pointers */ | 4598 | /* first correct the data pointers */ |
4599 | btrfs_init_map_token(&token, leaf); | ||
4602 | for (i = slot; i < nritems; i++) { | 4600 | for (i = slot; i < nritems; i++) { |
4603 | u32 ioff; | 4601 | u32 ioff; |
4604 | item = btrfs_item_nr(i); | 4602 | item = btrfs_item_nr(i); |
@@ -4673,8 +4671,6 @@ void btrfs_extend_item(struct btrfs_path *path, u32 data_size) | |||
4673 | int i; | 4671 | int i; |
4674 | struct btrfs_map_token token; | 4672 | struct btrfs_map_token token; |
4675 | 4673 | ||
4676 | btrfs_init_map_token(&token); | ||
4677 | |||
4678 | leaf = path->nodes[0]; | 4674 | leaf = path->nodes[0]; |
4679 | 4675 | ||
4680 | nritems = btrfs_header_nritems(leaf); | 4676 | nritems = btrfs_header_nritems(leaf); |
@@ -4699,6 +4695,7 @@ void btrfs_extend_item(struct btrfs_path *path, u32 data_size) | |||
4699 | * item0..itemN ... dataN.offset..dataN.size .. data0.size | 4695 | * item0..itemN ... dataN.offset..dataN.size .. data0.size |
4700 | */ | 4696 | */ |
4701 | /* first correct the data pointers */ | 4697 | /* first correct the data pointers */ |
4698 | btrfs_init_map_token(&token, leaf); | ||
4702 | for (i = slot; i < nritems; i++) { | 4699 | for (i = slot; i < nritems; i++) { |
4703 | u32 ioff; | 4700 | u32 ioff; |
4704 | item = btrfs_item_nr(i); | 4701 | item = btrfs_item_nr(i); |
@@ -4750,8 +4747,6 @@ void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, | |||
4750 | } | 4747 | } |
4751 | btrfs_unlock_up_safe(path, 1); | 4748 | btrfs_unlock_up_safe(path, 1); |
4752 | 4749 | ||
4753 | btrfs_init_map_token(&token); | ||
4754 | |||
4755 | leaf = path->nodes[0]; | 4750 | leaf = path->nodes[0]; |
4756 | slot = path->slots[0]; | 4751 | slot = path->slots[0]; |
4757 | 4752 | ||
@@ -4765,6 +4760,7 @@ void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, | |||
4765 | BUG(); | 4760 | BUG(); |
4766 | } | 4761 | } |
4767 | 4762 | ||
4763 | btrfs_init_map_token(&token, leaf); | ||
4768 | if (slot != nritems) { | 4764 | if (slot != nritems) { |
4769 | unsigned int old_data = btrfs_item_end_nr(leaf, slot); | 4765 | unsigned int old_data = btrfs_item_end_nr(leaf, slot); |
4770 | 4766 | ||
@@ -4971,9 +4967,6 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
4971 | int wret; | 4967 | int wret; |
4972 | int i; | 4968 | int i; |
4973 | u32 nritems; | 4969 | u32 nritems; |
4974 | struct btrfs_map_token token; | ||
4975 | |||
4976 | btrfs_init_map_token(&token); | ||
4977 | 4970 | ||
4978 | leaf = path->nodes[0]; | 4971 | leaf = path->nodes[0]; |
4979 | last_off = btrfs_item_offset_nr(leaf, slot + nr - 1); | 4972 | last_off = btrfs_item_offset_nr(leaf, slot + nr - 1); |
@@ -4985,12 +4978,14 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
4985 | 4978 | ||
4986 | if (slot + nr != nritems) { | 4979 | if (slot + nr != nritems) { |
4987 | int data_end = leaf_data_end(leaf); | 4980 | int data_end = leaf_data_end(leaf); |
4981 | struct btrfs_map_token token; | ||
4988 | 4982 | ||
4989 | memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET + | 4983 | memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET + |
4990 | data_end + dsize, | 4984 | data_end + dsize, |
4991 | BTRFS_LEAF_DATA_OFFSET + data_end, | 4985 | BTRFS_LEAF_DATA_OFFSET + data_end, |
4992 | last_off - data_end); | 4986 | last_off - data_end); |
4993 | 4987 | ||
4988 | btrfs_init_map_token(&token, leaf); | ||
4994 | for (i = slot + nr; i < nritems; i++) { | 4989 | for (i = slot + nr; i < nritems; i++) { |
4995 | u32 ioff; | 4990 | u32 ioff; |
4996 | 4991 | ||
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 8e18fb062215..033a0d5d1789 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1303,8 +1303,10 @@ struct btrfs_map_token { | |||
1303 | #define BTRFS_BYTES_TO_BLKS(fs_info, bytes) \ | 1303 | #define BTRFS_BYTES_TO_BLKS(fs_info, bytes) \ |
1304 | ((bytes) >> (fs_info)->sb->s_blocksize_bits) | 1304 | ((bytes) >> (fs_info)->sb->s_blocksize_bits) |
1305 | 1305 | ||
1306 | static inline void btrfs_init_map_token (struct btrfs_map_token *token) | 1306 | static inline void btrfs_init_map_token(struct btrfs_map_token *token, |
1307 | struct extent_buffer *eb) | ||
1307 | { | 1308 | { |
1309 | token->eb = eb; | ||
1308 | token->kaddr = NULL; | 1310 | token->kaddr = NULL; |
1309 | } | 1311 | } |
1310 | 1312 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 07f77c7e6b22..e0e940fe01df 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -3890,7 +3890,7 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
3890 | { | 3890 | { |
3891 | struct btrfs_map_token token; | 3891 | struct btrfs_map_token token; |
3892 | 3892 | ||
3893 | btrfs_init_map_token(&token); | 3893 | btrfs_init_map_token(&token, leaf); |
3894 | 3894 | ||
3895 | btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token); | 3895 | btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token); |
3896 | btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token); | 3896 | btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token); |
diff --git a/fs/btrfs/struct-funcs.c b/fs/btrfs/struct-funcs.c index 3a29b911d2e2..73f7987143df 100644 --- a/fs/btrfs/struct-funcs.c +++ b/fs/btrfs/struct-funcs.c | |||
@@ -53,9 +53,9 @@ u##bits btrfs_get_token_##bits(const struct extent_buffer *eb, \ | |||
53 | u##bits res; \ | 53 | u##bits res; \ |
54 | \ | 54 | \ |
55 | ASSERT(token); \ | 55 | ASSERT(token); \ |
56 | ASSERT(token->eb == eb); \ | ||
56 | \ | 57 | \ |
57 | if (token->kaddr && token->offset <= offset && \ | 58 | if (token->kaddr && token->offset <= offset && \ |
58 | token->eb == eb && \ | ||
59 | (token->offset + PAGE_SIZE >= offset + size)) { \ | 59 | (token->offset + PAGE_SIZE >= offset + size)) { \ |
60 | kaddr = token->kaddr; \ | 60 | kaddr = token->kaddr; \ |
61 | p = kaddr + part_offset - token->offset; \ | 61 | p = kaddr + part_offset - token->offset; \ |
@@ -74,7 +74,6 @@ u##bits btrfs_get_token_##bits(const struct extent_buffer *eb, \ | |||
74 | res = get_unaligned_le##bits(p + off); \ | 74 | res = get_unaligned_le##bits(p + off); \ |
75 | token->kaddr = kaddr; \ | 75 | token->kaddr = kaddr; \ |
76 | token->offset = map_start; \ | 76 | token->offset = map_start; \ |
77 | token->eb = eb; \ | ||
78 | return res; \ | 77 | return res; \ |
79 | } \ | 78 | } \ |
80 | u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ | 79 | u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ |
@@ -117,9 +116,9 @@ void btrfs_set_token_##bits(struct extent_buffer *eb, \ | |||
117 | int size = sizeof(u##bits); \ | 116 | int size = sizeof(u##bits); \ |
118 | \ | 117 | \ |
119 | ASSERT(token); \ | 118 | ASSERT(token); \ |
119 | ASSERT(token->eb == eb); \ | ||
120 | \ | 120 | \ |
121 | if (token->kaddr && token->offset <= offset && \ | 121 | if (token->kaddr && token->offset <= offset && \ |
122 | token->eb == eb && \ | ||
123 | (token->offset + PAGE_SIZE >= offset + size)) { \ | 122 | (token->offset + PAGE_SIZE >= offset + size)) { \ |
124 | kaddr = token->kaddr; \ | 123 | kaddr = token->kaddr; \ |
125 | p = kaddr + part_offset - token->offset; \ | 124 | p = kaddr + part_offset - token->offset; \ |
@@ -139,7 +138,6 @@ void btrfs_set_token_##bits(struct extent_buffer *eb, \ | |||
139 | put_unaligned_le##bits(val, p + off); \ | 138 | put_unaligned_le##bits(val, p + off); \ |
140 | token->kaddr = kaddr; \ | 139 | token->kaddr = kaddr; \ |
141 | token->offset = map_start; \ | 140 | token->offset = map_start; \ |
142 | token->eb = eb; \ | ||
143 | } \ | 141 | } \ |
144 | void btrfs_set_##bits(struct extent_buffer *eb, void *ptr, \ | 142 | void btrfs_set_##bits(struct extent_buffer *eb, void *ptr, \ |
145 | unsigned long off, u##bits val) \ | 143 | unsigned long off, u##bits val) \ |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 7a0e3f8dec5c..77b6797fcac3 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -506,7 +506,7 @@ insert: | |||
506 | ino_size != 0) { | 506 | ino_size != 0) { |
507 | struct btrfs_map_token token; | 507 | struct btrfs_map_token token; |
508 | 508 | ||
509 | btrfs_init_map_token(&token); | 509 | btrfs_init_map_token(&token, dst_eb); |
510 | btrfs_set_token_inode_size(dst_eb, dst_item, | 510 | btrfs_set_token_inode_size(dst_eb, dst_item, |
511 | ino_size, &token); | 511 | ino_size, &token); |
512 | } | 512 | } |
@@ -3842,7 +3842,7 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
3842 | { | 3842 | { |
3843 | struct btrfs_map_token token; | 3843 | struct btrfs_map_token token; |
3844 | 3844 | ||
3845 | btrfs_init_map_token(&token); | 3845 | btrfs_init_map_token(&token, leaf); |
3846 | 3846 | ||
3847 | if (log_inode_only) { | 3847 | if (log_inode_only) { |
3848 | /* set the generation to zero so the recover code | 3848 | /* set the generation to zero so the recover code |
@@ -4302,8 +4302,6 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
4302 | if (ret) | 4302 | if (ret) |
4303 | return ret; | 4303 | return ret; |
4304 | 4304 | ||
4305 | btrfs_init_map_token(&token); | ||
4306 | |||
4307 | ret = __btrfs_drop_extents(trans, log, &inode->vfs_inode, path, em->start, | 4305 | ret = __btrfs_drop_extents(trans, log, &inode->vfs_inode, path, em->start, |
4308 | em->start + em->len, NULL, 0, 1, | 4306 | em->start + em->len, NULL, 0, 1, |
4309 | sizeof(*fi), &extent_inserted); | 4307 | sizeof(*fi), &extent_inserted); |
@@ -4321,6 +4319,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
4321 | return ret; | 4319 | return ret; |
4322 | } | 4320 | } |
4323 | leaf = path->nodes[0]; | 4321 | leaf = path->nodes[0]; |
4322 | btrfs_init_map_token(&token, leaf); | ||
4324 | fi = btrfs_item_ptr(leaf, path->slots[0], | 4323 | fi = btrfs_item_ptr(leaf, path->slots[0], |
4325 | struct btrfs_file_extent_item); | 4324 | struct btrfs_file_extent_item); |
4326 | 4325 | ||