diff options
Diffstat (limited to 'fs/btrfs/free-space-cache.c')
-rw-r--r-- | fs/btrfs/free-space-cache.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 0bc93657b460..4538e48581a5 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -579,6 +579,7 @@ out: | |||
579 | * it returns -enospc | 579 | * it returns -enospc |
580 | */ | 580 | */ |
581 | int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | 581 | int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, |
582 | struct btrfs_root *root, | ||
582 | struct btrfs_block_group_cache *block_group, | 583 | struct btrfs_block_group_cache *block_group, |
583 | struct btrfs_free_cluster *cluster, | 584 | struct btrfs_free_cluster *cluster, |
584 | u64 offset, u64 bytes, u64 empty_size) | 585 | u64 offset, u64 bytes, u64 empty_size) |
@@ -595,7 +596,9 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | |||
595 | int ret; | 596 | int ret; |
596 | 597 | ||
597 | /* for metadata, allow allocates with more holes */ | 598 | /* for metadata, allow allocates with more holes */ |
598 | if (block_group->flags & BTRFS_BLOCK_GROUP_METADATA) { | 599 | if (btrfs_test_opt(root, SSD_SPREAD)) { |
600 | min_bytes = bytes + empty_size; | ||
601 | } else if (block_group->flags & BTRFS_BLOCK_GROUP_METADATA) { | ||
599 | /* | 602 | /* |
600 | * we want to do larger allocations when we are | 603 | * we want to do larger allocations when we are |
601 | * flushing out the delayed refs, it helps prevent | 604 | * flushing out the delayed refs, it helps prevent |
@@ -645,14 +648,15 @@ again: | |||
645 | * we haven't filled the empty size and the window is | 648 | * we haven't filled the empty size and the window is |
646 | * very large. reset and try again | 649 | * very large. reset and try again |
647 | */ | 650 | */ |
648 | if (next->offset - window_start > (bytes + empty_size) * 2) { | 651 | if (next->offset - (last->offset + last->bytes) > 128 * 1024 || |
652 | next->offset - window_start > (bytes + empty_size) * 2) { | ||
649 | entry = next; | 653 | entry = next; |
650 | window_start = entry->offset; | 654 | window_start = entry->offset; |
651 | window_free = entry->bytes; | 655 | window_free = entry->bytes; |
652 | last = entry; | 656 | last = entry; |
653 | max_extent = 0; | 657 | max_extent = 0; |
654 | total_retries++; | 658 | total_retries++; |
655 | if (total_retries % 256 == 0) { | 659 | if (total_retries % 64 == 0) { |
656 | if (min_bytes >= (bytes + empty_size)) { | 660 | if (min_bytes >= (bytes + empty_size)) { |
657 | ret = -ENOSPC; | 661 | ret = -ENOSPC; |
658 | goto out; | 662 | goto out; |