All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Change lvextend to round up for stripped volumes
@ 2009-07-01 20:45 Iustin Pop
  2009-07-07 22:17 ` Alasdair G Kergon
  0 siblings, 1 reply; 5+ messages in thread
From: Iustin Pop @ 2009-07-01 20:45 UTC (permalink / raw)
  To: lvm-devel

Currently lvresize, when growing stripped volumes, rounds down if the
extents delta doesn't match exactly the full stripe size. This is
counterintuitive (we're requesting growth by X amount, and instead we
could get less than X, even though the operation succeded), and also
doesn't match the current behaviour in lvcreate (rounds up) and lvextend
for non-stripped volumes (which also rounds up).

Signed-off-by: Iustin Pop <iustin@google.com>
---
 Note: I've tested this in a two-stripe scenario, and it seems to work as
 intended; however, I'm not familiar with the code so I might have
 misunderstood things. Thanks in advance! iustin

 tools/lvresize.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/tools/lvresize.c b/tools/lvresize.c
index 1c0f570..69239dc 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -283,6 +283,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	uint32_t seg_mirrors = 0;
 	uint32_t extents_used = 0;
 	uint32_t size_rest;
+        uint32_t full_stripe_size;
 	uint32_t pv_extent_count = 0;
 	alloc_policy_t alloc;
 	struct logical_volume *lock_lv;
@@ -517,12 +518,13 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	if ((lp->stripes > 1)) {
 		if (!(stripesize_extents = lp->stripe_size / vg->extent_size))
 			stripesize_extents = 1;
+                full_stripe_size = lp->stripes * stripesize_extents;
 
-		if ((size_rest = seg_size % (lp->stripes * stripesize_extents))) {
-			log_print("Rounding size (%d extents) down to stripe "
+		if ((size_rest = seg_size % full_stripe_size)) {
+			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;
+				  lp->extents, lp->extents - size_rest + full_stripe_size);
+			lp->extents = lp->extents - size_rest + full_stripe_size;
 		}
 
 		if (lp->stripe_size < STRIPE_SIZE_MIN) {
-- 
1.6.3.3



^ permalink raw reply related	[flat|nested] 5+ messages in thread
* [PATCH] Change lvextend to round up for stripped volumes
@ 2009-07-07  8:00 Iustin Pop
  0 siblings, 0 replies; 5+ messages in thread
From: Iustin Pop @ 2009-07-07  8:00 UTC (permalink / raw)
  To: lvm-devel

Currently lvresize, when growing stripped volumes, rounds down if the
extents delta doesn't match exactly the full stripe size. This is
counterintuitive (we're requesting growth by X amount, and instead we
could get less than X, even though the operation succeded), and also
doesn't match the current behaviour in lvcreate (rounds up) and lvextend
for non-stripped volumes (which also rounds up).

Signed-off-by: Iustin Pop <iustin@google.com>
---
 Note: I've tested this in a two-stripe scenario, and it seems to work as
 intended; however, I'm not familiar with the code so I might have
 misunderstood things. Thanks in advance! iustin

 Also this is a resend, it seems the first time it didn't go through.

 tools/lvresize.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/tools/lvresize.c b/tools/lvresize.c
index 1c0f570..69239dc 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -283,6 +283,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	uint32_t seg_mirrors = 0;
 	uint32_t extents_used = 0;
 	uint32_t size_rest;
+        uint32_t full_stripe_size;
 	uint32_t pv_extent_count = 0;
 	alloc_policy_t alloc;
 	struct logical_volume *lock_lv;
@@ -517,12 +518,13 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	if ((lp->stripes > 1)) {
 		if (!(stripesize_extents = lp->stripe_size / vg->extent_size))
 			stripesize_extents = 1;
+                full_stripe_size = lp->stripes * stripesize_extents;
 
-		if ((size_rest = seg_size % (lp->stripes * stripesize_extents))) {
-			log_print("Rounding size (%d extents) down to stripe "
+		if ((size_rest = seg_size % full_stripe_size)) {
+			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;
+				  lp->extents, lp->extents - size_rest + full_stripe_size);
+			lp->extents = lp->extents - size_rest + full_stripe_size;
 		}
 
 		if (lp->stripe_size < STRIPE_SIZE_MIN) {
-- 
1.6.3.3



^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-07-13  9:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-01 20:45 [PATCH] Change lvextend to round up for stripped volumes Iustin Pop
2009-07-07 22:17 ` Alasdair G Kergon
2009-07-08  8:50   ` Iustin Pop
2009-07-13  9:55     ` Iustin Pop
  -- strict thread matches above, loose matches on Subject: below --
2009-07-07  8:00 Iustin Pop

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.