[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[lvm-devel] [PATCH] Fix #733320: fix rounding inconsistency between lvresize/lvreduce



Hi,

we wan to round in the safe direction, regardless of whether we were
called as lvresize or lvreduce. The attached patch implements that (and
adds a regression test).

Yours,
   Petr

Index: test/t-lvresize-rounding.sh
===================================================================
RCS file: test/t-lvresize-rounding.sh
diff -N test/t-lvresize-rounding.sh
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ test/t-lvresize-rounding.sh	15 Sep 2011 11:26:30 -0000
@@ -0,0 +1,25 @@
+# Copyright (C) 2007-2008 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+. lib/test
+
+aux prepare_vg 2
+
+lvcreate -l 10 -n lv -i2 $vg
+
+lvextend -l +1 $vg/lv 2>&1 | tee log
+grep 'down to stripe' log
+lvresize -l +1 $vg/lv 2>&1 | tee log
+grep 'down to stripe' log
+
+lvreduce -f -l -1 $vg/lv 2>&1 | tee log
+grep 'up to stripe' log
+lvresize -f -l -1 $vg/lv 2>&1 | tee log
+grep 'up to stripe' log
Index: tools/lvresize.c
===================================================================
RCS file: /cvs/lvm2/LVM2/tools/lvresize.c,v
retrieving revision 1.134
diff -u -p -r1.134 lvresize.c
--- tools/lvresize.c	10 Aug 2011 20:25:31 -0000	1.134
+++ tools/lvresize.c	15 Sep 2011 11:26:33 -0000
@@ -606,7 +606,8 @@ static int _lvresize(struct cmd_context 
 			stripesize_extents = 1;
 
 		size_rest = seg_size % (lp->stripes * stripesize_extents);
-		if (size_rest && lp->resize == LV_REDUCE) {
+		/* Round toward the original size. */
+		if (size_rest && lp->extents < lv->le_count) {
 			log_print("Rounding size (%d extents) up to stripe "
 				  "boundary size for segment (%d extents)",
 				  lp->extents, lp->extents - size_rest +
-- 
id' Ash = Ash; id' Dust = Dust; id' _ = undefined

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]