[lvm-devel] master - thin: fix forbidden discards checks

Zdenek Kabelac zkabelac at fedoraproject.org
Tue Feb 5 13:47:49 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a5b9b4bf02b42baf1f1c033eaa98c5fe23951b43
Commit:        a5b9b4bf02b42baf1f1c033eaa98c5fe23951b43
Parent:        11eaf1c98c3fac8524f227956f57c3d486740a1a
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Sat Feb 2 12:48:52 2013 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Feb 5 14:38:16 2013 +0100

thin: fix forbidden discards checks

Instead of check for lv_is_active() for thin pool LV,
query the whole pool via new  pool_is_active().

Fixes a problem when we cannot change discards settings
for active pool device where the actual layer for pool
device was inactive, but thin volumes using thin pool
have been active.
---
 WHATS_NEW                   |    1 +
 test/shell/discards-thin.sh |   22 ++++++++++++++++++----
 tools/lvchange.c            |    4 ++--
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index 1b26317..b6c1785 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.99 - 
 ===================================
+  Fix check for some forbidden discards conversion of thin pools.
   Add pool_is_active() to check for any pool related active LV.
   Report blank field if the LV doesn't have an origin instead of 0.
   Do not take a free lv name argument for lvconvert --thinpool option.
diff --git a/test/shell/discards-thin.sh b/test/shell/discards-thin.sh
index 84688b4..525f106 100644
--- a/test/shell/discards-thin.sh
+++ b/test/shell/discards-thin.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2012-2013 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
@@ -34,16 +34,30 @@ check lv_field $vg/pool2 discards "passdown"
 
 lvchange --discards nopassdown $vg/pool2
 
-# cannot convert active  ignore -> passdown
+lvcreate -V1M -n origin -T $vg/pool
+lvcreate -s $vg/origin -n snap
+
+# Cannot convert active  nopassdown -> ignore
+not lvchange --discards nopassdown $vg/pool
+
+# Cannot convert active  ignore -> passdown
 not lvchange --discards passdown $vg/pool
 
-# cannot convert active  nopassdown -> ignore
+# Cannot convert active  nopassdown -> ignore
 not lvchange --discards ignore $vg/pool1
 
-# deactivate
+# Deactivate pool only
 lvchange -an $vg/pool $vg/pool1
+
+# Cannot convert, since thin volumes are still active
+not lvchange --discards passdown $vg/pool
+
+# Deactive thin volumes
+lvchange -an $vg/origin $vg/snap
+
 lvchange --discards passdown $vg/pool
 check lv_field $vg/pool discards "passdown"
+
 lvchange --discards ignore $vg/pool1
 check lv_field $vg/pool1 discards "ignore"
 
diff --git a/tools/lvchange.c b/tools/lvchange.c
index c3c993a..0ea2e78 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -113,9 +113,9 @@ static int lvchange_pool_update(struct cmd_context *cmd,
 		if (discards != first_seg(lv)->discards) {
 			if (((discards == THIN_DISCARDS_IGNORE) ||
 			     (first_seg(lv)->discards == THIN_DISCARDS_IGNORE)) &&
-			    lv_is_active(lv))
+			    pool_is_active(first_seg(lv)))
 				log_error("Cannot change discards state for active "
-					  "logical volume \"%s\".", lv->name);
+					  "pool volume \"%s\".", lv->name);
 			else {
 				first_seg(lv)->discards = discards;
 				update++;




More information about the lvm-devel mailing list