From 39feace42ecc87743b42a0ff46ebc9718502774e Mon Sep 17 00:00:00 2001 From: Jonathan Earl Brassow Date: Tue, 13 Sep 2011 18:42:57 +0000 Subject: [PATCH] Fix for bug 737200 - Can't create mirrored-log mirror on a VG with small extents Kernel requires a mirror to be at least 1 region large. So, if our mirror log is itself a mirror, it must be at least 1 region large. This restriction may not be necessary for non-mirrored logs, but we apply the rule anyway. (The other option is to make the region size of the log mirror smaller than the mirror it is acting as a log for, but that really complicates things. It's much easier to keep the region_size the same for both.) --- WHATS_NEW | 1 + lib/metadata/lv_manip.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/WHATS_NEW b/WHATS_NEW index b7a499470..dc3de424c 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.89 - ================================== + Fix mirrored log creation when PE size is small - force log_size >= region_size Fix improper RAID 64-bit status flag reset when and'ing against 32-bit flag. Fix log size calculation when only a log is being added to a mirror. Work around resume_lv causing error LV scanning during splitmirror operation. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 6870c685a..64aebcfa6 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -687,8 +687,21 @@ static uint32_t mirror_log_extents(uint32_t region_size, uint32_t pe_size, uint3 /* Log device holds both header and bitset. */ log_size = dm_round_up((MIRROR_LOG_OFFSET << SECTOR_SHIFT) + bitset_size, 1 << SECTOR_SHIFT); log_size >>= SECTOR_SHIFT; + log_size = dm_div_up(log_size, pe_size); - return dm_div_up(log_size, pe_size); + /* + * Kernel requires a mirror to be at least 1 region large. So, + * if our mirror log is itself a mirror, it must be at least + * 1 region large. This restriction may not be necessary for + * non-mirrored logs, but we apply the rule anyway. + * + * (The other option is to make the region size of the log + * mirror smaller than the mirror it is acting as a log for, + * but that really complicates things. It's much easier to + * keep the region_size the same for both.) + */ + return (log_size > (region_size / pe_size)) ? log_size : + (region_size / pe_size); } /* -- 2.43.5