Skip to content

Commit 86db257

Browse files
author
Chris Mason
committed
Btrfs: fix max chunk size on raid5/6
We try to limit the size of a chunk to 10GB, which keeps the unit of work reasonable during balance and resize operations. The limit checks were taking into account the number of copies of the data we had but what they really should be doing is comparing against the logical size of the chunk we're creating. This moves the code around a little to use the count of data stripes from raid5/6. Signed-off-by: Chris Mason <chris.mason@fusionio.com>
1 parent 24542bf commit 86db257

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

fs/btrfs/volumes.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3837,10 +3837,6 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
38373837
*/
38383838
data_stripes = num_stripes / ncopies;
38393839

3840-
if (stripe_size * ndevs > max_chunk_size * ncopies) {
3841-
stripe_size = max_chunk_size * ncopies;
3842-
do_div(stripe_size, ndevs);
3843-
}
38443840
if (type & BTRFS_BLOCK_GROUP_RAID5) {
38453841
raid_stripe_len = find_raid56_stripe_len(ndevs - 1,
38463842
btrfs_super_stripesize(info->super_copy));
@@ -3851,6 +3847,27 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
38513847
btrfs_super_stripesize(info->super_copy));
38523848
data_stripes = num_stripes - 2;
38533849
}
3850+
3851+
/*
3852+
* Use the number of data stripes to figure out how big this chunk
3853+
* is really going to be in terms of logical address space,
3854+
* and compare that answer with the max chunk size
3855+
*/
3856+
if (stripe_size * data_stripes > max_chunk_size) {
3857+
u64 mask = (1ULL << 24) - 1;
3858+
stripe_size = max_chunk_size;
3859+
do_div(stripe_size, data_stripes);
3860+
3861+
/* bump the answer up to a 16MB boundary */
3862+
stripe_size = (stripe_size + mask) & ~mask;
3863+
3864+
/* but don't go higher than the limits we found
3865+
* while searching for free extents
3866+
*/
3867+
if (stripe_size > devices_info[ndevs-1].max_avail)
3868+
stripe_size = devices_info[ndevs-1].max_avail;
3869+
}
3870+
38543871
do_div(stripe_size, dev_stripes);
38553872

38563873
/* align to BTRFS_STRIPE_LEN */

0 commit comments

Comments
 (0)