|
@@ -3298,14 +3298,21 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
|
|
|
*/
|
|
|
static int leaf_space_used(struct extent_buffer *l, int start, int nr)
|
|
|
{
|
|
|
+ struct btrfs_item *start_item;
|
|
|
+ struct btrfs_item *end_item;
|
|
|
+ struct btrfs_map_token token;
|
|
|
int data_len;
|
|
|
int nritems = btrfs_header_nritems(l);
|
|
|
int end = min(nritems, start + nr) - 1;
|
|
|
|
|
|
if (!nr)
|
|
|
return 0;
|
|
|
- data_len = btrfs_item_end_nr(l, start);
|
|
|
- data_len = data_len - btrfs_item_offset_nr(l, end);
|
|
|
+ btrfs_init_map_token(&token);
|
|
|
+ start_item = btrfs_item_nr(l, start);
|
|
|
+ end_item = btrfs_item_nr(l, end);
|
|
|
+ data_len = btrfs_token_item_offset(l, start_item, &token) +
|
|
|
+ btrfs_token_item_size(l, start_item, &token);
|
|
|
+ data_len = data_len - btrfs_token_item_offset(l, end_item, &token);
|
|
|
data_len += sizeof(struct btrfs_item) * nr;
|
|
|
WARN_ON(data_len < 0);
|
|
|
return data_len;
|