summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2019-08-09 11:48:21 -0400
committerDavid Sterba <dsterba@suse.com>2019-09-09 08:59:16 -0400
commitc82f823c9b006c31059341af41da9f8b2e3e64d9 (patch)
treeb6b9204325f78f83df3a1a871ee4a7abc6e29b07
parent48bc39501a549ec978c8aad28eb89ca3a2a7ca03 (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.c27
-rw-r--r--fs/btrfs/ctree.h4
-rw-r--r--fs/btrfs/inode.c2
-rw-r--r--fs/btrfs/struct-funcs.c6
-rw-r--r--fs/btrfs/tree-log.c7
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
1306static inline void btrfs_init_map_token (struct btrfs_map_token *token) 1306static 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} \
80u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ 79u##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} \
144void btrfs_set_##bits(struct extent_buffer *eb, void *ptr, \ 142void 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