From 60668f823e830ce39e452234996910c51728aa76 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Sun, 25 Nov 2012 20:41:56 +0100 Subject: [PATCH] Automatically restore MISSING PVs with no MDAs. --- WHATS_NEW | 1 + lib/format_text/import_vsn1.c | 6 ++++++ test/shell/nomda-restoremissing.sh | 31 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 test/shell/nomda-restoremissing.sh diff --git a/WHATS_NEW b/WHATS_NEW index 0904940b2..2ea3f2bd0 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.99 - =================================== + Automatically restore MISSING PVs with no MDAs. When no '-i' argument is given for RAID10, default to 2 stripes. Do not allow --splitmirrors on RAID10 logical volumes. Skip mlocking [vectors] on arm architecture. diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c index dff70f711..e73c4756a 100644 --- a/lib/format_text/import_vsn1.c +++ b/lib/format_text/import_vsn1.c @@ -221,6 +221,12 @@ static int _read_pv(struct format_instance *fid, if (!pv->dev && !lvmetad_active()) pv->status |= MISSING_PV; + if ((pv->status & MISSING_PV) && pv->dev && pv_mda_used_count(pv) == 0) { + pv->status &= ~MISSING_PV; + log_info("Recovering a previously MISSING PV %s with no MDAs.", + pv_dev_name(pv)); + } + /* Late addition */ if (dm_config_has_node(pvn, "dev_size") && !_read_uint64(pvn, "dev_size", &pv->size)) { diff --git a/test/shell/nomda-restoremissing.sh b/test/shell/nomda-restoremissing.sh new file mode 100644 index 000000000..8dd71fa1c --- /dev/null +++ b/test/shell/nomda-restoremissing.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2010 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 + +. lib/test + +aux prepare_vg 3 + +pvchange --metadataignore y $dev1 + +lvcreate -m 1 -l 1 -n mirror $vg +lvchange -a n $vg/mirror +lvcreate -l 1 -n lv1 $vg "$dev1" + +# try to just change metadata; we expect the new version (with MISSING_PV set +# on the reappeared volume) to be written out to the previously missing PV +aux disable_dev "$dev1" +lvremove $vg/mirror +not vgck $vg 2>&1 | tee log +grep "missing 1 physical volume" log +not lvcreate -m 1 -l 1 -n mirror $vg # write operations fail +aux enable_dev "$dev1" +lvcreate -m 1 -l 1 -n mirror $vg # no MDA => automatically restored +vgck $vg