diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 11ba82e43e8b..0236de711989 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -7950,6 +7950,7 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
7950 | struct btrfs_space_info *space_info; | 7950 | struct btrfs_space_info *space_info; |
7951 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; | 7951 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; |
7952 | struct btrfs_device *device; | 7952 | struct btrfs_device *device; |
7953 | struct btrfs_trans_handle *trans; | ||
7953 | u64 min_free; | 7954 | u64 min_free; |
7954 | u64 dev_min = 1; | 7955 | u64 dev_min = 1; |
7955 | u64 dev_nr = 0; | 7956 | u64 dev_nr = 0; |
@@ -8036,6 +8037,13 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
8036 | do_div(min_free, dev_min); | 8037 | do_div(min_free, dev_min); |
8037 | } | 8038 | } |
8038 | 8039 | ||
8040 | /* We need to do this so that we can look at pending chunks */ | ||
8041 | trans = btrfs_join_transaction(root); | ||
8042 | if (IS_ERR(trans)) { | ||
8043 | ret = PTR_ERR(trans); | ||
8044 | goto out; | ||
8045 | } | ||
8046 | |||
8039 | mutex_lock(&root->fs_info->chunk_mutex); | 8047 | mutex_lock(&root->fs_info->chunk_mutex); |
8040 | list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) { | 8048 | list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) { |
8041 | u64 dev_offset; | 8049 | u64 dev_offset; |
@@ -8046,7 +8054,7 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
8046 | */ | 8054 | */ |
8047 | if (device->total_bytes > device->bytes_used + min_free && | 8055 | if (device->total_bytes > device->bytes_used + min_free && |
8048 | !device->is_tgtdev_for_dev_replace) { | 8056 | !device->is_tgtdev_for_dev_replace) { |
8049 | ret = find_free_dev_extent(device, min_free, | 8057 | ret = find_free_dev_extent(trans, device, min_free, |
8050 | &dev_offset, NULL); | 8058 | &dev_offset, NULL); |
8051 | if (!ret) | 8059 | if (!ret) |
8052 | dev_nr++; | 8060 | dev_nr++; |
@@ -8058,6 +8066,7 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
8058 | } | 8066 | } |
8059 | } | 8067 | } |
8060 | mutex_unlock(&root->fs_info->chunk_mutex); | 8068 | mutex_unlock(&root->fs_info->chunk_mutex); |
8069 | btrfs_end_transaction(trans, root); | ||
8061 | out: | 8070 | out: |
8062 | btrfs_put_block_group(block_group); | 8071 | btrfs_put_block_group(block_group); |
8063 | return ret; | 8072 | return ret; |
@@ -8423,6 +8432,10 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | |||
8423 | sizeof(item)); | 8432 | sizeof(item)); |
8424 | if (ret) | 8433 | if (ret) |
8425 | btrfs_abort_transaction(trans, extent_root, ret); | 8434 | btrfs_abort_transaction(trans, extent_root, ret); |
8435 | ret = btrfs_finish_chunk_alloc(trans, extent_root, | ||
8436 | key.objectid, key.offset); | ||
8437 | if (ret) | ||
8438 | btrfs_abort_transaction(trans, extent_root, ret); | ||
8426 | } | 8439 | } |
8427 | } | 8440 | } |
8428 | 8441 | ||