[lvm-devel] [PATCH 1/4] Fix extent rounding for striped segments.
Milan Broz
mbroz at redhat.com
Thu Jun 9 14:30:28 UTC 2011
We should never remove more extents than requested by user,
so round up to next stripe boundary during lvreduce.
Also this fixes round to zero sized LV bug:
# lvcreate -i2 -I 64k -l10 -n lvs vg_test
# lvreduce -f -l1 vg_test/lvs
Rounding size (1 extents) down to stripe boundary size for segment (0 extents)
WARNING: Reducing active logical volume to 0
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Reducing logical volume lvs to 0
Failed to suspend lvs
Signed-off-by: Milan Broz <mbroz at redhat.com>
---
test/t-lvextend-percent-extents.sh | 5 +++++
tools/lvresize.c | 10 ++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/test/t-lvextend-percent-extents.sh b/test/t-lvextend-percent-extents.sh
index 24fac60..ecd5a1b 100755
--- a/test/t-lvextend-percent-extents.sh
+++ b/test/t-lvextend-percent-extents.sh
@@ -99,3 +99,8 @@ check lv_field $vg/$lv seg_count 2
lvreduce -f -l -$(( $pe_count * 1 )) $vg/$lv
check lv_field $vg/$lv seg_count 1
+# do not reduce to 0 extents
+lvremove -f $vg/$lv
+lvcreate -i2 -I 64k -l10 -n $lv $vg
+lvreduce -f -l1 $vg/$lv
+check lv_field $vg/$lv lv_size "8.00m"
diff --git a/tools/lvresize.c b/tools/lvresize.c
index b9084e6..30e0bf0 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -575,11 +575,17 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
return EINVALID_CMD_LINE;
}
- if ((lp->stripes > 1)) {
+ if (lp->stripes > 1) {
if (!(stripesize_extents = lp->stripe_size / vg->extent_size))
stripesize_extents = 1;
- if ((size_rest = seg_size % (lp->stripes * stripesize_extents))) {
+ size_rest = seg_size % (lp->stripes * stripesize_extents);
+ if (size_rest && lp->resize == LV_REDUCE) {
+ log_print("Rounding size (%d extents) up to stripe "
+ "boundary size for segment (%d extents)",
+ lp->extents, lp->extents + size_rest);
+ lp->extents = lp->extents + size_rest;
+ } else if (size_rest) {
log_print("Rounding size (%d extents) down to stripe "
"boundary size for segment (%d extents)",
lp->extents, lp->extents - size_rest);
--
1.7.5.3
More information about the lvm-devel
mailing list