From 4df2157c7262d17c021d274211d1a2859a824dc5 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Thu, 8 Dec 2016 13:27:02 -0600 Subject: [PATCH] toollib: fix lv_is_type for snapshots --- test/shell/lvconvert-thin-raid.sh | 4 ++-- test/shell/lvconvert-thin.sh | 4 ++-- tools/toollib.c | 17 +++++++++++------ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/test/shell/lvconvert-thin-raid.sh b/test/shell/lvconvert-thin-raid.sh index 7fa8733f6..33e5b6dd9 100644 --- a/test/shell/lvconvert-thin-raid.sh +++ b/test/shell/lvconvert-thin-raid.sh @@ -30,8 +30,8 @@ aux wait_for_sync $vg $lv2 lvchange -an $vg/$lv1 # conversion fails for internal volumes -invalid lvconvert --thinpool $vg/${lv1}_rimage_0 -invalid lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/${lv2}_rimage_0 +not lvconvert --thinpool $vg/${lv1}_rimage_0 +not lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/${lv2}_rimage_0 lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/$lv2 diff --git a/test/shell/lvconvert-thin.sh b/test/shell/lvconvert-thin.sh index 1999d8649..2144bd23b 100644 --- a/test/shell/lvconvert-thin.sh +++ b/test/shell/lvconvert-thin.sh @@ -58,13 +58,13 @@ lvchange -an $vg/$lv1 # conversion fails for mirror segment type fail lvconvert --thinpool $vg/$lv1 # cannot use same LV -invalid lvconvert --yes --thinpool $vg/$lv2 --poolmetadata $vg/$lv2 +not lvconvert --yes --thinpool $vg/$lv2 --poolmetadata $vg/$lv2 prepare_lvs # conversion fails for internal volumes # can't use --readahead with --poolmetadata -invalid lvconvert --thinpool $vg/$lv1 --poolmetadata $vg/$lv2 --readahead 512 +not lvconvert --thinpool $vg/$lv1 --poolmetadata $vg/$lv2 --readahead 512 lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/$lv2 prepare_lvs diff --git a/tools/toollib.c b/tools/toollib.c index 17680b13f..29afe0d0b 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -2498,9 +2498,9 @@ static int _lv_is_type(struct cmd_context *cmd, struct logical_volume *lv, int l switch (lvt_enum) { case striped_LVT: - return seg_is_striped(seg); + return seg_is_striped(seg) && !lv_is_cow(lv); case linear_LVT: - return seg_is_linear(seg); + return seg_is_linear(seg) && !lv_is_cow(lv); case snapshot_LVT: return lv_is_cow(lv); case thin_LVT: @@ -2544,12 +2544,17 @@ int get_lvt_enum(struct logical_volume *lv) { struct lv_segment *seg = first_seg(lv); - if (seg_is_striped(seg)) - return striped_LVT; - if (seg_is_linear(seg)) - return linear_LVT; + /* + * The order these are checked is important, because a snapshot LV has + * a linear seg type. + */ + if (lv_is_cow(lv)) return snapshot_LVT; + if (seg_is_linear(seg)) + return linear_LVT; + if (seg_is_striped(seg)) + return striped_LVT; if (lv_is_thin_volume(lv)) return thin_LVT; if (lv_is_thin_pool(lv))