diff options
Diffstat (limited to 'fs/btrfs/relocation.c')
-rw-r--r-- | fs/btrfs/relocation.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 59bb1764273d..24d654ce7a06 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -2041,8 +2041,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc, | |||
2041 | BUG_ON(IS_ERR(trans)); | 2041 | BUG_ON(IS_ERR(trans)); |
2042 | trans->block_rsv = rc->block_rsv; | 2042 | trans->block_rsv = rc->block_rsv; |
2043 | 2043 | ||
2044 | ret = btrfs_block_rsv_check(trans, root, rc->block_rsv, | 2044 | ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved); |
2045 | min_reserved, 0); | ||
2046 | if (ret) { | 2045 | if (ret) { |
2047 | BUG_ON(ret != -EAGAIN); | 2046 | BUG_ON(ret != -EAGAIN); |
2048 | ret = btrfs_commit_transaction(trans, root); | 2047 | ret = btrfs_commit_transaction(trans, root); |
@@ -2152,8 +2151,7 @@ int prepare_to_merge(struct reloc_control *rc, int err) | |||
2152 | again: | 2151 | again: |
2153 | if (!err) { | 2152 | if (!err) { |
2154 | num_bytes = rc->merging_rsv_size; | 2153 | num_bytes = rc->merging_rsv_size; |
2155 | ret = btrfs_block_rsv_add(NULL, root, rc->block_rsv, | 2154 | ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes); |
2156 | num_bytes); | ||
2157 | if (ret) | 2155 | if (ret) |
2158 | err = ret; | 2156 | err = ret; |
2159 | } | 2157 | } |
@@ -2427,7 +2425,7 @@ static int reserve_metadata_space(struct btrfs_trans_handle *trans, | |||
2427 | num_bytes = calcu_metadata_size(rc, node, 1) * 2; | 2425 | num_bytes = calcu_metadata_size(rc, node, 1) * 2; |
2428 | 2426 | ||
2429 | trans->block_rsv = rc->block_rsv; | 2427 | trans->block_rsv = rc->block_rsv; |
2430 | ret = btrfs_block_rsv_add(trans, root, rc->block_rsv, num_bytes); | 2428 | ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes); |
2431 | if (ret) { | 2429 | if (ret) { |
2432 | if (ret == -EAGAIN) | 2430 | if (ret == -EAGAIN) |
2433 | rc->commit_transaction = 1; | 2431 | rc->commit_transaction = 1; |
@@ -2922,6 +2920,7 @@ static int relocate_file_extent_cluster(struct inode *inode, | |||
2922 | unsigned long last_index; | 2920 | unsigned long last_index; |
2923 | struct page *page; | 2921 | struct page *page; |
2924 | struct file_ra_state *ra; | 2922 | struct file_ra_state *ra; |
2923 | gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping); | ||
2925 | int nr = 0; | 2924 | int nr = 0; |
2926 | int ret = 0; | 2925 | int ret = 0; |
2927 | 2926 | ||
@@ -2956,7 +2955,7 @@ static int relocate_file_extent_cluster(struct inode *inode, | |||
2956 | ra, NULL, index, | 2955 | ra, NULL, index, |
2957 | last_index + 1 - index); | 2956 | last_index + 1 - index); |
2958 | page = find_or_create_page(inode->i_mapping, index, | 2957 | page = find_or_create_page(inode->i_mapping, index, |
2959 | GFP_NOFS); | 2958 | mask); |
2960 | if (!page) { | 2959 | if (!page) { |
2961 | btrfs_delalloc_release_metadata(inode, | 2960 | btrfs_delalloc_release_metadata(inode, |
2962 | PAGE_CACHE_SIZE); | 2961 | PAGE_CACHE_SIZE); |
@@ -3323,8 +3322,11 @@ static int find_data_references(struct reloc_control *rc, | |||
3323 | } | 3322 | } |
3324 | 3323 | ||
3325 | key.objectid = ref_objectid; | 3324 | key.objectid = ref_objectid; |
3326 | key.offset = ref_offset; | ||
3327 | key.type = BTRFS_EXTENT_DATA_KEY; | 3325 | key.type = BTRFS_EXTENT_DATA_KEY; |
3326 | if (ref_offset > ((u64)-1 << 32)) | ||
3327 | key.offset = 0; | ||
3328 | else | ||
3329 | key.offset = ref_offset; | ||
3328 | 3330 | ||
3329 | path->search_commit_root = 1; | 3331 | path->search_commit_root = 1; |
3330 | path->skip_locking = 1; | 3332 | path->skip_locking = 1; |
@@ -3645,14 +3647,11 @@ int prepare_to_relocate(struct reloc_control *rc) | |||
3645 | * btrfs_init_reloc_root will use them when there | 3647 | * btrfs_init_reloc_root will use them when there |
3646 | * is no reservation in transaction handle. | 3648 | * is no reservation in transaction handle. |
3647 | */ | 3649 | */ |
3648 | ret = btrfs_block_rsv_add(NULL, rc->extent_root, rc->block_rsv, | 3650 | ret = btrfs_block_rsv_add(rc->extent_root, rc->block_rsv, |
3649 | rc->extent_root->nodesize * 256); | 3651 | rc->extent_root->nodesize * 256); |
3650 | if (ret) | 3652 | if (ret) |
3651 | return ret; | 3653 | return ret; |
3652 | 3654 | ||
3653 | rc->block_rsv->refill_used = 1; | ||
3654 | btrfs_add_durable_block_rsv(rc->extent_root->fs_info, rc->block_rsv); | ||
3655 | |||
3656 | memset(&rc->cluster, 0, sizeof(rc->cluster)); | 3655 | memset(&rc->cluster, 0, sizeof(rc->cluster)); |
3657 | rc->search_start = rc->block_group->key.objectid; | 3656 | rc->search_start = rc->block_group->key.objectid; |
3658 | rc->extents_found = 0; | 3657 | rc->extents_found = 0; |
@@ -3777,8 +3776,7 @@ restart: | |||
3777 | } | 3776 | } |
3778 | } | 3777 | } |
3779 | 3778 | ||
3780 | ret = btrfs_block_rsv_check(trans, rc->extent_root, | 3779 | ret = btrfs_block_rsv_check(rc->extent_root, rc->block_rsv, 5); |
3781 | rc->block_rsv, 0, 5); | ||
3782 | if (ret < 0) { | 3780 | if (ret < 0) { |
3783 | if (ret != -EAGAIN) { | 3781 | if (ret != -EAGAIN) { |
3784 | err = ret; | 3782 | err = ret; |