Skip to content

Commit 263d399

Browse files
committed
Btrfs: try harder to migrate items to left sibling before splitting a leaf
Before attempting to split a leaf we try to migrate items from the leaf to its right and left siblings. We start by trying to move items into the rigth sibling and, if the new item is meant to be inserted at the end of our leaf, we try to free from our leaf an amount of bytes equal to the number of bytes used by the new item, by setting the variable space_needed to the byte size of that new item. However if we fail to move enough items to the right sibling due to lack of space in that sibling, we then try to move items into the left sibling, and in that case we try to free an amount equal to the size of the new item from our leaf, when we need only to free an amount corresponding to the size of the new item minus the current free space of our leaf. So make sure that before we try to move items to the left sibling we do set the variable space_needed with a value corresponding to the new item's size minus the leaf's current free space. Signed-off-by: Filipe Manana <[email protected]> Reviewed-by: Liu Bo <[email protected]>
1 parent 76b42ab commit 263d399

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

fs/btrfs/ctree.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4159,6 +4159,9 @@ static noinline int push_for_double_split(struct btrfs_trans_handle *trans,
41594159

41604160
/* try to push all the items before our slot into the next leaf */
41614161
slot = path->slots[0];
4162+
space_needed = data_size;
4163+
if (slot > 0)
4164+
space_needed -= btrfs_leaf_free_space(fs_info, path->nodes[0]);
41624165
ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot);
41634166
if (ret < 0)
41644167
return ret;
@@ -4214,6 +4217,10 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans,
42144217
if (wret < 0)
42154218
return wret;
42164219
if (wret) {
4220+
space_needed = data_size;
4221+
if (slot > 0)
4222+
space_needed -= btrfs_leaf_free_space(fs_info,
4223+
l);
42174224
wret = push_leaf_left(trans, root, path, space_needed,
42184225
space_needed, 0, (u32)-1);
42194226
if (wret < 0)

0 commit comments

Comments
 (0)