summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r--fs/btrfs/ctree.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index d92462fe66c8..f64aad613727 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1016,19 +1016,21 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
1016 parent_start = parent->start; 1016 parent_start = parent->start;
1017 1017
1018 /* 1018 /*
1019 * If we are COWing a node/leaf from the extent, chunk or device trees, 1019 * If we are COWing a node/leaf from the extent, chunk, device or free
1020 * make sure that we do not finish block group creation of pending block 1020 * space trees, make sure that we do not finish block group creation of
1021 * groups. We do this to avoid a deadlock. 1021 * pending block groups. We do this to avoid a deadlock.
1022 * COWing can result in allocation of a new chunk, and flushing pending 1022 * COWing can result in allocation of a new chunk, and flushing pending
1023 * block groups (btrfs_create_pending_block_groups()) can be triggered 1023 * block groups (btrfs_create_pending_block_groups()) can be triggered
1024 * when finishing allocation of a new chunk. Creation of a pending block 1024 * when finishing allocation of a new chunk. Creation of a pending block
1025 * group modifies the extent, chunk and device trees, therefore we could 1025 * group modifies the extent, chunk, device and free space trees,
1026 * deadlock with ourselves since we are holding a lock on an extent 1026 * therefore we could deadlock with ourselves since we are holding a
1027 * buffer that btrfs_create_pending_block_groups() may try to COW later. 1027 * lock on an extent buffer that btrfs_create_pending_block_groups() may
1028 * try to COW later.
1028 */ 1029 */
1029 if (root == fs_info->extent_root || 1030 if (root == fs_info->extent_root ||
1030 root == fs_info->chunk_root || 1031 root == fs_info->chunk_root ||
1031 root == fs_info->dev_root) 1032 root == fs_info->dev_root ||
1033 root == fs_info->free_space_root)
1032 trans->can_flush_pending_bgs = false; 1034 trans->can_flush_pending_bgs = false;
1033 1035
1034 cow = btrfs_alloc_tree_block(trans, root, parent_start, 1036 cow = btrfs_alloc_tree_block(trans, root, parent_start,