diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 8686a3d2ab3a..dbb724124633 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -949,6 +949,10 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
949 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) | 949 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) |
950 | return 0; | 950 | return 0; |
951 | 951 | ||
952 | if (trans->transaction->delayed_refs.flushing && | ||
953 | btrfs_header_nritems(mid) > 2) | ||
954 | return 0; | ||
955 | |||
952 | if (btrfs_header_nritems(mid) < 2) | 956 | if (btrfs_header_nritems(mid) < 2) |
953 | err_on_enospc = 1; | 957 | err_on_enospc = 1; |
954 | 958 | ||
@@ -2159,7 +2163,7 @@ static noinline int split_node(struct btrfs_trans_handle *trans, | |||
2159 | ret = insert_new_root(trans, root, path, level + 1); | 2163 | ret = insert_new_root(trans, root, path, level + 1); |
2160 | if (ret) | 2164 | if (ret) |
2161 | return ret; | 2165 | return ret; |
2162 | } else { | 2166 | } else if (!trans->transaction->delayed_refs.flushing) { |
2163 | ret = push_nodes_for_insert(trans, root, path, level); | 2167 | ret = push_nodes_for_insert(trans, root, path, level); |
2164 | c = path->nodes[level]; | 2168 | c = path->nodes[level]; |
2165 | if (!ret && btrfs_header_nritems(c) < | 2169 | if (!ret && btrfs_header_nritems(c) < |
@@ -2848,7 +2852,8 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans, | |||
2848 | int num_doubles = 0; | 2852 | int num_doubles = 0; |
2849 | 2853 | ||
2850 | /* first try to make some room by pushing left and right */ | 2854 | /* first try to make some room by pushing left and right */ |
2851 | if (data_size && ins_key->type != BTRFS_DIR_ITEM_KEY) { | 2855 | if (data_size && ins_key->type != BTRFS_DIR_ITEM_KEY && |
2856 | !trans->transaction->delayed_refs.flushing) { | ||
2852 | wret = push_leaf_right(trans, root, path, data_size, 0); | 2857 | wret = push_leaf_right(trans, root, path, data_size, 0); |
2853 | if (wret < 0) | 2858 | if (wret < 0) |
2854 | return wret; | 2859 | return wret; |
@@ -3786,7 +3791,8 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3786 | } | 3791 | } |
3787 | 3792 | ||
3788 | /* delete the leaf if it is mostly empty */ | 3793 | /* delete the leaf if it is mostly empty */ |
3789 | if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) { | 3794 | if (used < BTRFS_LEAF_DATA_SIZE(root) / 4 && |
3795 | !trans->transaction->delayed_refs.flushing) { | ||
3790 | /* push_leaf_left fixes the path. | 3796 | /* push_leaf_left fixes the path. |
3791 | * make sure the path still points to our leaf | 3797 | * make sure the path still points to our leaf |
3792 | * for possible call to del_ptr below | 3798 | * for possible call to del_ptr below |