diff --git a/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch b/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch new file mode 100644 index 0000000..652b0b7 --- /dev/null +++ b/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch @@ -0,0 +1,25 @@ + tools/command-lines.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/command-lines.in b/tools/command-lines.in +index 1107c1e..67c37ff 100644 +--- a/tools/command-lines.in ++++ b/tools/command-lines.in +@@ -534,7 +534,7 @@ RULE: all and lv_is_visible + + --- + +-lvconvert --type thin-pool LV_linear_striped_raid_cache_error_zero ++lvconvert --type thin-pool LV_linear_striped_raid_cache_writecache_error_zero + OO: --stripes_long Number, --stripesize SizeKB, + OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT + OP: PV ... +@@ -566,7 +566,7 @@ RULE: --poolmetadata not --readahead --stripesize --stripes_long + # This command syntax is deprecated, and the primary forms + # of creating a pool or swapping metadata should be used. + +-lvconvert --thinpool LV_linear_striped_raid_cache_thinpool ++lvconvert --thinpool LV_linear_striped_raid_cache_writecache_thinpool + OO: --stripes_long Number, --stripesize SizeKB, + OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT + OP: PV ... diff --git a/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch b/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch new file mode 100644 index 0000000..45a878d --- /dev/null +++ b/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch @@ -0,0 +1,150 @@ + lib/metadata/lv_manip.c | 19 +++++++++ + lib/metadata/metadata-exported.h | 2 + + lib/metadata/thin_manip.c | 12 ++++++ + test/shell/lvremove-thindata-caches.sh | 71 ++++++++++++++++++++++++++++++++++ + 4 files changed, 104 insertions(+) + create mode 100644 test/shell/lvremove-thindata-caches.sh + +diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c +index 508f78c..37dd361 100644 +--- a/lib/metadata/lv_manip.c ++++ b/lib/metadata/lv_manip.c +@@ -6692,6 +6692,25 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, + return_0; + } + ++ /* if thin pool data lv is writecache, then detach and remove the writecache */ ++ if (lv_is_thin_pool(lv)) { ++ struct logical_volume *data_lv = data_lv_from_thin_pool(lv); ++ ++ if (data_lv && lv_is_writecache(data_lv)) { ++ struct logical_volume *cachevol_lv = first_seg(data_lv)->writecache; ++ ++ if (!lv_detach_writecache_cachevol(data_lv, 1)) { ++ log_error("Failed to detach writecache from %s", display_lvname(data_lv)); ++ return 0; ++ } ++ ++ if (!lv_remove_single(cmd, cachevol_lv, force, 1)) { ++ log_error("Failed to remove cachevol %s.", display_lvname(cachevol_lv)); ++ return 0; ++ } ++ } ++ } ++ + if (lv_is_writecache(lv)) { + struct logical_volume *cachevol_lv = first_seg(lv)->writecache; + +diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h +index c611635..54bc0d0 100644 +--- a/lib/metadata/metadata-exported.h ++++ b/lib/metadata/metadata-exported.h +@@ -927,6 +927,8 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, + int vg_set_pool_metadata_spare(struct logical_volume *lv); + int vg_remove_pool_metadata_spare(struct volume_group *vg); + ++struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv); ++ + int attach_thin_external_origin(struct lv_segment *seg, + struct logical_volume *external_lv); + int detach_thin_external_origin(struct lv_segment *seg); +diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c +index 451c382..6ce88bd 100644 +--- a/lib/metadata/thin_manip.c ++++ b/lib/metadata/thin_manip.c +@@ -21,6 +21,18 @@ + #include "lib/config/defaults.h" + #include "lib/display/display.h" + ++struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv) ++{ ++ struct lv_segment *seg_thinpool = first_seg(pool_lv); ++ ++ if (!seg_thinpool || !seg_is_thin_pool(seg_thinpool)) { ++ log_error(INTERNAL_ERROR "data_lv_from_thin_pool arg not thin pool %s", pool_lv->name); ++ return NULL; ++ } ++ ++ return seg_thinpool->areas[0].u.lv.lv; ++} ++ + /* TODO: drop unused no_update */ + int attach_pool_message(struct lv_segment *pool_seg, dm_thin_message_t type, + struct logical_volume *lv, uint32_t delete_id, +diff --git a/test/shell/lvremove-thindata-caches.sh b/test/shell/lvremove-thindata-caches.sh +new file mode 100644 +index 0000000..ba099c3 +--- /dev/null ++++ b/test/shell/lvremove-thindata-caches.sh +@@ -0,0 +1,71 @@ ++#!/usr/bin/env bash ++ ++# Copyright (C) 2017-2020 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++SKIP_WITH_LVMPOLLD=1 ++ ++. lib/inittest ++ ++aux have_cache 1 10 0 || skip ++aux have_writecache 1 0 0 || skip ++which mkfs.xfs || skip ++ ++aux prepare_devs 6 70 # want 64M of usable space from each dev ++ ++vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4" "$dev5" "$dev6" ++ ++# lv1 is thinpool LV: 128M ++# lv2 is fast LV: 64M ++# lv3 is thin LV: 1G ++ ++# ++# Test lvremove of a thinpool that uses cache|writecache on data ++# ++ ++# attach writecache to thinpool data ++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" ++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg ++lvcreate -n $lv2 -L64M -an $vg "$dev3" ++lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1 ++lvchange -ay $vg/$lv1 ++lvs -a $vg ++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" ++lvremove -y $vg/$lv1 ++ ++# attach cache/writeback (cachevol) to thinpool data ++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" ++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg ++lvcreate -n $lv2 -L64M -an $vg "$dev3" ++lvconvert -y --type cache --cachevol $lv2 --cachemode writeback $vg/$lv1 ++lvchange -ay $vg/$lv1 ++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" ++lvremove -y $vg/$lv1 ++ ++# attach cache/writethrough (cachevol) to thinpool data ++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" ++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg ++lvcreate -n $lv2 -L64M -an $vg "$dev3" ++lvconvert -y --type cache --cachevol $lv2 --cachemode writethrough $vg/$lv1 ++lvchange -ay $vg/$lv1 ++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" ++lvremove -y $vg/$lv1 ++ ++# attach cache (cachepool) to thinpool data ++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" ++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg ++lvcreate -y --type cache-pool -n $lv2 -L64M --poolmetadataspare n $vg "$dev3" "$dev6" ++lvconvert -y --type cache --cachepool $lv2 --poolmetadataspare n $vg/$lv1 ++lvchange -ay $vg/$lv1 ++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" ++lvremove -y $vg/$lv1 ++ ++vgremove -f $vg ++ diff --git a/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch b/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch new file mode 100644 index 0000000..1457f7f --- /dev/null +++ b/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch @@ -0,0 +1,23 @@ + tools/pvmove.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/tools/pvmove.c b/tools/pvmove.c +index da635a6..bb372f7 100644 +--- a/tools/pvmove.c ++++ b/tools/pvmove.c +@@ -387,6 +387,15 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd, + return NULL; + } + ++ if (lv_is_writecache(lv)) { ++ struct logical_volume *lv_cachevol = first_seg(lv)->writecache; ++ if (lv_is_on_pvs(lv_cachevol, source_pvl)) { ++ log_error("Unable to move device used for writecache cachevol %s.", display_lvname(lv_cachevol)); ++ return NULL; ++ } ++ ++ } ++ + if (lv_is_raid(lv) && lv_raid_has_integrity(lv)) { + log_error("Unable to pvmove device used for raid with integrity."); + return NULL; diff --git a/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch b/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch new file mode 100644 index 0000000..b926cac --- /dev/null +++ b/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch @@ -0,0 +1,17 @@ + lib/metadata/metadata.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c +index 002d80c..1f65045 100644 +--- a/lib/metadata/metadata.c ++++ b/lib/metadata/metadata.c +@@ -4402,6 +4402,9 @@ int lv_on_pmem(struct logical_volume *lv) + + dm_list_iterate_items(seg, &lv->segments) { + for (s = 0; s < seg->area_count; s++) { ++ if (seg_type(seg, s) != AREA_PV) ++ continue; ++ + pv = seg_pv(seg, s); + + if (dev_is_pmem(lv->vg->cmd->dev_types, pv->dev)) { diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec index 925cc61..ef6edec 100644 --- a/SPECS/lvm2.spec +++ b/SPECS/lvm2.spec @@ -67,7 +67,7 @@ Version: 2.03.12 %if 0%{?from_snapshot} Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix} %else -Release: 2%{?dist}%{?rel_suffix} +Release: 3%{?dist}%{?rel_suffix} %endif License: GPLv2 URL: http://sourceware.org/lvm2 @@ -81,6 +81,13 @@ Patch1: lvm2-set-default-preferred_names.patch Patch2: lvm2-test-skip-problematic-tests.patch # BZ 1961890 Patch3: lvm2-2_03_13-vdo-fix-preload-of-kvdo.patch +# BZ 1964622: +Patch4: lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch +# BZ 1957898: +Patch5: lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch +# BZ 1872903: +Patch6: lvm2-2_03_13-writecache-fix-lv_on_pmem.patch +Patch7: lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch BuildRequires: gcc %if %{enable_testsuite} @@ -144,6 +151,10 @@ or more physical volumes and creating one or more logical volumes %patch1 -p1 -b .backup1 %patch2 -p1 -b .backup2 %patch3 -p1 -b .backup3 +%patch4 -p1 -b .backup4 +%patch5 -p1 -b .backup5 +%patch6 -p1 -b .backup6 +%patch7 -p1 -b .backup7 %build %global _default_pid_dir /run @@ -752,6 +763,10 @@ An extensive functional testsuite for LVM2. %endif %changelog +* Tue Jun 15 2021 Marian Csontos - 2.03.12-3 +- Allow extending thin-pool data with writecache on top. +- Fix removing thin-pool data converted to writeache. + * Tue Jun 01 2021 Marian Csontos - 2.03.12-2 - Fix loading of VDO kernel module.