Date: Saturday, November 28, 2015 @ 20:28:45 Author: bpiotrowski Revision: 252031
upgpkg: lvm2 2.02.134-2 backport patch that fixes lvm2 failing to find cache metadata if cache policy is missing (FS#47196) Added: lvm2/trunk/lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch Modified: lvm2/trunk/PKGBUILD -----------------------------------------------------------------------------------+ PKGBUILD | 11 lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch | 116 ++++++++++ 2 files changed, 124 insertions(+), 3 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2015-11-28 19:12:32 UTC (rev 252030) +++ PKGBUILD 2015-11-28 19:28:45 UTC (rev 252031) @@ -5,7 +5,7 @@ pkgbase=lvm2 pkgname=('lvm2' 'device-mapper') pkgver=2.02.134 -pkgrel=1 +pkgrel=2 arch=('i686' 'x86_64') url="http://sourceware.org/lvm2/" license=('GPL2' 'LGPL2.1') @@ -16,7 +16,8 @@ lvm2_hook sd-lvm2_install 11-dm-initramfs.rules - lvm2-make-sockets-static.patch) + lvm2-make-sockets-static.patch + lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch) sha1sums=('4180405b7847515a08def649d3140b5d8bd0e258' 'SKIP' '40ef991650555b904e73bcc3f344d736722e27ca' @@ -23,7 +24,8 @@ 'ff0fdf0a3005a41acd4b36865056109effc3474b' '86c18852409dc03f38bdd734ac3e7b54bed9c4ce' 'f6a554eea9557c3c236df2943bb6e7e723945c41' - 'b084512af42f2e16cdccd8b7ee4de27b574d1f94') + 'b084512af42f2e16cdccd8b7ee4de27b574d1f94' + '19c61c9c240cbef44833a1112305f6f7450e8140') validpgpkeys=('88437EF5C077BD113D3B7224228191C1567E2C17') prepare() { @@ -34,6 +36,9 @@ # make systemd sockets static patch -p1 -i "${srcdir}/lvm2-make-sockets-static.patch" + + # lvm2 fails to detect cache metadata if cache policy is missing + patch -p1 -i "${srcdir}"/lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch } build() { Added: lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch =================================================================== --- lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch (rev 0) +++ lvm2-2.02.135-fix-reading-of-old-metadata-with-missing-cache-policy-or-mode.patch 2015-11-28 19:28:45 UTC (rev 252031) @@ -0,0 +1,116 @@ +commit 265a99e98a81113c2f27f0e4d6c5b73d198ed586 +Author: Peter Rajnoha <prajn...@redhat.com> +Date: Tue Nov 24 11:28:31 2015 +0100 + + Fix reading of old cache metadata. +--- + lib/cache_segtype/cache.c | 34 +++++++++++++++++++++++++++++++++ + test/shell/lvchange-cache-old.sh | 41 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 75 insertions(+) + +diff --git a/lib/cache_segtype/cache.c b/lib/cache_segtype/cache.c +index 85cba18..2a7eb96 100644 +--- a/lib/cache_segtype/cache.c ++++ b/lib/cache_segtype/cache.c +@@ -34,6 +34,32 @@ static unsigned _feature_mask; + log_error(t " segment %s of logical volume %s.", ## p, \ + dm_config_parent_name(sn), seg->lv->name), 0; + ++/* ++ * When older metadata are loaded without newer settings, ++ * set then to default settings (the one that could have been ++ * used implicitely at that time). ++ * ++ * Needs both segments cache and cache_pool to be loaded. ++ */ ++static int _fix_missing_defaults(struct lv_segment *cpool_seg) ++{ ++ if (!cpool_seg->policy_name) { ++ cpool_seg->policy_name = "mq"; ++ log_verbose("Cache is missing cache policy, using %s.", ++ cpool_seg->policy_name); ++ } ++ ++ if (!cache_mode_is_set(cpool_seg)) { ++ if (!cache_set_mode(cpool_seg, "writethrough")) { ++ log_error(INTERNAL_ERROR "Failed to writethrough cache mode."); ++ return 0; ++ } ++ log_verbose("Cache is missing cache mode, using %s.", ++ get_cache_mode_name(cpool_seg)); ++ } ++ ++ return 1; ++} + + static int _cache_pool_text_import(struct lv_segment *seg, + const struct dm_config_node *sn, +@@ -115,6 +141,10 @@ static int _cache_pool_text_import(struct lv_segment *seg, + if (!attach_pool_metadata_lv(seg, meta_lv)) + return_0; + ++ if (!dm_list_empty(&seg->lv->segs_using_this_lv) && ++ !_fix_missing_defaults(seg)) ++ return_0; ++ + return 1; + } + +@@ -319,6 +349,10 @@ static int _cache_text_import(struct lv_segment *seg, + if (!attach_pool_lv(seg, pool_lv, NULL, NULL)) + return_0; + ++ if (!dm_list_empty(&pool_lv->segments) && ++ !_fix_missing_defaults(first_seg(pool_lv))) ++ return_0; ++ + return 1; + } + +diff --git a/test/shell/lvchange-cache-old.sh b/test/shell/lvchange-cache-old.sh +new file mode 100644 +index 0000000..0b6ef7c +--- /dev/null ++++ b/test/shell/lvchange-cache-old.sh +@@ -0,0 +1,41 @@ ++#!/bin/sh ++# Copyright (C) 2015 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 ++ ++# Exercise usage of older metadata which are missing some new settings ++ ++SKIP_WITH_LVMPOLLD=1 ++ ++. lib/inittest ++ ++aux have_cache 1 3 0 || skip ++ ++# FIXME: parallel cache metadata allocator is crashing when used value 8000! ++aux prepare_vg 5 80 ++ ++ ++lvcreate -l 10 --type cache-pool $vg/cpool ++lvcreate -l 20 -H -n $lv1 $vg/cpool ++ ++vgcfgbackup -f backup $vg ++ ++# check metadata without cache policy ++lvchange -an $vg ++grep -v "policy =" backup >backup_1 ++vgcfgrestore -f backup_1 $vg ++lvchange -ay $vg ++ ++# check metadata without cache mode ++lvchange -an $vg ++grep -v "cache_mode =" backup >backup_2 ++vgcfgrestore -f backup_2 $vg ++lvchange -ay $vg ++ ++vgremove -ff $vg