提交 971a1f66 编写于 作者: C Chris Mason

Btrfs: Don't empty the middle buffer in push_nodes_for_insert

Signed-off-by: NChris Mason <chris.mason@oracle.com>
上级 c448acf0
...@@ -29,7 +29,7 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root ...@@ -29,7 +29,7 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
struct btrfs_path *path, int data_size, int extend); struct btrfs_path *path, int data_size, int extend);
static int push_node_left(struct btrfs_trans_handle *trans, static int push_node_left(struct btrfs_trans_handle *trans,
struct btrfs_root *root, struct extent_buffer *dst, struct btrfs_root *root, struct extent_buffer *dst,
struct extent_buffer *src); struct extent_buffer *src, int empty);
static int balance_node_right(struct btrfs_trans_handle *trans, static int balance_node_right(struct btrfs_trans_handle *trans,
struct btrfs_root *root, struct btrfs_root *root,
struct extent_buffer *dst_buf, struct extent_buffer *dst_buf,
...@@ -789,7 +789,7 @@ static int balance_level(struct btrfs_trans_handle *trans, ...@@ -789,7 +789,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
/* first, try to make some room in the middle buffer */ /* first, try to make some room in the middle buffer */
if (left) { if (left) {
orig_slot += btrfs_header_nritems(left); orig_slot += btrfs_header_nritems(left);
wret = push_node_left(trans, root, left, mid); wret = push_node_left(trans, root, left, mid, 0);
if (wret < 0) if (wret < 0)
ret = wret; ret = wret;
if (btrfs_header_nritems(mid) < 2) if (btrfs_header_nritems(mid) < 2)
...@@ -800,7 +800,7 @@ static int balance_level(struct btrfs_trans_handle *trans, ...@@ -800,7 +800,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
* then try to empty the right most buffer into the middle * then try to empty the right most buffer into the middle
*/ */
if (right) { if (right) {
wret = push_node_left(trans, root, mid, right); wret = push_node_left(trans, root, mid, right, 1);
if (wret < 0 && wret != -ENOSPC) if (wret < 0 && wret != -ENOSPC)
ret = wret; ret = wret;
if (btrfs_header_nritems(right) == 0) { if (btrfs_header_nritems(right) == 0) {
...@@ -941,7 +941,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans, ...@@ -941,7 +941,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
wret = 1; wret = 1;
else { else {
wret = push_node_left(trans, root, wret = push_node_left(trans, root,
left, mid); left, mid, 0);
} }
} }
if (wret < 0) if (wret < 0)
...@@ -1239,7 +1239,7 @@ static int fixup_low_keys(struct btrfs_trans_handle *trans, ...@@ -1239,7 +1239,7 @@ static int fixup_low_keys(struct btrfs_trans_handle *trans,
*/ */
static int push_node_left(struct btrfs_trans_handle *trans, static int push_node_left(struct btrfs_trans_handle *trans,
struct btrfs_root *root, struct extent_buffer *dst, struct btrfs_root *root, struct extent_buffer *dst,
struct extent_buffer *src) struct extent_buffer *src, int empty)
{ {
int push_items = 0; int push_items = 0;
int src_nritems; int src_nritems;
...@@ -1252,12 +1252,17 @@ static int push_node_left(struct btrfs_trans_handle *trans, ...@@ -1252,12 +1252,17 @@ static int push_node_left(struct btrfs_trans_handle *trans,
WARN_ON(btrfs_header_generation(src) != trans->transid); WARN_ON(btrfs_header_generation(src) != trans->transid);
WARN_ON(btrfs_header_generation(dst) != trans->transid); WARN_ON(btrfs_header_generation(dst) != trans->transid);
if (!empty && src_nritems <= 2)
return 1;
if (push_items <= 0) { if (push_items <= 0) {
return 1; return 1;
} }
if (src_nritems < push_items) if (empty)
push_items = src_nritems; push_items = min(src_nritems, push_items);
else
push_items = min(src_nritems - 2, push_items);
copy_extent_buffer(dst, src, copy_extent_buffer(dst, src,
btrfs_node_key_ptr_offset(dst_nritems), btrfs_node_key_ptr_offset(dst_nritems),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册