summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-10-09 14:34:10 +0200
committerHeinz Mauelshagen <heinzm@redhat.com>2017-10-09 14:35:06 +0200
commit5f13e33d541f7af77f586ac55edfed336ad8dcc1 (patch)
tree38795eaf913a6b2cc1d43b8a7467ef3007ff6645
parent2f754b73ffdaa95af4a6d703e31b76d4efbf7a36 (diff)
downloadlvm2-5f13e33d541f7af77f586ac55edfed336ad8dcc1.tar.gz
lvcreate: fix region size on striped RaidLVs
Creating striped RaidLVs with lv size not divisible by region size caused the region size to be adjusted: # lvcreate --type raid5 -n region_check.32.00m_3 -i 3 -L 1g --nosync -R 32.00m raid_sanity Using default stripesize 64.00 KiB. Rounding size 1.00 GiB (256 extents) up to stripe boundary size <1.01 GiB(258 extents). WARNING: New raid5 won't be synchronised. Don't read what you didn't write! Using reduced mirror region size of 8.00 MiB Logical volume region_check.32.00m_3 created. Fix by not imposing "mirror" constraints on "raid". Resolves: rhbz1404007
-rw-r--r--lib/metadata/lv_manip.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 1851783bf..719fcba5b 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -7536,11 +7536,18 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
status |= LV_NOTSYNCED;
}
- lp->region_size = adjusted_mirror_region_size(vg->cmd,
- vg->extent_size,
- lp->extents,
- lp->region_size, 0,
- vg_is_clustered(vg));
+ if (seg_is_raid(lp)) {
+ /* Value raid target constraint */
+ if (lp->region_size > (uint64_t)vg->extent_size * lp->extents) {
+ log_error("Cannot create RAID LV with region size larger than LV size.");
+ return NULL;
+ }
+ } else
+ lp->region_size = adjusted_mirror_region_size(vg->cmd,
+ vg->extent_size,
+ lp->extents,
+ lp->region_size, 0,
+ vg_is_clustered(vg));
} else if (pool_lv && seg_is_thin_volume(lp)) {
if (!lv_is_thin_pool(pool_lv)) {
log_error("Logical volume %s is not a thin pool.",