diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 16 |
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, |