stable-2.02 - dm: remove created devices on error path
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ef5cddc20847b64b11a...
Commit: ef5cddc20847b64b11a729ba3ce5dde12a9f606c
Parent: 7c262bfc85f62c94421ab2d687c74585c3e27d3f
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Oct 16 20:58:58 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 21:10:04 2020 +0200
dm: remove created devices on error path
DM tree keeps track of created device while preloading a device tree.
When fail occures during such preload, it will now try to remove
all created and preloaded device. This makes it easier to maintain
stacking of device, since we do not need to check in-depth for
existance of all possible created devices during the failure.
---
WHATS_NEW_DM | 1 +
libdm/libdm-deptree.c | 75 +++++++++++++++++----------------------------------
2 files changed, 26 insertions(+), 50 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index f1b4f2b6a..56d9e0684 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.172 -
==================================
+ Try to remove all created devices on dm preload tree error path.
Fix dm_list interators with gcc 10 optimization (-ftree-pta).
Dmeventd handles timer without looping on short intervals.
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index f41a33858..6bafc387d 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -1937,7 +1937,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
return r;
}
-static int _create_node(struct dm_tree_node *dnode)
+static int _create_node(struct dm_tree_node *dnode, struct dm_tree_node *parent)
{
int r = 0;
struct dm_task *dmt;
@@ -1986,38 +1986,15 @@ static int _create_node(struct dm_tree_node *dnode)
"Unable to get DM task info for %s.",
dnode->name);
}
+
+ if (r)
+ dm_list_add_h(&parent->activated, &dnode->activated_list);
out:
dm_task_destroy(dmt);
return r;
}
-/*
- * _remove_node
- *
- * This function is only used to remove a DM device that has failed
- * to load any table.
- */
-static int _remove_node(struct dm_tree_node *dnode)
-{
- if (!dnode->info.exists)
- return 1;
-
- if (dnode->info.live_table || dnode->info.inactive_table) {
- log_error(INTERNAL_ERROR
- "_remove_node called on device with loaded table(s).");
- return 0;
- }
-
- if (!_deactivate_node(dnode->name, dnode->info.major, dnode->info.minor,
- &dnode->dtree->cookie, dnode->udev_flags, 0)) {
- log_error("Failed to clean-up device with no table: %s.",
- _node_name(dnode));
- return 0;
- }
- return 1;
-}
-
static int _build_dev_string(char *devbuf, size_t bufsize, struct dm_tree_node *node)
{
if (!dm_format_dev(devbuf, bufsize, node->info.major, node->info.minor)) {
@@ -2798,6 +2775,16 @@ static int _dm_tree_revert_activated(struct dm_tree_node *parent)
return 1;
}
+static int _dm_tree_wait_and_revert_activated(struct dm_tree_node *dnode)
+{
+ if (!dm_udev_wait(dm_tree_get_cookie(dnode)))
+ stack;
+
+ dm_tree_set_cookie(dnode, 0);
+
+ return _dm_tree_revert_activated(dnode);
+}
+
int dm_tree_preload_children(struct dm_tree_node *dnode,
const char *uuid_prefix,
size_t uuid_prefix_len)
@@ -2827,7 +2814,7 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
return_0;
/* FIXME Cope if name exists with no uuid? */
- if (!child->info.exists && !(node_created = _create_node(child)))
+ if (!child->info.exists && !(node_created = _create_node(child, dnode)))
return_0;
/* Propagate delayed resume from exteded child node */
@@ -2837,18 +2824,15 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
if (!child->info.inactive_table &&
child->props.segment_count &&
!_load_node(child)) {
+ stack;
/*
- * If the table load does not succeed, we remove the
- * device in the kernel that would otherwise have an
- * empty table. This makes the create + load of the
- * device atomic. However, if other dependencies have
- * already been created and loaded; this code is
- * insufficient to remove those - only the node
- * encountering the table load failure is removed.
+ * If the table load fails, try to device in the kernel
+ * together with other created and preloaded devices.
*/
- if (node_created && !_remove_node(child))
- return_0;
- return_0;
+ if (!_dm_tree_wait_and_revert_activated(dnode))
+ stack;
+ r = 0;
+ continue;
}
/* No resume for a device without parents or with unchanged or smaller size */
@@ -2863,28 +2847,19 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
&child->info, &child->dtree->cookie, child->udev_flags,
child->info.suspended)) {
log_error("Unable to resume %s.", _node_name(child));
- /* If the device was not previously active, we might as well remove this node. */
- if (!child->info.live_table &&
- !_deactivate_node(child->name, child->info.major, child->info.minor,
- &child->dtree->cookie, child->udev_flags, 0))
- log_error("Unable to deactivate %s.", _node_name(child));
+ if (!_dm_tree_wait_and_revert_activated(dnode))
+ stack;
r = 0;
- /* Each child is handled independently */
continue;
}
if (node_created) {
- /* Collect newly introduced devices for revert */
- dm_list_add_h(&dnode->activated, &child->activated_list);
-
/* When creating new node also check transaction_id. */
if (child->props.send_messages &&
!_node_send_messages(child, uuid_prefix, uuid_prefix_len, 0)) {
stack;
- if (!dm_udev_wait(dm_tree_get_cookie(dnode)))
+ if (!_dm_tree_wait_and_revert_activated(dnode))
stack;
- dm_tree_set_cookie(dnode, 0);
- (void) _dm_tree_revert_activated(dnode);
r = 0;
continue;
}
3 years, 7 months
stable-2.02 - rpm: bare words are no longer supported
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=7c262bfc85f62c94421...
Commit: 7c262bfc85f62c94421ab2d687c74585c3e27d3f
Parent: 7d3e7266c76591be4b99487c2b1ea61ce525c074
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Oct 2 22:13:51 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
rpm: bare words are no longer supported
Update for new rpm requirement and use "..." words.
---
spec/macros.inc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/spec/macros.inc b/spec/macros.inc
index 99ee9a06a..d4e99e6ae 100644
--- a/spec/macros.inc
+++ b/spec/macros.inc
@@ -58,11 +58,11 @@ fi \
%%if %%{enable_systemd} \
if [ $1 = 0 ]; then \
systemctl --no-reload disable lvm2-%%{-s*}.%%{-t*} > /dev/null 2>&1 || : \
- %%if %%{-t*} == socket \
+ %%if "%%{-t*}" == "socket" \
systemctl --no-reload disable lvm2-%%{-s*}.service > /dev/null 2>&1 || : \
%%endif \
systemctl stop lvm2-%%{-s*}.%%{-t*} > /dev/null 2>&1 || : \
- %%if %%{-t*} == socket \
+ %%if "%%{-t*}" == "socket" \
systemctl stop lvm2-%%{-s*}.service > /dev/null 2>&1 || : \
%%endif \
fi \
3 years, 7 months
stable-2.02 - tests: missed char in list
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=7d3e7266c76591be4b9...
Commit: 7d3e7266c76591be4b99487c2b1ea61ce525c074
Parent: d1db024e169c3c6af08477524e8048d54b678714
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Oct 17 10:41:25 2018 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: missed char in list
'=' also doesn't belong to property name.
---
test/lib/aux.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/lib/aux.sh b/test/lib/aux.sh
index 7235e69b8..0ab4cabaf 100644
--- a/test/lib/aux.sh
+++ b/test/lib/aux.sh
@@ -1360,7 +1360,7 @@ EOF
echo "$s {"
local k
for k in $(grep ^"$s"/ "$config_values" | cut -f1 -d= | sed -e 's, *$,,' | sort | uniq); do
- grep "^$k[ =]" "$config_values" | tail -n 1 | sed -e "s,^$s/, ," || true
+ grep "^$k[ \t=]" "$config_values" | tail -n 1 | sed -e "s,^$s/, ," || true
done
echo "}"
echo
3 years, 7 months
stable-2.02 - tests: fix unbound variable
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d1db024e169c3c6af08...
Commit: d1db024e169c3c6af08477524e8048d54b678714
Parent: 6b3d0166ee2057ddaac3e73955e07acb1204be42
Author: Marian Csontos <mcsontos(a)redhat.com>
AuthorDate: Tue Jul 23 15:36:13 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: fix unbound variable
Test `aux kernel_at_least 5 1` fails even for newer kernel
with `$3: unbound variable` when using `set -u`.
---
test/lib/aux.sh | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/test/lib/aux.sh b/test/lib/aux.sh
index a84d41189..7235e69b8 100644
--- a/test/lib/aux.sh
+++ b/test/lib/aux.sh
@@ -1548,17 +1548,17 @@ version_at_least() {
IFS=".-" read -r major minor revision <<< "$1"
shift
- test -z "$1" && return 0
+ test -n "${1:-}" || return 0
test -n "$major" || return 1
test "$major" -gt "$1" && return 0
test "$major" -eq "$1" || return 1
- test -z "$2" && return 0
+ test -n "${2:-}" || return 0
test -n "$minor" || return 1
test "$minor" -gt "$2" && return 0
test "$minor" -eq "$2" || return 1
- test -z "$3" && return 0
+ test -n "${3:-}" || return 0
test "$revision" -ge "$3" 2>/dev/null || return 1
}
#
3 years, 7 months
stable-2.02 - tests: aux hides zero and error device
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4d8d8856f12cab71663...
Commit: 4d8d8856f12cab71663325eefe59c06f10cb884d
Parent: bd860802d4cfabaef1da46140895826a80932d6e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Oct 2 19:19:30 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: aux hides zero and error device
When ERR_DEV and ZERO_DEV are used, they are automatically
taken down when the last user no longer needs them,
so hide them from 'forgotten' device check.
---
test/lib/aux.sh | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/test/lib/aux.sh b/test/lib/aux.sh
index 1a66df16e..667ca14ac 100644
--- a/test/lib/aux.sh
+++ b/test/lib/aux.sh
@@ -564,14 +564,14 @@ teardown() {
echo -n "## teardown..."
unset LVM_LOG_FILE_EPOCH
- test ! -f ERR_DEV || should dmsetup remove $(cat ERR_DEV_NAME)
- test ! -f ZERO_DEV || should dmsetup remove $(cat ZERO_DEV_NAME)
-
if test -f TESTNAME ; then
if test ! -f SKIP_THIS_TEST ; then
# Evaluate left devices only for non-skipped tests
- TEST_LEAKED_DEVICES=$(dmsetup table | grep "$PREFIX" | grep -Ev "${PREFIX}(pv|[0-9])") || true
+ TEST_LEAKED_DEVICES=$(dmsetup table | grep "$PREFIX" | \
+ grep -Ev "${PREFIX}(pv|[0-9])" | \
+ grep -v "$(cat ERR_DEV_NAME 2>/dev/null)" | \
+ grep -v "$(cat ZERO_DEV_NAME 2>/dev/null)") || true
fi
kill_tagged_processes
3 years, 7 months
stable-2.02 - tests: aux setup
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=6b3d0166ee2057ddaac...
Commit: 6b3d0166ee2057ddaac3e73955e07acb1204be42
Parent: 4d8d8856f12cab71663325eefe59c06f10cb884d
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Dec 10 13:30:11 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: aux setup
Avoid endless loop if there was no 'remove' progress.
---
test/lib/aux.sh | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/test/lib/aux.sh b/test/lib/aux.sh
index 667ca14ac..a84d41189 100644
--- a/test/lib/aux.sh
+++ b/test/lib/aux.sh
@@ -437,7 +437,7 @@ teardown_devs_prefixed() {
while :; do
local sortby="name"
- local num_devs=0
+ local progress=0
# HACK: sort also by minors - so we try to close 'possibly later' created device first
test "$i" = 0 || sortby="-minor"
@@ -447,23 +447,23 @@ teardown_devs_prefixed() {
DM_NAME=${dm##DM_NAME=}
DM_NAME=${DM_NAME%%;DM_OPEN*}
DM_OPEN=${dm##*;DM_OPEN=}
+ local force="-f"
if test "$i" = 0; then
if test "$once" = 1 ; then
once=0
echo "## removing stray mapped devices with names beginning with $prefix: "
fi
test "$DM_OPEN" = 0 || break # stop loop with 1st. opened device
- dmsetup remove "$DM_NAME" --mangle none || true # &>/dev/null || touch REMOVE_FAILED &
- else
- dmsetup remove -f "$DM_NAME" --mangle none || true
+ force=""
fi
- num_devs=$(( num_devs + 1 ))
+ # Succesfull 'remove' signals progress
+ dmsetup remove $force "$DM_NAME" --mangle none && progress=1
done
test "$i" = 0 || break
- test "$num_devs" -gt 0 || break
+ test "$progress" = 1 || break
udev_wait
wait
3 years, 7 months
stable-2.02 - tests: rename shown debug trace
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=bd860802d4cfabaef1d...
Commit: bd860802d4cfabaef1da46140895826a80932d6e
Parent: 1d7d3db571e09a25aa7329056f5e052932519212
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Oct 2 19:17:36 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: rename shown debug trace
As there could be few invokes of stacktrace, avoid
repeatedly display logs from commands.
So after first display rename debug.log* -> debug_log
so the file still can remain for reading in test dir.
---
test/lib/utils.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/test/lib/utils.sh b/test/lib/utils.sh
index 4f4bf9a21..f01f5bdb0 100644
--- a/test/lib/utils.sh
+++ b/test/lib/utils.sh
@@ -171,6 +171,7 @@ STACKTRACE() {
test "$name" = "DEBUG" && { name="$name$idx" ; idx=$(( idx + 1 )) ; }
echo "<======== Debug log $i ========>"
sed -e "s,^,## $name: ," "$i"
+ mv -f "$i" "debug_${i#debug.}"
done
if test -e strace.log ; then
echo "<======== Strace debug log ========>"
3 years, 7 months
stable-2.02 - tests: check some common errors
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2de99760f7a3364a3a3...
Commit: 2de99760f7a3364a3a33373b6d28782c4423e4fd
Parent: c380d4e9e27470473c2a29e518bb27f7eec622c6
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 25 22:47:19 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: check some common errors
Collect some cases users are hitting when working
with thin-pools which has mismatching kernel metadata content with
lvm2 metadata.
---
test/shell/thin-errors.sh | 79 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/test/shell/thin-errors.sh b/test/shell/thin-errors.sh
new file mode 100644
index 000000000..7bdf268e1
--- /dev/null
+++ b/test/shell/thin-errors.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 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
+
+# Test various error conditions user may hit with thin volumes
+
+SKIP_WITH_LVMLOCKD=1
+SKIP_WITH_LVMPOLLD=1
+
+export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false}
+
+. lib/inittest
+
+#
+# Main
+#
+aux have_thin 1 3 0 || skip
+aux thin_pool_error_works_32 || skip
+
+aux prepare_vg 2
+
+###############################################
+# Testing failing thin-pool metadata device #
+###############################################
+
+lvcreate -T -L1M --errorwhenfull y $vg/pool
+lvcreate -V2 -n $lv1 $vg/pool
+lvcreate -s -n $lv2 $vg/$lv1
+
+# Prepare old metadata with transaction_id 2
+vgcfgbackup -f mda_tid_2 $vg
+
+lvcreate -s -n $lv3 $vg/$lv1
+lvcreate -s -n $lv4 $vg/$lv1
+lvcreate -s -n $lv5 $vg/$lv1
+
+vgcfgbackup -f mda_tid_5 $vg
+
+# Restore mismatching old metadata with different transaction_id
+vgcfgrestore -f mda_tid_2 --force --yes $vg
+
+
+not lvcreate -s -n $lv5 $vg/$lv1
+
+sed -e 's/transaction_id = 2/transaction_id = 5/g' mda_tid_2 > mda_tid_2_5
+
+# Restore metadata with matching transaction_id,
+# but already existing device in kernel, unknown to lvm2
+vgcfgrestore -f mda_tid_2_5 --force --yes $vg
+
+not lvcreate -s -n $lv5 $vg/$lv1
+# can be tried repeatedly
+not lvcreate -s -n $lv5 $vg/$lv1
+
+
+# Restore matching metadata and check all works
+# and no kernel thin device was lost
+vgcfgrestore -f mda_tid_5 --force --yes $vg
+
+lvcreate -s -n $lv6 $vg/$lv1
+
+lvchange -ay -K $vg
+
+check active $vg $lv1
+check active $vg $lv2
+check active $vg $lv3
+check active $vg $lv4
+check active $vg $lv5
+check active $vg $lv6
+
+vgremove -ff $vg
3 years, 7 months
stable-2.02 - tests: add small delay
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1d7d3db571e09a25aa7...
Commit: 1d7d3db571e09a25aa7329056f5e052932519212
Parent: 2de99760f7a3364a3a33373b6d28782c4423e4fd
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Sep 23 22:09:37 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: add small delay
Prevent there is no i.e. udev trying to open our device.
---
test/shell/snapshot-remove-dmsetup.sh | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/test/shell/snapshot-remove-dmsetup.sh b/test/shell/snapshot-remove-dmsetup.sh
index a7925d5d5..55957eb0c 100644
--- a/test/shell/snapshot-remove-dmsetup.sh
+++ b/test/shell/snapshot-remove-dmsetup.sh
@@ -61,7 +61,9 @@ dmsetup resume $vg1-snap
wait $DMPID
-# Try how force removal works
+# Try how force removal works (and wait till there is no user)
+sync
+sleep .5
dmsetup suspend $vg-$lv1
# needs to fail as device is still open
not dmsetup remove --force $vg1-snap &
3 years, 7 months
stable-2.02 - tests: also add thick snap of thin volume
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=c380d4e9e27470473c2...
Commit: c380d4e9e27470473c2a29e518bb27f7eec622c6
Parent: e05c882ab5a2ef55ff86fc326f845220c34504b0
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Sep 24 20:49:52 2020 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Oct 16 18:09:55 2020 +0200
tests: also add thick snap of thin volume
---
test/shell/vgsplit-thin.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/test/shell/vgsplit-thin.sh b/test/shell/vgsplit-thin.sh
index a2d0a0b7f..abe9f552f 100644
--- a/test/shell/vgsplit-thin.sh
+++ b/test/shell/vgsplit-thin.sh
@@ -27,6 +27,7 @@ get_devs
vgcreate "$vg1" "${DEVICES[@]}"
lvcreate -T -L8M $vg1/pool1 -V10M -n $lv1 "$dev1" "$dev2"
lvcreate -T -L8M $vg1/pool2 -V10M -n $lv2 "$dev3" "$dev4"
+lvcreate -s -L2M -n snap $vg1/$lv1 "$dev2"
# Test with external origin if available
lvcreate -l1 -an -pr --zero n -n eorigin $vg1 "$dev5"
3 years, 7 months