|
@@ -4829,10 +4829,13 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
|
|
|
ndevs = min(ndevs, devs_max);
|
|
|
|
|
|
/*
|
|
|
- * the primary goal is to maximize the number of stripes, so use as many
|
|
|
- * devices as possible, even if the stripes are not maximum sized.
|
|
|
+ * The primary goal is to maximize the number of stripes, so use as
|
|
|
+ * many devices as possible, even if the stripes are not maximum sized.
|
|
|
+ *
|
|
|
+ * The DUP profile stores more than one stripe per device, the
|
|
|
+ * max_avail is the total size so we have to adjust.
|
|
|
*/
|
|
|
- stripe_size = devices_info[ndevs-1].max_avail;
|
|
|
+ stripe_size = div_u64(devices_info[ndevs - 1].max_avail, dev_stripes);
|
|
|
num_stripes = ndevs * dev_stripes;
|
|
|
|
|
|
/*
|
|
@@ -4867,8 +4870,6 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
|
|
|
stripe_size = devices_info[ndevs-1].max_avail;
|
|
|
}
|
|
|
|
|
|
- stripe_size = div_u64(stripe_size, dev_stripes);
|
|
|
-
|
|
|
/* align to BTRFS_STRIPE_LEN */
|
|
|
stripe_size = round_down(stripe_size, BTRFS_STRIPE_LEN);
|
|
|
|