Compare commits

...

No commits in common. 'c9' and 'i10cs' have entirely different histories.
c9 ... i10cs

2
.gitignore vendored

@ -1 +1 @@
SOURCES/LVM2.2.03.21.tgz SOURCES/LVM2.2.03.28.tgz

@ -1 +1 @@
b6d4a84bf1f0306f43f447c7531021d5c126edbf SOURCES/LVM2.2.03.21.tgz 762d6924860a01973ca61543208d97ef385be1f6 SOURCES/LVM2.2.03.28.tgz

@ -0,0 +1,27 @@
From 5c75121219a2893f862ee18ea9717b1571894df0 Mon Sep 17 00:00:00 2001
From: Marian Csontos <mcsontos@redhat.com>
Date: Thu, 16 May 2024 12:12:06 +0200
Subject: [PATCH 1/7] RHEL10
---
VERSION | 2 +-
VERSION_DM | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/VERSION b/VERSION
index 7619e491b..c7e862d03 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.03.28(2) (2024-11-04)
+2.03.28(2)-RHEL10 (2024-11-04)
diff --git a/VERSION_DM b/VERSION_DM
index 16d64d69d..110bb139b 100644
--- a/VERSION_DM
+++ b/VERSION_DM
@@ -1 +1 @@
-1.02.202 (2024-11-04)
+1.02.202-RHEL10 (2024-11-04)
--
2.47.0

@ -1,84 +0,0 @@
From ecea7b14c453a58831f2dda5a0aa869ee4601dff Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Mon, 24 Apr 2023 15:47:45 -0500
Subject: [PATCH 1/2] fix dev_name use in add_areas_line
This function was relying on dev_name() returning NULL
to indicate no device, but dev_name never returns NULL.
(cherry picked from commit 31cfcf7ce9aab5dd16ba15e48bfe33be849fad4c)
---
lib/activate/dev_manager.c | 45 ++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 16 deletions(-)
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 07d58733e..ac3f01718 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -3000,34 +3000,47 @@ static int _add_error_area(struct dev_manager *dm, struct dm_tree_node *node,
return 1;
}
+static int _bad_pv_area(struct lv_segment *seg, uint32_t s)
+{
+ struct stat info;
+ const char *name;
+ struct device *dev;
+
+ if (!seg_pvseg(seg, s))
+ return 1;
+ if (!seg_pv(seg, s))
+ return 1;
+ if (!(dev = seg_dev(seg, s)))
+ return 1;
+ if (dm_list_empty(&dev->aliases))
+ return 1;
+ /* FIXME Avoid repeating identical stat in dm_tree_node_add_target_area */
+ name = dev_name(dev);
+ if (stat(name, &info) < 0)
+ return 1;
+ if (!S_ISBLK(info.st_mode))
+ return 1;
+ return 0;
+}
+
int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
struct dm_tree_node *node, uint32_t start_area,
uint32_t areas)
{
+ struct cmd_context *cmd = seg->lv->vg->cmd;
uint64_t extent_size = seg->lv->vg->extent_size;
uint32_t s;
char *dlid;
- struct stat info;
const char *name;
unsigned num_error_areas = 0;
unsigned num_existing_areas = 0;
- /* FIXME Avoid repeating identical stat in dm_tree_node_add_target_area */
for (s = start_area; s < areas; s++) {
-
- /* FIXME: dev_name() does not return NULL! It needs to check if dm_list_empty(&dev->aliases)
- but this knot of logic is too complex to pull apart without careful deconstruction. */
-
- if ((seg_type(seg, s) == AREA_PV &&
- (!seg_pvseg(seg, s) || !seg_pv(seg, s) || !seg_dev(seg, s) ||
- !(name = dev_name(seg_dev(seg, s))) || !*name ||
- stat(name, &info) < 0 || !S_ISBLK(info.st_mode))) ||
- (seg_type(seg, s) == AREA_LV && !seg_lv(seg, s))) {
- if (!seg->lv->vg->cmd->partial_activation) {
- if (!seg->lv->vg->cmd->degraded_activation ||
- !lv_is_raid_type(seg->lv)) {
- log_error("Aborting. LV %s is now incomplete "
- "and '--activationmode partial' was not specified.",
+ if (((seg_type(seg, s) == AREA_PV) && _bad_pv_area(seg, s)) ||
+ ((seg_type(seg, s) == AREA_LV) && !seg_lv(seg, s))) {
+ if (!cmd->partial_activation) {
+ if (!cmd->degraded_activation || !lv_is_raid_type(seg->lv)) {
+ log_error("Aborting. LV %s is incomplete and --activationmode partial was not specified.",
display_lvname(seg->lv));
return 0;
}
--
2.40.1

@ -0,0 +1,104 @@
From 4a34959c1cc199c05b9d9d4516a05164d36370e1 Mon Sep 17 00:00:00 2001
From: Peter Rajnoha <prajnoha@redhat.com>
Date: Tue, 5 Nov 2024 09:26:03 +0100
Subject: [PATCH 2/7] lv_manip: fix stripe count and size validation for RAID
LVs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix stripe count and size parameter validation for RAID LVs and
include existing automatic setting of these parameters based
on current shape of the RAID LV in case these are not set
on command line fully.
Previously, this was done only to a certain subset given by this
condition (where the 'stripes' is the '-i|--stripes' cmd line arg
and the 'stripe_size' is actually the '-I|--stripesize' cmd line arg):
!(stripes == 1 || (stripes > 1 && stripe_size))
This condition is a bit harder to follow at first sight and there
are no comments around with explanation for why this one is used,
so let's analyze it a bit more.
First, let's convert this to an equivalent condition (De Morgan law)
so it's easier to read for humans:
stripes != 1 && !(stripes > 1 && stripe_size)
Note: Both stripe and stripesize are unsigned integers, so they can't be negative.
Now, based on that condition, we were running the code to deduce the
stripe/stripesize and do the checks ("the code") only if both of these
are true:
- stripes is different from 1
- we don't have stripes > 1 and stripe_size defined at the same time
But this is not correct in all cases, because:
A) if someone uses stripes = 0, then "the code" is executed
(correct)
B) if someone uses stripes = 1, then "the code" is not executed
(wrong: we still need to be able to check the args against
existing RAID LV stripes whether it matches)
- if someone uses stripes > 1, then "the code" is:
C) if stripe_size = 0, executed
(correct)
D) if stripe_size > 0, not executed
(wrong: we still want to check against existing RAID LV stripes)
Current issues with this condition:
The B) ends up with segfault.
lvextend -i 1 -l+1 vg/lvol0
Rounding size 4.00 MiB (1 extents) up to stripe boundary size 8.00 MiB (2 extents).
Segmentation fault (core dumped)
The D) ends up with errors like:
lvextend -i 3 -l+1 -I128k vg/lvol0
Rounding size 4.00 MiB (1 extents) up to stripe boundary size 8.00 MiB (2 extents).
Rounding size (4 extents) up to stripe boundary size for segment (5 extents).
Size of logical volume vg/lvol0 changed from 8.00 MiB (2 extents) to 20.00 MiB (5 extents).
LV lvol0: segment 1 with len=5 has inconsistent area_len 3
Couldn't read all logical volumes for volume group vg.
Failed to write VG vg.
Conclusion:
The condition needs to be removed so we always run "the code" to check
given striping args given on command line against existing RAID LV
striping. The reason is that we don't want to allow changing stripe
count for RAID LVs through lvextend and we need to end up with the
error:
"Unable to extend <RAID segment type> segment type with different number of stripes"
(We do support changing the striping by lvconvert's reshaping functionality only).
(cherry picked from commit b5249fa3c20fe5d9e1d4811e7e5bfd957b15a820)
---
lib/metadata/lv_manip.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index a1d4f641a..e14947357 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5468,7 +5468,7 @@ static int _lvresize_adjust_extents(struct logical_volume *lv,
} else if (seg_is_raid0(seg_last)) {
lp->stripes = seg_last->area_count;
lp->stripe_size = seg_last->stripe_size;
- } else if (!(lp->stripes == 1 || (lp->stripes > 1 && lp->stripe_size))) {
+ } else {
/* If extending, find stripes, stripesize & size of last segment */
/* FIXME Don't assume mirror seg will always be AREA_LV */
/* FIXME We will need to support resize for metadata LV as well,
--
2.47.0

@ -1,510 +0,0 @@
From fb1e53f229f4bcde07df4b562927e213bd7f8d17 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 22 Mar 2023 13:05:43 -0500
Subject: [PATCH 2/2] raidintegrity: allow snapshots
(cherry picked from commit fd6e113bba5fed5ee41152cde33220294c24ce2b)
---
lib/activate/dev_manager.c | 6 +-
lib/metadata/integrity_manip.c | 5 -
lib/metadata/snapshot_manip.c | 2 -
test/shell/snapshot-raid.sh | 441 +++++++++++++++++++++++++++++++++
4 files changed, 446 insertions(+), 8 deletions(-)
create mode 100644 test/shell/snapshot-raid.sh
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index ac3f01718..1f4d7c98b 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -3039,7 +3039,11 @@ int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
if (((seg_type(seg, s) == AREA_PV) && _bad_pv_area(seg, s)) ||
((seg_type(seg, s) == AREA_LV) && !seg_lv(seg, s))) {
if (!cmd->partial_activation) {
- if (!cmd->degraded_activation || !lv_is_raid_type(seg->lv)) {
+ if (!cmd->degraded_activation ||
+ (!lv_is_raid_type(seg->lv) &&
+ !lv_is_integrity(seg->lv) &&
+ !lv_is_integrity_metadata(seg->lv) &&
+ !lv_is_integrity_origin(seg->lv))) {
log_error("Aborting. LV %s is incomplete and --activationmode partial was not specified.",
display_lvname(seg->lv));
return 0;
diff --git a/lib/metadata/integrity_manip.c b/lib/metadata/integrity_manip.c
index 456795532..506b9f06b 100644
--- a/lib/metadata/integrity_manip.c
+++ b/lib/metadata/integrity_manip.c
@@ -508,11 +508,6 @@ int lv_add_integrity_to_raid(struct logical_volume *lv, struct integrity_setting
return 0;
}
- if (lv_is_origin(lv)) {
- log_error("Integrity cannot be added to snapshot origins.");
- return 0;
- }
-
seg_top = first_seg(lv);
area_count = seg_top->area_count;
diff --git a/lib/metadata/snapshot_manip.c b/lib/metadata/snapshot_manip.c
index 822b8da77..b34079d08 100644
--- a/lib/metadata/snapshot_manip.c
+++ b/lib/metadata/snapshot_manip.c
@@ -423,8 +423,6 @@ int validate_snapshot_origin(const struct logical_volume *origin_lv)
}
} else if (lv_is_raid_type(origin_lv) && !lv_is_raid(origin_lv)) {
err = "raid subvolumes";
- } else if (lv_is_raid(origin_lv) && lv_raid_has_integrity((struct logical_volume *)origin_lv)) {
- err = "raid with integrity";
}
out:
diff --git a/test/shell/snapshot-raid.sh b/test/shell/snapshot-raid.sh
new file mode 100644
index 000000000..757bf911e
--- /dev/null
+++ b/test/shell/snapshot-raid.sh
@@ -0,0 +1,441 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2018 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 snapshots of raid
+
+SKIP_WITH_LVMPOLLD=1
+
+. lib/inittest
+
+which mkfs.ext4 || skip
+
+mount_dir="mnt"
+mkdir -p "$mount_dir"
+
+snap_dir="mnt_snap"
+mkdir -p "$snap_dir"
+
+_sync_percent() {
+ local checklv=$1
+ get lv_field "$checklv" sync_percent | cut -d. -f1
+}
+
+_wait_sync() {
+ local checklv=$1
+
+ for i in $(seq 1 10) ; do
+ sync=$(_sync_percent "$checklv")
+ echo "sync_percent is $sync"
+
+ if test "$sync" = "100"; then
+ return
+ fi
+
+ sleep 1
+ done
+ echo "timeout waiting for recalc"
+ dmsetup status "$DM_DEV_DIR/mapper/${checklv/\//-}"
+ return 1
+}
+
+
+# add and remove a snapshot
+
+test_add_del_snap() {
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ not ls "$snap_dir/B"
+ touch "$snap_dir/C"
+ not ls "$mount_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+ umount "$mount_dir"
+}
+
+# add and remove snapshot while origin has a missing raid image
+
+test_snap_with_missing_image() {
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ aux disable_dev "$dev1"
+ lvs -a -o+devices $vg
+
+ not lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+
+ aux enable_dev "$dev1"
+ _wait_sync $vg/$lv1
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+
+ aux disable_dev "$dev1"
+ lvs -a -o+devices $vg
+
+ lvremove -y $vg/snap
+
+ aux enable_dev "$dev1"
+ vgextend --restoremissing $vg "$dev1"
+ lvs -a -o+devices $vg
+ _wait_sync $vg/$lv1
+
+ umount "$mount_dir"
+}
+
+# raid image is lost and restored while a snapshot exists
+
+test_missing_image_with_snap() {
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ aux disable_dev "$dev1"
+ lvs -a -o+devices $vg
+
+ touch "$mount_dir/B"
+ not ls "$snap_dir/B"
+ touch "$snap_dir/C"
+ not ls "$mount_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+
+ aux enable_dev "$dev1"
+ _wait_sync $vg/$lv1
+
+ ls "$mount_dir/B"
+ ls "$snap_dir/C"
+
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+ umount "$mount_dir"
+}
+
+# add and remove raid image while snapshot exists
+
+test_add_del_image_with_snap() {
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ touch "$snap_dir/C"
+
+ lvconvert -y -m+1 $vg/$lv1 "$dev4"
+ _wait_sync $vg/$lv1
+
+ ls "$mount_dir/B"
+ ls "$snap_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+
+ touch "$mount_dir/B2"
+ touch "$snap_dir/C2"
+
+ lvconvert -y -m-1 $vg/$lv1 "$dev4"
+
+ ls "$mount_dir/B"
+ ls "$snap_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+ ls "$mount_dir/B2"
+ ls "$snap_dir/C2"
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+
+ umount "$mount_dir"
+}
+
+test_replace_image_with_snap() {
+ # add an image to replace
+ lvconvert -y -m+1 $vg/$lv1 "$dev4"
+ _wait_sync $vg/$lv1
+
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ touch "$snap_dir/C"
+
+ lvconvert -y --replace "$dev4" $vg/$lv1 "$dev5"
+ _wait_sync $vg/$lv1
+
+ ls "$mount_dir/B"
+ ls "$snap_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+
+ touch "$mount_dir/B2"
+ touch "$snap_dir/C2"
+
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+
+ # put lv1 back to original state with images on dev1 and dev2
+ lvconvert -y -m-1 $vg/$lv1 "$dev5"
+
+ umount "$mount_dir"
+}
+
+test_repair_image_with_snap() {
+ # add an image to repair
+ lvconvert -y -m+1 $vg/$lv1 "$dev4"
+ _wait_sync $vg/$lv1
+
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ touch "$snap_dir/C"
+
+ aux disable_dev "$dev4"
+ lvs -a -o+devices $vg
+
+ lvconvert -y --repair $vg/$lv1 "$dev5"
+ _wait_sync $vg/$lv1
+
+ ls "$mount_dir/B"
+ ls "$snap_dir/C"
+ ls "$mount_dir/A"
+ ls "$snap_dir/A"
+
+ touch "$mount_dir/B2"
+ touch "$snap_dir/C2"
+
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+
+ aux enable_dev "$dev4"
+ lvs -a -o+devices $vg
+ vgck --updatemetadata $vg
+
+ # put lv1 back to original state with images on dev1 and dev2
+ lvconvert -y -m-1 $vg/$lv1 "$dev5"
+
+ umount "$mount_dir"
+}
+
+test_merge_snap()
+{
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ touch "$snap_dir/C"
+
+ umount "$snap_dir"
+
+ lvconvert --merge $vg/snap
+
+ # the merge will begin once the origin is not in use
+ umount "$mount_dir"
+
+ lvs -a $vg
+ lvchange -an $vg/$lv1
+ lvchange -ay $vg/$lv1
+ lvs -a $vg
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ ls "$mount_dir/A"
+ ls "$mount_dir/C"
+ not ls "$mount_dir/B"
+
+ umount "$mount_dir"
+}
+
+test_extend_snap()
+{
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L8M $vg/$lv1 "$dev3"
+ mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+ touch "$mount_dir/B"
+ touch "$snap_dir/C"
+
+ lvextend -L+8M $vg/snap
+
+ umount "$mount_dir"
+ umount "$snap_dir"
+ lvremove -y $vg/snap
+}
+
+test_fill_snap()
+{
+ mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+ mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+ touch "$mount_dir/A"
+
+ lvcreate -s -n snap -L4M $vg/$lv1 "$dev3"
+
+ lvs -a $vg
+ get lv_field $vg/snap lv_attr | grep "swi-a-s---"
+
+ dd if=/dev/zero of="$mount_dir/1" bs=1M count=1 oflag=sync
+ dd if=/dev/zero of="$mount_dir/2" bs=1M count=1 oflag=sync
+ dd if=/dev/zero of="$mount_dir/3" bs=1M count=1 oflag=sync
+ dd if=/dev/zero of="$mount_dir/4" bs=1M count=1 oflag=sync
+ dd if=/dev/zero of="$mount_dir/5" bs=1M count=1 oflag=sync
+
+ lvs -a $vg
+ get lv_field $vg/snap lv_attr | grep "swi-I-s---"
+ check lv_field $vg/snap data_percent "100.00"
+
+ umount "$mount_dir"
+ lvremove -y $vg/snap
+}
+
+aux prepare_devs 5 200
+
+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
+
+lvcreate --type raid1 -m1 -n $lv1 -L128M $vg "$dev1" "$dev2"
+_wait_sync $vg/$lv1
+test_add_del_snap
+test_snap_with_missing_image
+test_missing_image_with_snap
+test_add_del_image_with_snap
+test_replace_image_with_snap
+test_repair_image_with_snap
+test_merge_snap
+test_extend_snap
+test_fill_snap
+lvremove -y $vg/$lv1
+
+lvcreate --type raid1 -m1 --raidintegrity y -n $lv1 -L128M $vg "$dev1" "$dev2"
+_wait_sync $vg/${lv1}_rimage_0
+_wait_sync $vg/${lv1}_rimage_1
+_wait_sync $vg/$lv1
+test_add_del_snap
+test_snap_with_missing_image
+test_missing_image_with_snap
+test_add_del_image_with_snap
+test_replace_image_with_snap
+test_repair_image_with_snap
+test_merge_snap
+test_extend_snap
+test_fill_snap
+lvremove -y $vg/$lv1
+
+# Repeat above with cache|writecache on the raid image?
+
+#
+# Add/remove integrity while a snapshot exists
+#
+
+lvcreate --type raid1 -m1 -n $lv1 -L128M $vg "$dev1" "$dev2"
+_wait_sync $vg/$lv1
+mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+touch "$mount_dir/A"
+
+lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+touch "$mount_dir/B"
+touch "$snap_dir/C"
+
+lvconvert --raidintegrity y $vg/$lv1
+_wait_sync $vg/${lv1}_rimage_0
+_wait_sync $vg/${lv1}_rimage_1
+
+ls "$mount_dir/B"
+ls "$snap_dir/C"
+ls "$mount_dir/A"
+ls "$snap_dir/A"
+
+touch "$mount_dir/B2"
+touch "$snap_dir/C2"
+
+lvconvert --raidintegrity n $vg/$lv1
+
+ls "$mount_dir/B"
+ls "$snap_dir/C"
+ls "$mount_dir/A"
+ls "$snap_dir/A"
+ls "$mount_dir/B2"
+ls "$snap_dir/C2"
+umount "$snap_dir"
+umount "$mount_dir"
+lvremove -y $vg/snap
+lvremove -y $vg/$lv1
+
+#
+# Add integrity not allowed with missing image and snapshot exists
+#
+
+lvcreate --type raid1 -m1 -n $lv1 -L128M $vg "$dev1" "$dev2"
+_wait_sync $vg/$lv1
+mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
+
+mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
+touch "$mount_dir/A"
+
+lvcreate -s -n snap -L12M $vg/$lv1 "$dev3"
+mount "$DM_DEV_DIR/$vg/snap" "$snap_dir"
+
+touch "$mount_dir/B"
+touch "$snap_dir/C"
+
+aux disable_dev "$dev1"
+lvs -a $vg
+
+not lvconvert --raidintegrity y $vg/$lv1
+
+aux enable_dev "$dev1"
+lvs -a $vg
+
+umount "$snap_dir"
+umount "$mount_dir"
+lvremove -y $vg/snap
+lvremove -y $vg/$lv1
+
+vgremove -ff $vg
+
--
2.40.1

@ -0,0 +1,30 @@
From f006e040090f9f3466c5e789157903607447a08e Mon Sep 17 00:00:00 2001
From: Peter Rajnoha <prajnoha@redhat.com>
Date: Tue, 5 Nov 2024 14:48:23 +0100
Subject: [PATCH 3/7] lv_manip: use the same param validation for RAID 0 as for
RAID 1/4/5/6
This actually reverts commit 83ae675f8df53010c984b78d0318d0d92d5ac83a.
(cherry picked from commit 1d8a4c4817895f45a5fee00ccf721b351e5a4668)
---
lib/metadata/lv_manip.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index e14947357..15a7f3c9a 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5465,9 +5465,6 @@ static int _lvresize_adjust_extents(struct logical_volume *lv,
/* FIXME Warn if command line values are being overridden? */
lp->stripes = seg_last->area_count / seg_mirrors;
lp->stripe_size = seg_last->stripe_size;
- } else if (seg_is_raid0(seg_last)) {
- lp->stripes = seg_last->area_count;
- lp->stripe_size = seg_last->stripe_size;
} else {
/* If extending, find stripes, stripesize & size of last segment */
/* FIXME Don't assume mirror seg will always be AREA_LV */
--
2.47.0

@ -1,26 +0,0 @@
From 1835574e39e9417b3800469fe80ce47d2210b9a7 Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Sun, 23 Apr 2023 12:49:37 +0200
Subject: [PATCH 3/8] lvmdbus: preserve PATH envvar
(cherry picked from commit afc02ae6e7234e1190cedf5c74ca3d6367efd7d1)
---
daemons/lvmdbusd/lvm_shell_proxy.py.in | 2 ++
1 file changed, 2 insertions(+)
diff --git a/daemons/lvmdbusd/lvm_shell_proxy.py.in b/daemons/lvmdbusd/lvm_shell_proxy.py.in
index b8c8fa565..02a776e1d 100755
--- a/daemons/lvmdbusd/lvm_shell_proxy.py.in
+++ b/daemons/lvmdbusd/lvm_shell_proxy.py.in
@@ -154,6 +154,8 @@ class LVMShellProxy(object):
# If any env variables contain LVM we will propagate them too
for k, v in os.environ.items():
+ if "PATH" in k:
+ local_env[k] = v
if "LVM" in k:
local_env[k] = v
--
2.40.1

@ -1,43 +0,0 @@
From 80b73e2901d470fd3d1f45664626980167091f02 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Tue, 25 Apr 2023 14:46:36 -0500
Subject: [PATCH 4/8] lvmcache: fix valgrind error when dropping md duplicate
When lvmcache info is dropped because it's an md component,
then the lvmcache vginfo can also be dropped, but the list
iterator was still using the list head in vginfo, so break
from the loop earlier to avoid it.
(cherry picked from commit 6d262eaf640dead7861c1a7716e216b9bcea75e5)
---
lib/cache/lvmcache.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index b8a9eac25..127d29229 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -1503,6 +1503,9 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
*/
dm_list_iterate_items_safe(vginfo, vginfo2, &_vginfos) {
+ char vgid[ID_LEN + 1] __attribute__((aligned(8))) = { 0 };
+ memcpy(vgid, vginfo->vgid, ID_LEN);
+
dm_list_iterate_items_safe(info, info2, &vginfo->infos) {
dev = info->dev;
device_hint = _get_pvsummary_device_hint(dev->pvid);
@@ -1557,6 +1560,10 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
/* lvmcache_del will also delete vginfo if info was last one */
lvmcache_del(info);
cmd->filter->wipe(cmd, cmd->filter, dev, NULL);
+
+ /* If vginfo was deleted don't continue using vginfo->infos */
+ if (!_search_vginfos_list(NULL, vgid))
+ break;
}
}
}
--
2.40.1

@ -0,0 +1,31 @@
From a6b5d4dad0e71c2774edb29bb087c84bfac53210 Mon Sep 17 00:00:00 2001
From: Peter Rajnoha <prajnoha@redhat.com>
Date: Tue, 5 Nov 2024 14:20:59 +0100
Subject: [PATCH 4/7] tests: remove superfluous -a option for df used in
lvresize-xfs.sh
The df -a looks at whole system and it returns an error code in case
there's an inaccessible fs which is not even part of the testing environment.
The -a for df is not actually needed here in the lvresize-xfs test, so remove it.
(cherry picked from commit a2ca20dad98f4d7389d449672b3ff0b16858f02b)
---
test/shell/lvresize-xfs.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/shell/lvresize-xfs.sh b/test/shell/lvresize-xfs.sh
index da204dac6..87fbf6f9d 100644
--- a/test/shell/lvresize-xfs.sh
+++ b/test/shell/lvresize-xfs.sh
@@ -113,7 +113,7 @@ dd if=/dev/zero of="$mount_dir_space/zeros1" bs=1M count=20 oflag=direct
# succeeds, then the xfs extend fails because it cannot be done unmounted
not lvextend --fs resize --fsmode offline -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "320.00m"
-df -a | tee dfa
+df | tee dfa
grep "$mount_dir_space" dfa
df --output=size "$mount_dir_space" |tee df2
# fs not extended so fs size not changed
--
2.47.0

@ -0,0 +1,26 @@
From 38177186f79c44ba62aca80bdfe1b72ad2d6e84c Mon Sep 17 00:00:00 2001
From: Peter Rajnoha <prajnoha@redhat.com>
Date: Wed, 6 Nov 2024 10:39:27 +0100
Subject: [PATCH 5/7] WHATS_NEW: update
(cherry picked from commit 44a04b71f8e8ff730b5538c4b6323041cf904ece)
---
WHATS_NEW | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/WHATS_NEW b/WHATS_NEW
index 85ffe0d0c..d07a1eaeb 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,3 +1,8 @@
+Version 2.03.29 -
+==================
+ Fix segfault/VG write error for raid LV lvextend -i|--stripes -I|--stripesize.
+ Revert ignore -i|--stripes, -I|--stripesize for lvextend on raid0 LV (2.03.27).
+
Version 2.03.28 - 04th November 2024
====================================
Use radix_tree to lookup for UUID within committed metadata.
--
2.47.0

@ -1,31 +0,0 @@
From 0a9228807d0b3901be4ccf29311a955efba4877e Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Fri, 28 Apr 2023 13:31:39 -0500
Subject: [PATCH 5/8] pvck: improve error for write to existing file
(cherry picked from commit c4440b5b495a2d11ff541dd7e7791e2a83c83609)
---
tools/pvck.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/pvck.c b/tools/pvck.c
index 879810b76..0998caaf5 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -1444,8 +1444,13 @@ static int _dump_metadata(struct cmd_context *cmd, const char *dump, struct sett
int bad = 0;
if (arg_is_set(cmd, file_ARG)) {
+ struct stat sb;
if (!(tofile = arg_str_value(cmd, file_ARG, NULL)))
return 0;
+ if (!stat(tofile, &sb)) {
+ log_error("File already exists.");
+ return 0;
+ }
}
if (set->mda_num)
--
2.40.1

@ -1,87 +0,0 @@
From 7702262444a5af924d0fc94ff956663aab3505df Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Tue, 2 May 2023 16:12:23 -0500
Subject: [PATCH 6/8] lvreduce: make _lvseg_get_stripes handle integrity layer
lvreduce uses _lvseg_get_stripes() which was unable to get raid stripe
info with an integrity layer present. This caused lvreduce on a
raid+integrity LV to fail prematurely when checking stripe parameters.
An unhelpful error message about stripe size would be printed.
(cherry picked from commit 368381fd4022dc99ffe551b30ed75c3ddbc5c5c8)
---
lib/metadata/lv_manip.c | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 2a4e0e88a..add9512ff 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5144,22 +5144,39 @@ int lv_extend_policy_calculate_percent(struct logical_volume *lv,
static uint32_t _lvseg_get_stripes(struct lv_segment *seg, uint32_t *stripesize)
{
- uint32_t s;
- struct lv_segment *seg_mirr;
+ uint32_t s, a;
+ struct lv_segment *seg_get, *seg_image, *seg_iorig;
+ struct logical_volume *lv_image, *lv_iorig;
/* If segment mirrored, check if images are striped */
- if (seg_is_mirrored(seg))
+ if (seg_is_mirrored(seg)) {
for (s = 0; s < seg->area_count; s++) {
if (seg_type(seg, s) != AREA_LV)
continue;
- seg_mirr = first_seg(seg_lv(seg, s));
- if (seg_is_striped(seg_mirr)) {
- seg = seg_mirr;
+ lv_image = seg_lv(seg, s);
+ seg_image = first_seg(lv_image);
+ seg_get = NULL;
+
+ if (seg_is_integrity(seg_image)) {
+ /* Get stripe values from the iorig layer. */
+ for (a = 0; a < seg_image->area_count; a++) {
+ lv_iorig = seg_lv(seg_image, a);
+ seg_iorig = first_seg(lv_iorig);
+ seg_get = seg_iorig;
+ break;
+ }
+ } else {
+ /* Get stripe values from the image layer. */
+ seg_get = seg_image;
+ }
+
+ if (seg_get && seg_is_striped(seg_get)) {
+ seg = seg_get;
break;
}
}
-
+ }
if (seg_is_striped(seg)) {
*stripesize = seg->stripe_size;
@@ -5168,7 +5185,7 @@ static uint32_t _lvseg_get_stripes(struct lv_segment *seg, uint32_t *stripesize)
if (seg_is_raid(seg)) {
*stripesize = seg->stripe_size;
- return _raid_stripes_count(seg);
+ return _raid_stripes_count(seg);
}
*stripesize = 0;
@@ -5593,7 +5610,7 @@ static int _lvresize_adjust_extents(struct logical_volume *lv,
seg_size /= seg_mirrors;
lp->extents = logical_extents_used + seg_size;
break;
- }
+ }
} else if (new_extents <= logical_extents_used + seg_logical_extents) {
seg_size = new_extents - logical_extents_used;
lp->extents = new_extents;
--
2.40.1

@ -0,0 +1,59 @@
From 9a735a3998b96adf8259759b4c228c308327a54d Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Fri, 8 Nov 2024 16:12:30 +0100
Subject: [PATCH 6/7] vdo: fix input units for minimim_io_size
When specifying minimum_io_size with --vdosettings,
command assumed wrong unit (sectors).
So '--vdosettings minimum_io_size=512|4096' resulted into
an error that only 512 or 4096 values are allowed, but
at the same time values 1 or 8 were accepted.
So fix by converting any number >= 512 to 'sectors' and
keep input of 1 or 8 still valid if anyone has been using
this before.
So now we take 512 or 4096 and still also 1 or 8 with the
same effect.
Also correct the 'error' message when invalid minimum_io_size
is specified.
(cherry picked from commit 158d3243b638f50f62c60128168c21840787f1ab)
---
device_mapper/vdo/vdo_target.c | 2 +-
tools/toollib.c | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/device_mapper/vdo/vdo_target.c b/device_mapper/vdo/vdo_target.c
index a8a753e39..cdd3dbe6d 100644
--- a/device_mapper/vdo/vdo_target.c
+++ b/device_mapper/vdo/vdo_target.c
@@ -28,7 +28,7 @@ bool dm_vdo_validate_target_params(const struct dm_vdo_target_params *vtp,
if ((vtp->minimum_io_size != (512 >> SECTOR_SHIFT)) &&
(vtp->minimum_io_size != (4096 >> SECTOR_SHIFT))) {
log_error("VDO minimum io size %u is unsupported [512, 4096].",
- vtp->minimum_io_size);
+ (vtp->minimum_io_size << SECTOR_SHIFT));
valid = false;
}
diff --git a/tools/toollib.c b/tools/toollib.c
index dcb6c8f4f..f854d17c5 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1372,6 +1372,10 @@ int get_vdo_settings(struct cmd_context *cmd,
u |= VDO_CHANGE_ONLINE;
}
+ /* store size in sector units */
+ if (vtp->minimum_io_size >= 512)
+ vtp->minimum_io_size >>= SECTOR_SHIFT;
+
// validation of updated VDO option
if (!dm_vdo_validate_target_params(vtp, 0 /* vdo_size */))
goto_out;
--
2.47.0

@ -0,0 +1,33 @@
From cd28cd0158b3e8f618472b2e2d50d95f6f20a2ba Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Fri, 8 Nov 2024 16:38:29 +0100
Subject: [PATCH 7/7] tests: check vdo minimum_io_size
(cherry picked from commit dcac774f0982470b29bf04f27b6394fe27c4df71)
---
test/shell/lvcreate-vdo.sh | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/test/shell/lvcreate-vdo.sh b/test/shell/lvcreate-vdo.sh
index b24801375..87d6f98a1 100644
--- a/test/shell/lvcreate-vdo.sh
+++ b/test/shell/lvcreate-vdo.sh
@@ -89,4 +89,15 @@ check lv_field $vg/$lv1 vdo_ack_threads "4"
lvs -a $vg
lvremove -ff $vg
+lvcreate --type vdo --vdosettings 'minimum_io_size=512' -L10G -V1T -ky -n $lv1 $vg
+check lv_field $vg/$lv1 vdo_minimum_io_size "512b"
+lvremove -ff $vg
+
+lvcreate --type vdo --vdosettings 'minimum_io_size=4096' -L10G -V1T -ky -n $lv1 $vg
+check lv_field $vg/$lv1 vdo_minimum_io_size "4.00k"
+lvremove -ff $vg
+
+# only 512 or 4096 are valid values (and eventually 1 or 8 sectors)
+not lvcreate --type vdo --vdosettings 'minimum_io_size=8000' -L10G -V1T -ky -n $lv1 $vg
+
vgremove -ff $vg
--
2.47.0

@ -0,0 +1,62 @@
From 6e34a9e3959b659ac633d862af74c4c387a4d5ad Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Wed, 13 Nov 2024 12:52:18 +0100
Subject: [PATCH 1/3] raid: fix name rotation
Since we now keep lv names valid all the time (as they are part
of radix_tree) - there is a problem with this renaming code, that
for a moment used duplicated name in vg struct.
Fix it by interating LVs backwared - which avoids breaking consitency
and also actually makes code more simple.
(cherry picked from commit c2f41c1a59351772b78f2328edd61f996cc37c3b)
---
lib/metadata/raid_manip.c | 23 ++++++++---------------
1 file changed, 8 insertions(+), 15 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 60ae897ef..8abad8be7 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -2637,6 +2637,7 @@ static int _raid_add_images_without_commit(struct logical_volume *lv,
struct lv_list *lvl;
struct lv_segment_area *new_areas;
struct segment_type *segtype;
+ const char *lv_name, *lv_name_tmp;
if (lv_is_not_synced(lv)) {
log_error("Can't add image to out-of-sync RAID LV:"
@@ -2704,22 +2705,14 @@ static int _raid_add_images_without_commit(struct logical_volume *lv,
* commits the LVM metadata before clearing the LVs.
*/
if (seg_is_linear(seg)) {
- struct dm_list *l;
- struct lv_list *lvl_tmp;
- const char *lv_name;
-
- dm_list_iterate(l, &data_lvs) {
- if (l == dm_list_last(&data_lvs)) {
- lvl = dm_list_item(l, struct lv_list);
- if (!(lv_name = _generate_raid_name(lv, "rimage", count)) ||
- !lv_set_name(lvl->lv, lv_name))
- return_0;
- continue;
- }
- lvl = dm_list_item(l, struct lv_list);
- lvl_tmp = dm_list_item(l->n, struct lv_list);
- if (!lv_set_name(lvl->lv, lvl_tmp->lv->name))
+ if (!(lv_name = _generate_raid_name(lv, "rimage", count)))
+ return_0;
+
+ dm_list_iterate_back_items(lvl, &data_lvs) {
+ lv_name_tmp = lvl->lv->name;
+ if (!lv_set_name(lvl->lv, lv_name))
return_0;
+ lv_name = lv_name_tmp; /* rotate name in list */
}
}
--
2.47.0

@ -1,37 +0,0 @@
From 41d16e42f88997fda991f86d598bffc19fcd937f Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 17 May 2023 11:10:45 -0500
Subject: [PATCH 8/8] tests: integrity: snapshots now work on raid+integrity
(cherry picked from commit 3a757047560d75a28d7e4c7d9a5253a72d786544)
---
test/shell/integrity.sh | 8 --------
1 file changed, 8 deletions(-)
diff --git a/test/shell/integrity.sh b/test/shell/integrity.sh
index a7dd5b565..d1683a08e 100644
--- a/test/shell/integrity.sh
+++ b/test/shell/integrity.sh
@@ -626,7 +626,6 @@ not lvconvert --splitmirrors 1 -n tmp -y $vg/$lv1
not lvconvert --splitmirrors 1 --trackchanges -y $vg/$lv1
not lvchange --syncaction repair $vg/$lv1
not lvreduce -L4M $vg/$lv1
-not lvcreate -s -n snap -L4M $vg/$lv1
not pvmove -n $vg/$lv1 "$dev1"
not pvmove "$dev1"
_verify_data_on_mnt
@@ -810,11 +809,4 @@ not lvconvert --raidintegrity y $vg/${lv2}_cpool_cdata
not lvconvert --raidintegrity y $vg/${lv2}_cpool_cmeta
lvremove -y $vg/$lv1
-# cannot add integrity to raid that has a snapshot
-
-lvcreate --type raid1 -m1 -n $lv1 -l 8 $vg
-lvcreate -s -n $lv2 -l 8 $vg/$lv1
-not lvconvert --raidintegrity y $vg/$lv1
-lvremove -y $vg/$lv1
-
vgremove -ff $vg
--
2.40.1

@ -1,102 +0,0 @@
From e96cdaca1d2fec1d225ff09ef81f66edd7df7513 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Fri, 16 Jun 2023 12:06:40 -0500
Subject: [PATCH 09/14] lvresize: fix multiple mounts
which was mistaken as a mounted LV that had been renamed.
(cherry picked from commit 7c3eca833ff7878d6d32198ed76380c91fdc15fc)
---
lib/device/filesystem.c | 47 +++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 23 deletions(-)
diff --git a/lib/device/filesystem.c b/lib/device/filesystem.c
index 2163276ed..bca29747a 100644
--- a/lib/device/filesystem.c
+++ b/lib/device/filesystem.c
@@ -243,8 +243,6 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
FILE *fme = NULL;
struct mntent *me;
int renamed = 0;
- int found_dir = 0;
- int found_dev = 0;
int dev_match, dir_match;
if (stat(lv_path, &st_lv) < 0) {
@@ -281,6 +279,9 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
}
endmntent(fme);
+ if (mtab_mntpath[0])
+ log_debug("%s mtab mntpath %s", display_lvname(lv), mtab_mntpath);
+
/*
* In mtab dir path, replace each ascii space character with the
* four characters \040 which is how /proc/mounts represents spaces.
@@ -319,15 +320,31 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
if (strcmp(fstype, proc_fstype))
continue;
+ /*
+ * When an LV is mounted on two dirs, it appears in /proc/mounts twice as
+ * /dev/mapper/vg-lvol0 on /foo type xfs ...
+ * /dev/mapper/vg-lvol0 on /bar type xfs ...
+ * All entries match dm_devpath, one entry matches mntpath,
+ * and other entries don't match mntpath.
+ *
+ * When an LV is mounted on one dir, and is renamed from lvol0 to lvol1,
+ * it appears in /proc/mounts once as
+ * /dev/mapper/vg-lvol0 on /foo type xfs ...
+ */
+
dir_match = !strcmp(mtab_mntpath, proc_mntpath);
dev_match = !strcmp(dm_devpath, proc_devpath);
- if (dir_match)
- found_dir++;
- if (dev_match)
- found_dev++;
+ if (!dir_match && !dev_match)
+ continue;
+
+ if (dev_match && !dir_match) {
+ log_debug("LV %s mounted at %s also mounted at %s.",
+ dm_devpath, mtab_mntpath, proc_mntpath);
+ continue;
+ }
- if (dir_match != dev_match) {
+ if (!dev_match && dir_match) {
log_error("LV %s mounted at %s may have been renamed (from %s).",
dm_devpath, proc_mntpath, proc_devpath);
renamed = 1;
@@ -337,26 +354,10 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
if (fclose(fp))
stack;
- /*
- * Don't try resizing if:
- * - different device names apppear for the mount point
- * (LVs probably renamed while mounted), or
- * - the mount point for the LV appears multiple times, or
- * - the LV device is listed for multiple mounts.
- */
if (renamed) {
log_error("File system resizing not supported: fs utilities do not support renamed devices.");
return 1;
}
- /* These two are likely detected as renamed, but include checks in case. */
- if (found_dir > 1) {
- log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", mtab_mntpath);
- return 1;
- }
- if (found_dev > 1) {
- log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", dm_devpath);
- return 1;
- }
return 0;
}
--
2.41.0

@ -0,0 +1,28 @@
From d6bdd28fca7fd770e6038a406ebb34b49ec54d5c Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Wed, 13 Nov 2024 12:59:27 +0100
Subject: [PATCH 2/3] tests: check _tdata conversion to raid1
(cherry picked from commit 7b9bdcb4d4aef7f0a079e2278869f19aa7fb7c83)
---
test/shell/lvconvert-thin-raid.sh | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/test/shell/lvconvert-thin-raid.sh b/test/shell/lvconvert-thin-raid.sh
index c021e3b77..7b0e4a5c9 100644
--- a/test/shell/lvconvert-thin-raid.sh
+++ b/test/shell/lvconvert-thin-raid.sh
@@ -58,4 +58,10 @@ lvconvert --merge $vg/${lv1}_tmeta_rimage_1
lvconvert -y -m +1 $vg/${lv1}_tdata "$dev2"
lvconvert -y -m +1 $vg/${lv1}_tmeta "$dev1"
+lvremove -f $vg
+
+lvcreate -L10M -T $vg/pool
+lvconvert -y --type raid1 -m2 $vg/pool_tdata
+lvconvert -y --type raid1 -m2 $vg/pool_tmeta
+
vgremove -ff $vg
--
2.47.0

@ -0,0 +1,24 @@
From babe041d8b75ab4b09714d7eadadc3175a9a4299 Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Wed, 13 Nov 2024 13:06:15 +0100
Subject: [PATCH 3/3] WHATS_NEW: update
(cherry picked from commit 473e93fbfff513f849e76eba919c44aa07608c30)
---
WHATS_NEW | 1 +
1 file changed, 1 insertion(+)
diff --git a/WHATS_NEW b/WHATS_NEW
index d07a1eaeb..bea47f154 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.03.29 -
==================
+ Fix renaming of raid sub LVs when converting a volume to raid (2.03.28).
Fix segfault/VG write error for raid LV lvextend -i|--stripes -I|--stripesize.
Revert ignore -i|--stripes, -I|--stripesize for lvextend on raid0 LV (2.03.27).
--
2.47.0

@ -1,247 +0,0 @@
From 9e35daea0212e12ea556c04830a91db08a7f3505 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Fri, 19 May 2023 12:52:48 -0500
Subject: [PATCH 10/14] device_id: ignore trailing underscores in t10 wwid from
devices file
In previous lvm versions, trailing spaces at the end of a t10 wwid would
be replaced with underscores, so the IDNAME string in system.devices
would look something like "t10.123_". Current versions of lvm ignore
trailing spaces in a t10 wwid, so the IDNAME string used would be
"t10.123". The different values would cause lvm to not recognize a
device in system.devices with the trailing _. Fix this by ignoring
trailing underscores in the IDNAME string from system.devices.
(cherry picked from commit 4cdb178968b44125c41dee6dd28997283c0afefa)
---
lib/device/device_id.c | 46 ++++++++++--
test/shell/devicesfile-vpd-ids.sh | 113 ++++++++++++++++++++++++++++++
2 files changed, 152 insertions(+), 7 deletions(-)
diff --git a/lib/device/device_id.c b/lib/device/device_id.c
index 79da12884..7db6c9b86 100644
--- a/lib/device/device_id.c
+++ b/lib/device/device_id.c
@@ -1728,7 +1728,8 @@ static int _match_dm_devnames(struct cmd_context *cmd, struct device *dev,
return 0;
}
-static void _reduce_underscores(char *in, int in_len, char *out, int out_size)
+/* More than one _ in a row is replaced with one _ */
+static void _reduce_repeating_underscores(char *in, int in_len, char *out, int out_size)
{
int us = 0, i, j = 0;
@@ -1750,6 +1751,17 @@ static void _reduce_underscores(char *in, int in_len, char *out, int out_size)
}
}
+/* Remove any _ at the end of the string. */
+static void _remove_trailing_underscores(char *buf)
+{
+ char *end;
+
+ end = buf + strlen(buf) - 1;
+ while ((end > buf) && (*end == '_'))
+ end--;
+ end[1] = '\0';
+}
+
/*
* du is a devices file entry. dev is any device on the system.
* check if du is for dev by comparing the device's ids to du->idname.
@@ -1764,6 +1776,7 @@ static void _reduce_underscores(char *in, int in_len, char *out, int out_size)
static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct device *dev)
{
char du_t10[DEV_WWID_SIZE] = { 0 };
+ char id_t10[DEV_WWID_SIZE];
struct dev_id *id;
const char *idname;
int part;
@@ -1818,10 +1831,17 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
* for IDNAME were saved in the past with each space replaced
* by one _. Now we convert multiple spaces to a single _.
* So, convert a df entry with the old style to the new shorter
- * style to compare.
+ * style to compare. Also, in past versions, trailing spaces
+ * in the wwid would be replaced by _, but now trailing spaces
+ * are ignored. This means devices file entries created by
+ * past versions may have _ at the end of the IDNAME string.
+ * So, exclude trailing underscores when comparing a t10 wwid
+ * from a device with a t10 wwid in the devices file.
*/
- if (du->idtype == DEV_ID_TYPE_SYS_WWID && !strncmp(du->idname, "t10", 3) && strstr(du->idname, "__"))
- _reduce_underscores(du->idname, strlen(du->idname), du_t10, sizeof(du_t10) - 1);
+ if (du->idtype == DEV_ID_TYPE_SYS_WWID && !strncmp(du->idname, "t10", 3) && strchr(du->idname, '_')) {
+ _reduce_repeating_underscores(du->idname, strlen(du->idname), du_t10, sizeof(du_t10) - 1);
+ _remove_trailing_underscores(du_t10);
+ }
/*
* Try to match du with ids that have already been read for the dev
@@ -1829,6 +1849,20 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
*/
dm_list_iterate_items(id, &dev->ids) {
if (id->idtype == du->idtype) {
+
+ /*
+ * For t10 wwids, remove actual trailing underscores from the dev wwid
+ * (in id->idname), because all trailing underscores were removed from
+ * the du->idname read from the devices file. i.e. no trailing _ are
+ * used in t10 wwid comparisons.
+ */
+ if ((id->idtype == DEV_ID_TYPE_SYS_WWID) &&
+ id->idname && !strncmp(id->idname, "t10", 3) && du_t10[0]) {
+ memset(id_t10, 0, sizeof(id_t10));
+ strncpy(id_t10, id->idname, DEV_WWID_SIZE-1);
+ _remove_trailing_underscores(id_t10);
+ }
+
if ((id->idtype == DEV_ID_TYPE_DEVNAME) && _match_dm_devnames(cmd, dev, id, du)) {
/* dm devs can have differing names that we know still match */
du->dev = dev;
@@ -1846,9 +1880,7 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
idtype_to_str(du->idtype), du->idname, dev_name(dev));
return 1;
- } else if ((id->idtype == DEV_ID_TYPE_SYS_WWID) && id->idname &&
- !strncmp(id->idname, "t10", 3) && du_t10[0] && !strcmp(id->idname, du_t10)) {
- /* Compare the shorter form du t10 wwid to the dev t10 wwid. */
+ } else if ((id->idtype == DEV_ID_TYPE_SYS_WWID) && du_t10[0] && id_t10[0] && !strcmp(id_t10, du_t10)) {
du->dev = dev;
dev->id = id;
dev->flags |= DEV_MATCHED_USE_ID;
diff --git a/test/shell/devicesfile-vpd-ids.sh b/test/shell/devicesfile-vpd-ids.sh
index b2042fb9a..52805737b 100644
--- a/test/shell/devicesfile-vpd-ids.sh
+++ b/test/shell/devicesfile-vpd-ids.sh
@@ -80,6 +80,7 @@ echo $DEV1
DFDIR="$LVM_SYSTEM_DIR/devices"
mkdir -p "$DFDIR" || true
DF="$DFDIR/system.devices"
+DFTMP="$DFDIR/system.devices_tmp"
touch $DF
pvcreate "$DEV1"
@@ -243,6 +244,118 @@ vgremove $vg
rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
cleanup_sysfs
+# Test t10 wwid with trailing space and line feed at the end
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
+2048 4152 4444 4953 4b20 2020 2020 2020 \
+2020 2020 2020 2020 2020 2020 2020 2020 \
+2020 2020 5642 3963 3130 6433 3138 2d31 \
+3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+lvmdevices --adddev "$DEV1"
+cat $DF
+vgcreate $vg "$DEV1"
+lvcreate -l1 -an $vg
+cat $DF
+# check wwid string in metadata output
+pvs -o+deviceidtype,deviceid "$DEV1" |tee out
+grep sys_wwid out
+# check wwid string in system.devices
+grep sys_wwid $DF
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cleanup_sysfs
+
+# Test t10 wwid with trailing space at the end that was created by 9.0/9.1
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
+2048 4152 4444 4953 4b20 2020 2020 2020 \
+2020 2020 2020 2020 2020 2020 2020 2020 \
+2020 2020 5642 3963 3130 6433 3138 2d31 \
+3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+lvmdevices --adddev "$DEV1"
+cat $DF
+vgcreate $vg "$DEV1"
+PVID1=`pvs "$DEV1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+T10_WWID_RHEL91="t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9ebc_"
+lvcreate -l1 -an $vg
+cat $DF
+# check wwid string in metadata output
+pvs -o+deviceidtype,deviceid "$DEV1" |tee out
+grep sys_wwid out
+# check wwid string in system.devices
+grep sys_wwid $DF
+# Replace IDNAME with the IDNAME that 9.0/9.1 created from this wwid
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_wwid IDNAME=t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9ebc_ DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs
+pvs -o+deviceidtype,deviceid "$DEV1"
+# Removing the trailing _ which should then work
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_wwid IDNAME=t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9ebc DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs
+pvs -o+deviceidtype,deviceid "$DEV1"
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cleanup_sysfs
+
+# test a t10 wwid that has actual trailing underscore which
+# is followed by a trailing space.
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
+2048 4152 4444 4953 4b20 2020 2020 2020 \
+2020 2020 2020 2020 2020 2020 2020 2020 \
+2020 2020 5642 3963 3130 6433 3138 2d31 \
+3838 6439 6562 5f20 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+# The wwid has an actual underscore char (5f) followed by a space char (20)
+# 9.1 converts the trailing space to an underscore
+T10_WWID_RHEL91="t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9eb__"
+# 9.2 ignores the trailing space
+T10_WWID_RHEL92="t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9eb_"
+lvmdevices --adddev "$DEV1"
+cat $DF
+vgcreate $vg "$DEV1"
+PVID1=`pvs "$DEV1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+lvcreate -l1 -an $vg
+cat $DF
+# check wwid string in metadata output
+pvs -o+deviceidtype,deviceid "$DEV1" |tee out
+grep sys_wwid out
+# check wwid string in system.devices
+grep sys_wwid $DF
+# Replace IDNAME with the IDNAME that 9.0/9.1 created from this wwid
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_wwid IDNAME=${T10_WWID_RHEL91} DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs
+pvs -o+deviceidtype,deviceid "$DEV1"
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+cleanup_sysfs
+
+
# TODO: lvmdevices --adddev <dev> --deviceidtype <type> --deviceid <val>
# This would let the user specify the second naa wwid.
--
2.41.0

@ -1,82 +0,0 @@
From 499fd37ff0c2bae1c492c3883f063a332e12ac3d Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Thu, 8 Jun 2023 12:24:05 -0500
Subject: [PATCH 11/14] device_id: fix handling of non-PV with duplicate serial
number
Fix in the code that matches devices to system.devices entries when
the devices have the same serial number. A non-PV device in
system.devices has no pvid value, and the code was segfaulting
when checking the null pvid value.
(cherry picked from commit 74feebdab723c1ea46d4316f8a581750c1d8cda3)
---
lib/device/device_id.c | 2 ++
test/shell/devicesfile-serial.sh | 38 ++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/lib/device/device_id.c b/lib/device/device_id.c
index 7db6c9b86..e3d622ecc 100644
--- a/lib/device/device_id.c
+++ b/lib/device/device_id.c
@@ -2625,6 +2625,8 @@ void device_ids_check_serial(struct cmd_context *cmd, struct dm_list *scan_devs,
* Match du to a dev based on PVID.
*/
dm_list_iterate_items(dul, &dus_check) {
+ if (!dul->du->pvid)
+ continue;
log_debug("Matching suspect serial device id %s PVID %s prev %s",
dul->du->idname, dul->du->pvid, dul->du->devname);
found = 0;
diff --git a/test/shell/devicesfile-serial.sh b/test/shell/devicesfile-serial.sh
index a88c1906a..a4cbd5cb2 100644
--- a/test/shell/devicesfile-serial.sh
+++ b/test/shell/devicesfile-serial.sh
@@ -851,6 +851,44 @@ grep $PVID4 out4
vgcreate $vg2 $dev2 $dev3
vgs | grep $vg2
+# 3 devs with duplicate serial, 2 pvs with stale devnames, 1 non-pv device
+
+aux wipefs_a $dev1
+aux wipefs_a $dev2
+aux wipefs_a $dev3
+
+echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
+echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
+echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
+
+rm $DF
+touch $DF
+vgcreate $vg1 $dev1 $dev2
+lvmdevices --adddev $dev3
+cat $DF
+cp $DF $ORIG
+
+PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
+OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
+OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
+
+pvs -o+uuid,deviceid
+
+sed -e "s|DEVNAME=$dev1|DEVNAME=tmp|" $ORIG > tmp1
+sed -e "s|DEVNAME=$dev2|DEVNAME=$dev1|" tmp1 > tmp2
+sed -e "s|DEVNAME=tmp|DEVNAME=$dev2|" tmp2 > $DF
+cat $DF
+
+# pvs should report the correct info and fix the DF
+pvs -o+uuid,deviceid |tee out
+grep $dev1 out |tee out1
+grep $dev2 out |tee out2
+grep $OPVID1 out1
+grep $OPVID2 out2
+grep $SERIAL1 out1
+grep $SERIAL1 out2
+
remove_base
rmmod brd
--
2.41.0

@ -1,693 +0,0 @@
From 894ae888233ff5026c981500623f4f829d358405 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Thu, 15 Jun 2023 13:58:48 -0500
Subject: [PATCH 12/14] device_id: ignore leading and trailing spaces for
sys_wwid and sys_serial
Leading and trailing underscores are also ignored to handle device ids
written by previous versions which replaced all spaces with underscores.
(cherry picked from commit 228a8e8c1fd8e82a2e31a6060614dc3dd2f8bc51)
---
lib/device/device.h | 1 +
lib/device/device_id.c | 278 +++++++++++++++++++-----------
lib/device/parse_vpd.c | 50 ++++++
test/shell/devicesfile-vpd-ids.sh | 101 +++++++++--
4 files changed, 312 insertions(+), 118 deletions(-)
diff --git a/lib/device/device.h b/lib/device/device.h
index 446104218..84d87232b 100644
--- a/lib/device/device.h
+++ b/lib/device/device.h
@@ -239,6 +239,7 @@ int dev_mpath_init(const char *config_wwids_file);
void dev_mpath_exit(void);
int parse_vpd_ids(const unsigned char *vpd_data, int vpd_datalen, struct dm_list *ids);
int format_t10_id(const unsigned char *in, int in_bytes, unsigned char *out, int out_bytes);
+int format_general_id(const char *in, int in_bytes, unsigned char *out, int out_bytes);
int parse_vpd_serial(const unsigned char *in, char *out, int outsize);
/* dev_util */
diff --git a/lib/device/device_id.c b/lib/device/device_id.c
index e3d622ecc..a6fc4a26d 100644
--- a/lib/device/device_id.c
+++ b/lib/device/device_id.c
@@ -185,6 +185,71 @@ void free_dids(struct dm_list *ids)
}
}
+/* More than one _ in a row is replaced with one _ */
+static void _reduce_repeating_underscores(char *buf, int bufsize)
+{
+ char *tmpbuf;
+ int us = 0, i, j = 0;
+
+ if (!(tmpbuf = strndup(buf, bufsize-1)))
+ return;
+
+ memset(buf, 0, bufsize);
+
+ for (i = 0; i < strlen(tmpbuf); i++) {
+ if (tmpbuf[i] == '_')
+ us++;
+ else
+ us = 0;
+
+ if (us == 1)
+ buf[j++] = '_';
+ else if (us > 1)
+ continue;
+ else
+ buf[j++] = tmpbuf[i];
+
+ if (j == bufsize)
+ break;
+ }
+ buf[bufsize-1] = '\0';
+ free(tmpbuf);
+}
+
+static void _remove_leading_underscores(char *buf, int bufsize)
+{
+ char *tmpbuf;
+ int i, j = 0;
+
+ if (buf[0] != '_')
+ return;
+
+ if (!(tmpbuf = strndup(buf, bufsize-1)))
+ return;
+
+ memset(buf, 0, bufsize);
+
+ for (i = 0; i < strlen(tmpbuf); i++) {
+ if (!j && tmpbuf[i] == '_')
+ continue;
+ buf[j++] = tmpbuf[i];
+
+ if (j == bufsize)
+ break;
+ }
+ free(tmpbuf);
+}
+
+static void _remove_trailing_underscores(char *buf, int bufsize)
+{
+ char *end;
+
+ end = buf + strlen(buf) - 1;
+ while ((end > buf) && (*end == '_'))
+ end--;
+ end[1] = '\0';
+}
+
static int _read_sys_block(struct cmd_context *cmd, struct device *dev,
const char *suffix, char *sysbuf, int sysbufsize,
int binary, int *retlen)
@@ -406,7 +471,7 @@ struct dev_wwid *dev_add_wwid(char *id, int id_type, struct dm_list *ids)
int dev_read_vpd_wwids(struct cmd_context *cmd, struct device *dev)
{
- unsigned char vpd_data[VPD_SIZE] = { 0 };
+ char vpd_data[VPD_SIZE] = { 0 };
int vpd_datalen = 0;
dev->flags |= DEV_ADDED_VPD_WWIDS;
@@ -417,36 +482,47 @@ int dev_read_vpd_wwids(struct cmd_context *cmd, struct device *dev)
return 0;
/* adds dev_wwid entry to dev->wwids for each id in vpd data */
- parse_vpd_ids(vpd_data, vpd_datalen, &dev->wwids);
+ parse_vpd_ids((const unsigned char *)vpd_data, vpd_datalen, &dev->wwids);
return 1;
}
int dev_read_sys_wwid(struct cmd_context *cmd, struct device *dev,
- char *buf, int bufsize, struct dev_wwid **dw_out)
+ char *outbuf, int outbufsize, struct dev_wwid **dw_out)
{
- char tmpbuf[DEV_WWID_SIZE];
+ char buf[DEV_WWID_SIZE] = { 0 };
struct dev_wwid *dw;
- int ret;
+ int is_t10 = 0;
+ int i, ret;
dev->flags |= DEV_ADDED_SYS_WWID;
- ret = read_sys_block(cmd, dev, "device/wwid", buf, bufsize);
+ ret = read_sys_block(cmd, dev, "device/wwid", buf, sizeof(buf));
if (!ret || !buf[0]) {
/* the wwid file is not under device for nvme devs */
- ret = read_sys_block(cmd, dev, "wwid", buf, bufsize);
+ ret = read_sys_block(cmd, dev, "wwid", buf, sizeof(buf));
}
if (!ret || !buf[0])
return 0;
- /* in t10 id, replace characters like space and quote */
- if (!strncmp(buf, "t10.", 4)) {
- if (bufsize < DEV_WWID_SIZE)
- return 0;
- memcpy(tmpbuf, buf, DEV_WWID_SIZE);
- memset(buf, 0, bufsize);
- format_t10_id((const unsigned char *)tmpbuf, DEV_WWID_SIZE, (unsigned char *)buf, bufsize);
+ for (i = 0; i < sizeof(buf) - 4; i++) {
+ if (buf[i] == ' ')
+ continue;
+ if (!strncmp(&buf[i], "t10", 3))
+ is_t10 = 1;
+ break;
}
+ /*
+ * Remove leading and trailing spaces.
+ * Replace internal spaces with underscores.
+ * t10 wwids have multiple sequential spaces
+ * replaced by a single underscore.
+ */
+ if (is_t10)
+ format_t10_id((const unsigned char *)buf, sizeof(buf), (unsigned char *)outbuf, outbufsize);
+ else
+ format_general_id((const char *)buf, sizeof(buf), (unsigned char *)outbuf, outbufsize);
+
/* Note, if wwids are also read from vpd, this same wwid will be added again. */
if (!(dw = dev_add_wwid(buf, 0, &dev->wwids)))
@@ -457,9 +533,9 @@ int dev_read_sys_wwid(struct cmd_context *cmd, struct device *dev,
}
static int _dev_read_sys_serial(struct cmd_context *cmd, struct device *dev,
- char *buf, int bufsize)
+ char *outbuf, int outbufsize)
{
- unsigned char vpd_data[VPD_SIZE] = { 0 };
+ char buf[VPD_SIZE] = { 0 };
const char *devname;
int vpd_datalen = 0;
@@ -471,13 +547,16 @@ static int _dev_read_sys_serial(struct cmd_context *cmd, struct device *dev,
* (Only virtio disks /dev/vdx are known to use /sys/class/block/vdx/serial.)
*/
- read_sys_block(cmd, dev, "device/serial", buf, bufsize);
- if (buf[0])
- return 1;
+ read_sys_block(cmd, dev, "device/serial", buf, sizeof(buf));
+ if (buf[0]) {
+ format_general_id((const char *)buf, sizeof(buf), (unsigned char *)outbuf, outbufsize);
+ if (outbuf[0])
+ return 1;
+ }
- if (read_sys_block_binary(cmd, dev, "device/vpd_pg80", (char *)vpd_data, VPD_SIZE, &vpd_datalen) && vpd_datalen) {
- parse_vpd_serial(vpd_data, buf, bufsize);
- if (buf[0])
+ if (read_sys_block_binary(cmd, dev, "device/vpd_pg80", buf, VPD_SIZE, &vpd_datalen) && vpd_datalen) {
+ parse_vpd_serial((const unsigned char *)buf, outbuf, outbufsize);
+ if (outbuf[0])
return 1;
}
@@ -505,12 +584,13 @@ static int _dev_read_sys_serial(struct cmd_context *cmd, struct device *dev,
if (dm_snprintf(path, sizeof(path), "%s/class/block/%s/serial", sysfs_dir, vdx) < 0)
return 0;
- ret = get_sysfs_value(path, buf, bufsize, 0);
+ ret = get_sysfs_value(path, buf, sizeof(buf), 0);
if (ret && !buf[0])
ret = 0;
if (ret) {
- buf[bufsize - 1] = '\0';
- return 1;
+ format_general_id((const char *)buf, sizeof(buf), (unsigned char *)outbuf, outbufsize);
+ if (buf[0])
+ return 1;
}
}
@@ -520,6 +600,7 @@ static int _dev_read_sys_serial(struct cmd_context *cmd, struct device *dev,
const char *device_id_system_read(struct cmd_context *cmd, struct device *dev, uint16_t idtype)
{
char sysbuf[PATH_MAX] = { 0 };
+ char sysbuf2[PATH_MAX] = { 0 };
const char *idname = NULL;
struct dev_wwid *dw;
int i;
@@ -584,16 +665,45 @@ const char *device_id_system_read(struct cmd_context *cmd, struct device *dev, u
return NULL;
}
- /* wwids are already munged if needed */
- if (idtype != DEV_ID_TYPE_SYS_WWID) {
+ /*
+ * Replace all spaces, quotes, control chars with underscores.
+ * sys_wwid, sys_serial, and wwid_* have already been handled,
+ * and with slightly different replacement (see format_t10_id,
+ * format_general_id.)
+ */
+ if ((idtype != DEV_ID_TYPE_SYS_WWID) &&
+ (idtype != DEV_ID_TYPE_SYS_SERIAL) &&
+ (idtype != DEV_ID_TYPE_WWID_NAA) &&
+ (idtype != DEV_ID_TYPE_WWID_EUI) &&
+ (idtype != DEV_ID_TYPE_WWID_T10)) {
for (i = 0; i < strlen(sysbuf); i++) {
- if (sysbuf[i] == '"')
- continue;
- if (isblank(sysbuf[i]) || isspace(sysbuf[i]) || iscntrl(sysbuf[i]))
+ if ((sysbuf[i] == '"') ||
+ isblank(sysbuf[i]) ||
+ isspace(sysbuf[i]) ||
+ iscntrl(sysbuf[i]))
sysbuf[i] = '_';
}
}
+ /*
+ * Reduce actual leading and trailing underscores for sys_wwid
+ * and sys_serial, since underscores were previously used as
+ * replacements for leading/trailing spaces which are now ignored.
+ * Also reduce any actual repeated underscores in t10 wwid since
+ * multiple repeated spaces were also once replaced by underscores.
+ */
+ if ((idtype == DEV_ID_TYPE_SYS_WWID) ||
+ (idtype == DEV_ID_TYPE_SYS_SERIAL)) {
+ memcpy(sysbuf2, sysbuf, sizeof(sysbuf2));
+ _remove_leading_underscores(sysbuf2, sizeof(sysbuf2));
+ _remove_trailing_underscores(sysbuf2, sizeof(sysbuf2));
+ if (idtype == DEV_ID_TYPE_SYS_WWID && !strncmp(sysbuf2, "t10", 3) && strstr(sysbuf2, "__"))
+ _reduce_repeating_underscores(sysbuf2, sizeof(sysbuf2));
+ if (memcmp(sysbuf, sysbuf2, sizeof(sysbuf)))
+ log_debug("device_id_system_read reduced underscores %s to %s", sysbuf, sysbuf2);
+ memcpy(sysbuf, sysbuf2, sizeof(sysbuf));
+ }
+
if (!sysbuf[0])
goto bad;
@@ -1728,40 +1838,6 @@ static int _match_dm_devnames(struct cmd_context *cmd, struct device *dev,
return 0;
}
-/* More than one _ in a row is replaced with one _ */
-static void _reduce_repeating_underscores(char *in, int in_len, char *out, int out_size)
-{
- int us = 0, i, j = 0;
-
- for (i = 0; i < in_len; i++) {
- if (in[i] == '_')
- us++;
- else
- us = 0;
-
- if (us == 1)
- out[j++] = '_';
- else if (us > 1)
- continue;
- else
- out[j++] = in[i];
-
- if (j == out_size)
- break;
- }
-}
-
-/* Remove any _ at the end of the string. */
-static void _remove_trailing_underscores(char *buf)
-{
- char *end;
-
- end = buf + strlen(buf) - 1;
- while ((end > buf) && (*end == '_'))
- end--;
- end[1] = '\0';
-}
-
/*
* du is a devices file entry. dev is any device on the system.
* check if du is for dev by comparing the device's ids to du->idname.
@@ -1775,8 +1851,7 @@ static void _remove_trailing_underscores(char *buf)
static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct device *dev)
{
- char du_t10[DEV_WWID_SIZE] = { 0 };
- char id_t10[DEV_WWID_SIZE];
+ char du_idname[PATH_MAX];
struct dev_id *id;
const char *idname;
int part;
@@ -1827,20 +1902,30 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
}
/*
- * Devices file entries with IDTYPE=sys_wwid and a T10 WWID
- * for IDNAME were saved in the past with each space replaced
- * by one _. Now we convert multiple spaces to a single _.
- * So, convert a df entry with the old style to the new shorter
- * style to compare. Also, in past versions, trailing spaces
- * in the wwid would be replaced by _, but now trailing spaces
- * are ignored. This means devices file entries created by
- * past versions may have _ at the end of the IDNAME string.
- * So, exclude trailing underscores when comparing a t10 wwid
- * from a device with a t10 wwid in the devices file.
+ * sys_wwid and sys_serial were saved in the past with leading and
+ * trailing spaces replaced with underscores, and t10 wwids also had
+ * repeated internal spaces replaced with one underscore each. Now we
+ * ignore leading and trailing spaces and replace multiple repeated
+ * spaces with one underscore in t10 wwids. In order to handle
+ * system.devices entries created by older versions, modify the IDNAME
+ * value that's read (du->idname) to remove leading and trailing
+ * underscores, and reduce repeated underscores to one in t10 wwids.
+ *
+ * Example: wwid is reported as " t10.123 456 " (without quotes)
+ * Previous versions would save this in system.devices as: __t10.123__456__
+ * Current versions will save this in system.devices as: t10.123_456
+ * device_id_system_read() now returns: t10.123_456
+ * When this code reads __t10.123__456__ from system.devices, that
+ * string is modified to t10.123_456 so that it will match the value
+ * returned from device_id_system_read().
*/
- if (du->idtype == DEV_ID_TYPE_SYS_WWID && !strncmp(du->idname, "t10", 3) && strchr(du->idname, '_')) {
- _reduce_repeating_underscores(du->idname, strlen(du->idname), du_t10, sizeof(du_t10) - 1);
- _remove_trailing_underscores(du_t10);
+ strncpy(du_idname, du->idname, PATH_MAX-1);
+ if (((du->idtype == DEV_ID_TYPE_SYS_WWID) || (du->idtype == DEV_ID_TYPE_SYS_SERIAL)) &&
+ strchr(du_idname, '_')) {
+ _remove_leading_underscores(du_idname, sizeof(du_idname));
+ _remove_trailing_underscores(du_idname, sizeof(du_idname));
+ if (du->idtype == DEV_ID_TYPE_SYS_WWID && !strncmp(du_idname, "t10", 3) && strstr(du_idname, "__"))
+ _reduce_repeating_underscores(du_idname, sizeof(du_idname));
}
/*
@@ -1848,21 +1933,14 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
* (and saved on dev->ids to avoid rereading.)
*/
dm_list_iterate_items(id, &dev->ids) {
- if (id->idtype == du->idtype) {
+ if (!id->idname)
+ continue;
+ if (id->idtype == du->idtype) {
/*
- * For t10 wwids, remove actual trailing underscores from the dev wwid
- * (in id->idname), because all trailing underscores were removed from
- * the du->idname read from the devices file. i.e. no trailing _ are
- * used in t10 wwid comparisons.
+ * dm names can have different forms, so matching names
+ * is not always a direct comparison.
*/
- if ((id->idtype == DEV_ID_TYPE_SYS_WWID) &&
- id->idname && !strncmp(id->idname, "t10", 3) && du_t10[0]) {
- memset(id_t10, 0, sizeof(id_t10));
- strncpy(id_t10, id->idname, DEV_WWID_SIZE-1);
- _remove_trailing_underscores(id_t10);
- }
-
if ((id->idtype == DEV_ID_TYPE_DEVNAME) && _match_dm_devnames(cmd, dev, id, du)) {
/* dm devs can have differing names that we know still match */
du->dev = dev;
@@ -1871,22 +1949,16 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
log_debug("Match device_id %s %s to %s: dm names",
idtype_to_str(du->idtype), du->idname, dev_name(dev));
return 1;
+ }
- } else if (id->idname && !strcmp(id->idname, du->idname)) {
+ if (!strcmp(id->idname, du_idname)) {
du->dev = dev;
dev->id = id;
dev->flags |= DEV_MATCHED_USE_ID;
log_debug("Match device_id %s %s to %s",
- idtype_to_str(du->idtype), du->idname, dev_name(dev));
+ idtype_to_str(du->idtype), du_idname, dev_name(dev));
return 1;
- } else if ((id->idtype == DEV_ID_TYPE_SYS_WWID) && du_t10[0] && id_t10[0] && !strcmp(id_t10, du_t10)) {
- du->dev = dev;
- dev->id = id;
- dev->flags |= DEV_MATCHED_USE_ID;
- log_debug("Match device_id %s %s to %s",
- idtype_to_str(du->idtype), du->idname, dev_name(dev));
- return 1;
} else {
/*
log_debug("Mismatch device_id %s %s to %s: idname %s",
@@ -1913,12 +1985,12 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
id->dev = dev;
dm_list_add(&dev->ids, &id->list);
- if (idname && !strcmp(idname, du->idname)) {
+ if (idname && !strcmp(idname, du_idname)) {
du->dev = dev;
dev->id = id;
dev->flags |= DEV_MATCHED_USE_ID;
log_debug("Match device_id %s %s to %s",
- idtype_to_str(du->idtype), du->idname, dev_name(dev));
+ idtype_to_str(du->idtype), idname, dev_name(dev));
return 1;
}
@@ -1944,7 +2016,7 @@ static int _match_du_to_dev(struct cmd_context *cmd, struct dev_use *du, struct
dev_read_vpd_wwids(cmd, dev);
dm_list_iterate_items(dw, &dev->wwids) {
- if (!strcmp(dw->id, du->idname)) {
+ if (!strcmp(dw->id, du_idname)) {
if (!(id = zalloc(sizeof(struct dev_id))))
return_0;
/* wwid types are 1,2,3 and idtypes are DEV_ID_TYPE_ */
diff --git a/lib/device/parse_vpd.c b/lib/device/parse_vpd.c
index c1ac974fd..938277e38 100644
--- a/lib/device/parse_vpd.c
+++ b/lib/device/parse_vpd.c
@@ -36,7 +36,57 @@
#include <assert.h>
/*
+ * Remove leading spaces.
+ * Remove trailing spaces.
+ * Replace each space with underscore.
+ * Skip quotes, non-ascii, non-printable.
+ */
+int format_general_id(const char *in, int in_bytes, unsigned char *out, int out_bytes)
+{
+ const char *end;
+ int end_bytes = strlen(in);
+ int retlen = 0;
+ int j = 0;
+ int i;
+
+ if (!end_bytes)
+ return 0;
+
+ end = in + end_bytes - 1;
+ while ((end > in) && (*end == ' ')) {
+ end--;
+ end_bytes--;
+ }
+
+ for (i = 0; i < end_bytes; i++) {
+ if (!in[i])
+ break;
+ if (j >= (out_bytes - 2))
+ break;
+ /* skip leading spaces */
+ if (!retlen && (in[i] == ' '))
+ continue;
+ /* skip non-ascii non-printable characters */
+ if (!isascii(in[i]) || !isprint(in[i]))
+ continue;
+ /* skip quote */
+ if (in[i] == '"')
+ continue;
+ /* replace each space with _ */
+ if (in[i] == ' ')
+ out[j++] = '_';
+ else
+ out[j++] = in[i];
+ retlen++;
+ }
+ return retlen;
+}
+
+/*
+ * Remove leading spaces.
+ * Remove trailing spaces.
* Replace series of spaces with a single _.
+ * Skip quotes, non-ascii, non-printable.
*/
int format_t10_id(const unsigned char *in, int in_bytes, unsigned char *out, int out_bytes)
{
diff --git a/test/shell/devicesfile-vpd-ids.sh b/test/shell/devicesfile-vpd-ids.sh
index 52805737b..04dbae7d0 100644
--- a/test/shell/devicesfile-vpd-ids.sh
+++ b/test/shell/devicesfile-vpd-ids.sh
@@ -223,8 +223,8 @@ cleanup_sysfs
# Test t10 wwid containing quote
rm $DF
aux wipefs_a "$DEV1"
-mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
-echo "t10.ATA_2.5\"_SATA_SSD_1112-A___111111111111" > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
+echo "t10.ATA_2.5\"_SATA_SSD_1112-A___111111111111" > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
lvmdevices --adddev "$DEV1"
cat $DF
vgcreate $vg "$DEV1"
@@ -241,19 +241,19 @@ grep sys_wwid $DF
grep 2.5_SATA_SSD $DF
lvremove -y $vg
vgremove $vg
-rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
cleanup_sysfs
# Test t10 wwid with trailing space and line feed at the end
rm $DF
aux wipefs_a "$DEV1"
-mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
2048 4152 4444 4953 4b20 2020 2020 2020 \
2020 2020 2020 2020 2020 2020 2020 2020 \
2020 2020 5642 3963 3130 6433 3138 2d31 \
-3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
-cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
lvmdevices --adddev "$DEV1"
cat $DF
vgcreate $vg "$DEV1"
@@ -266,19 +266,19 @@ grep sys_wwid out
grep sys_wwid $DF
lvremove -y $vg
vgremove $vg
-rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
cleanup_sysfs
# Test t10 wwid with trailing space at the end that was created by 9.0/9.1
rm $DF
aux wipefs_a "$DEV1"
-mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
2048 4152 4444 4953 4b20 2020 2020 2020 \
2020 2020 2020 2020 2020 2020 2020 2020 \
2020 2020 5642 3963 3130 6433 3138 2d31 \
-3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
-cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+3838 6439 6562 6320 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
lvmdevices --adddev "$DEV1"
cat $DF
vgcreate $vg "$DEV1"
@@ -311,20 +311,20 @@ pvs
pvs -o+deviceidtype,deviceid "$DEV1"
lvremove -y $vg
vgremove $vg
-rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
cleanup_sysfs
# test a t10 wwid that has actual trailing underscore which
# is followed by a trailing space.
rm $DF
aux wipefs_a "$DEV1"
-mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
echo -n "7431 302e 4154 4120 2020 2020 5642 4f58 \
2048 4152 4444 4953 4b20 2020 2020 2020 \
2020 2020 2020 2020 2020 2020 2020 2020 \
2020 2020 5642 3963 3130 6433 3138 2d31 \
-3838 6439 6562 5f20 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
-cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+3838 6439 6562 5f20 0a" | xxd -r -p > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cat $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
# The wwid has an actual underscore char (5f) followed by a space char (20)
# 9.1 converts the trailing space to an underscore
T10_WWID_RHEL91="t10.ATA_____VBOX_HARDDISK___________________________VB9c10d318-188d9eb__"
@@ -352,9 +352,80 @@ pvs
pvs -o+deviceidtype,deviceid "$DEV1"
lvremove -y $vg
vgremove $vg
-rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/wwid
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cleanup_sysfs
+
+#
+# Test trailing/leading/center spaces in sys_wwid and sys_serial device
+# ids, and that old system.devices files that have trailing/leading
+# underscores are understood.
+#
+
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
+echo -n " s123 456 " > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
+lvmdevices --adddev "$DEV1"
+cat $DF
+grep "IDNAME=s123__456 DEVNAME" $DF
+vgcreate $vg "$DEV1"
+PVID1=`pvs "$DEV1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_serial IDNAME=__s123__456__ DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs -o+deviceidtype,deviceid "$DEV1"
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
cleanup_sysfs
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
+echo -n " t10.123 456 " > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+lvmdevices --adddev "$DEV1"
+cat $DF
+grep "IDNAME=t10.123_456 DEVNAME" $DF
+vgcreate $vg "$DEV1"
+PVID1=`pvs "$DEV1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_wwid IDNAME=__t10.123__456__ DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs -o+deviceidtype,deviceid "$DEV1"
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cleanup_sysfs
+
+rm $DF
+aux wipefs_a "$DEV1"
+mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
+echo -n " naa.123 456 " > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+lvmdevices --adddev "$DEV1"
+cat $DF
+grep "IDNAME=naa.123__456 DEVNAME" $DF
+vgcreate $vg "$DEV1"
+PVID1=`pvs "$DEV1" --noheading -o uuid | tr -d - | awk '{print $1}'`
+cat $DF | grep -v IDNAME > $DFTMP
+cat $DFTMP
+echo "IDTYPE=sys_wwid IDNAME=__naa.123__456__ DEVNAME=${DEV1} PVID=${PVID1}" >> $DFTMP
+cp $DFTMP $DF
+cat $DF
+vgs
+pvs -o+deviceidtype,deviceid "$DEV1"
+lvremove -y $vg
+vgremove $vg
+rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/wwid
+cleanup_sysfs
+
+
+
# TODO: lvmdevices --adddev <dev> --deviceidtype <type> --deviceid <val>
# This would let the user specify the second naa wwid.
--
2.41.0

@ -1,79 +0,0 @@
From 14cb9d915270634c364d89918f824c538b28dc80 Mon Sep 17 00:00:00 2001
From: heinzm <heinzm@redhat.com>
Date: Wed, 10 May 2023 18:22:11 +0200
Subject: [PATCH 13/14] Fix "multisegment RAID1, allocator uses one disk for
both legs"
In case of e.g. 3 PVs, creating or extending a RaidLV causes SubLV
collocation thus putting segments of diffent rimage (and potentially
larger rmeta) SubLVs onto the same PV. For redundant RaidLVs this'll
compromise redundancy. Fix by detecting such bogus allocation on
lvcreate/lvextend and reject the request.
(cherry picked from commit 05c2b10c5d0a99993430ffbcef684a099ba810ad)
---
lib/metadata/lv_manip.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index add9512ff..e4799e082 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4455,6 +4455,38 @@ static int _lv_extend_layered_lv(struct alloc_handle *ah,
return 1;
}
+/* Check either RAID images and metas are being allocated redundantly. */
+static int _lv_raid_redundant(struct logical_volume *lv,
+ struct dm_list *allocatable_pvs, int meta)
+{
+ uint32_t nlvs, s;
+ struct lv_segment *seg = first_seg(lv);
+ struct pv_list *pvl;
+
+ if (meta && !seg->meta_areas)
+ return 1;
+
+ dm_list_iterate_items(pvl, allocatable_pvs) {
+ nlvs = 0;
+
+ for (s = 0; s < seg->area_count; s++) {
+ struct logical_volume *slv = meta ? seg_metalv(seg, s) : seg_lv(seg, s);
+
+ if (slv && lv_is_on_pv(slv, pvl->pv) && nlvs++)
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/* Check both RAID images and metas are being allocated redundantly. */
+static int _lv_raid_redundant_allocation(struct logical_volume *lv, struct dm_list *allocatable_pvs)
+{
+ return _lv_raid_redundant(lv, allocatable_pvs, 0) &&
+ _lv_raid_redundant(lv, allocatable_pvs, 1);
+}
+
/*
* Entry point for single-step LV allocation + extension.
* Extents is the number of logical extents to append to the LV unless
@@ -4557,6 +4589,15 @@ int lv_extend(struct logical_volume *lv,
mirrors, stripes, stripe_size)))
goto_out;
+ if (segtype_is_raid(segtype) &&
+ alloc != ALLOC_ANYWHERE &&
+ !(r = _lv_raid_redundant_allocation(lv, allocatable_pvs))) {
+ log_error("Insufficient suitable allocatable extents for logical volume %s", display_lvname(lv));
+ if (!lv_remove(lv) || !vg_write(lv->vg) || !vg_commit(lv->vg))
+ return_0;
+ goto out;
+ }
+
if (lv_raid_has_integrity(lv)) {
if (!lv_extend_integrity_in_raid(lv, allocatable_pvs)) {
r = 0;
--
2.41.0

@ -1,117 +0,0 @@
From 4e28d22cc152fd9c753e5584a5ae99e7a5d1ac96 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 17 May 2023 14:15:25 -0500
Subject: [PATCH 14/14] tests: integrity-caching: ensure raid redundancy
The recent fix 05c2b10c5d0a9 ensures that raid LV images are not
using the same devices. This was happening in the lvextend commands
used by this test, so fix the test to use more devices to ensue
redundancy.
(cherry picked from commit 24e4b6df1182d0d41763176c175e98e5fa6153ab)
---
lib/metadata/lv_manip.c | 5 ++++-
test/shell/integrity-caching.sh | 27 ++++++++++++++++++---------
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index e4799e082..70c969de5 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4472,8 +4472,11 @@ static int _lv_raid_redundant(struct logical_volume *lv,
for (s = 0; s < seg->area_count; s++) {
struct logical_volume *slv = meta ? seg_metalv(seg, s) : seg_lv(seg, s);
- if (slv && lv_is_on_pv(slv, pvl->pv) && nlvs++)
+ if (slv && lv_is_on_pv(slv, pvl->pv) && nlvs++) {
+ log_error("LV %s using PV %s is not redundant.",
+ display_lvname(slv), dev_name(pvl->pv->dev));
return 0;
+ }
}
}
diff --git a/test/shell/integrity-caching.sh b/test/shell/integrity-caching.sh
index 5539ac575..06fc04928 100644
--- a/test/shell/integrity-caching.sh
+++ b/test/shell/integrity-caching.sh
@@ -23,7 +23,7 @@ aux kernel_at_least 5 10 || export LVM_TEST_PREFER_BRD=0
mnt="mnt"
mkdir -p $mnt
-aux prepare_devs 6 80
+aux prepare_devs 9 80
# Use awk instead of anoyingly long log out from printf
#printf "%0.sA" {1..16384} >> fileA
@@ -319,7 +319,7 @@ vgremove -ff $vg
# Test lvextend while inactive
_prepare_vg
-lvcreate --type raid1 -m1 --raidintegrity y -n $lv1 -l 8 $vg
+lvcreate --type raid1 -m1 --raidintegrity y -n $lv1 -l 8 $vg "$dev1" "$dev2"
_wait_recalc $vg/${lv1}_rimage_0
_wait_recalc $vg/${lv1}_rimage_1
_wait_recalc $vg/$lv1
@@ -329,7 +329,11 @@ lvs -a -o name,size,segtype,devices,sync_percent $vg
_add_new_data_to_mnt
umount $mnt
lvchange -an $vg/$lv1
-lvextend -l 16 $vg/$lv1
+# use two new devs for raid extend to ensure redundancy
+vgextend $vg "$dev7" "$dev8"
+lvs -a -o name,segtype,devices $vg
+lvextend -l 16 $vg/$lv1 "$dev7" "$dev8"
+lvs -a -o name,segtype,devices $vg
lvchange -ay $vg/$lv1
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
xfs_growfs $mnt
@@ -346,16 +350,19 @@ vgremove -ff $vg
# Test lvextend while active
_prepare_vg
-lvcreate --type raid1 -m1 --raidintegrity y -n $lv1 -l 8 $vg
+lvcreate --type raid1 -m1 --raidintegrity y -n $lv1 -l 8 $vg "$dev1" "$dev2"
_wait_recalc $vg/${lv1}_rimage_0
_wait_recalc $vg/${lv1}_rimage_1
_wait_recalc $vg/$lv1
lvcreate --type $create_type -n fast -l 4 -an $vg "$dev6"
lvconvert -y --type $convert_type $convert_option fast $vg/$lv1
+# use two new devs for raid extend to ensure redundancy
+vgextend $vg "$dev7" "$dev8"
lvs -a -o name,size,segtype,devices,sync_percent $vg
_add_new_data_to_mnt
-lvextend -l 16 $vg/$lv1
-xfs_growfs $mnt
+lvextend -l 16 $vg/$lv1 "$dev7" "$dev8"
+lvs -a -o name,size,segtype,devices,sync_percent $vg
+resize2fs "$DM_DEV_DIR/$vg/$lv1"
_wait_recalc $vg/${lv1}_${suffix}_rimage_0
_wait_recalc $vg/${lv1}_${suffix}_rimage_1
_add_more_data_to_mnt
@@ -367,17 +374,19 @@ lvremove $vg/$lv1
vgremove -ff $vg
_prepare_vg
-lvcreate --type raid5 --raidintegrity y -n $lv1 -l 8 $vg
+lvcreate --type raid5 --raidintegrity y -n $lv1 -I4 -l 8 $vg "$dev1" "$dev2" "$dev3"
_wait_recalc $vg/${lv1}_rimage_0
_wait_recalc $vg/${lv1}_rimage_1
_wait_recalc $vg/${lv1}_rimage_2
_wait_recalc $vg/$lv1
lvcreate --type $create_type -n fast -l 4 -an $vg "$dev6"
lvconvert -y --type $convert_type $convert_option fast $vg/$lv1
+vgextend $vg "$dev7" "$dev8" "$dev9"
lvs -a -o name,size,segtype,devices,sync_percent $vg
_add_new_data_to_mnt
-lvextend -l 16 $vg/$lv1
-xfs_growfs $mnt
+lvextend -l 16 $vg/$lv1 "$dev7" "$dev8" "$dev9"
+lvs -a -o name,size,segtype,devices,sync_percent $vg
+resize2fs "$DM_DEV_DIR/$vg/$lv1"
_wait_recalc $vg/${lv1}_${suffix}_rimage_0
_wait_recalc $vg/${lv1}_${suffix}_rimage_1
_add_more_data_to_mnt
--
2.41.0

@ -1,4 +1,14 @@
%global device_mapper_version 1.02.195 ## START: Set by rpmautospec
## (rpmautospec version 0.6.5)
## RPMAUTOSPEC: autorelease
%define autorelease(e:s:pb:n) %{?-p:0.}%{lua:
release_number = 3;
base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
print(release_number + base_release_number - 1);
}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
## END: Set by rpmautospec
%global device_mapper_version 1.02.202
%global enable_cache 1 %global enable_cache 1
%global enable_lvmdbusd 1 %global enable_lvmdbusd 1
@ -12,81 +22,50 @@
%global enable_integrity 1 %global enable_integrity 1
%global system_release_version 23 %global system_release_version 23
%global systemd_version 247-1 %global systemd_version 256
%global dracut_version 002-18 %global dracut_version 002-18
%global util_linux_version 2.24 %global util_linux_version 2.24
%global bash_version 4.0 %global bash_version 4.0
%global corosync_version 1.99.9-1 %global corosync_version 1.99.9-1
%global resource_agents_version 3.9.5-12 %global resource_agents_version 3.9.5-12
%global dlm_version 4.0.6-1
%global libselinux_version 1.30.19-4 %global libselinux_version 1.30.19-4
%global persistent_data_version 0.7.0-0.1.rc6 %global persistent_data_version 0.7.0-0.1.rc6
%global sanlock_version 3.3.0-2 %global sanlock_version 3.3.0-2
%global enable_lockd_sanlock %{enable_lvmlockd} %global enable_lockd_sanlock %{enable_lvmlockd}
%global enable_lockd_dlm %{enable_lvmlockd}
%if 0%{?rhel} && 0%{?rhel} <= 8 %if 0%{?rhel} && 0%{?rhel} <= 8
%ifnarch i686 x86_64 ppc64le s390x
%global enable_lockd_dlm 0
%endif
%ifnarch x86_64 ppc64 aarch64 %ifnarch x86_64 ppc64 aarch64
%global enable_lockd_sanlock 0 %global enable_lockd_sanlock 0
%endif %endif
%endif %endif
%global from_snapshot 0
%if 0%{?from_snapshot}
%global commit 4a1f6173d29a7d7ecab14a9313000aa5f81170d0
%global shortcommit %(c=%{commit}; echo ${c:0:7})
%endif
#%%global rel_suffix .bz2141837
# Do not reset Release to 1 unless both lvm2 and device-mapper # Do not reset Release to 1 unless both lvm2 and device-mapper
# versions are increased together. # versions are increased together.
#
# NOTE: At the moment it is better to increase DM version together with lvm.
# This siplifies life for other packagers as well.
Summary: Userland logical volume management tools Summary: Userland logical volume management tools
Name: lvm2 Name: lvm2
%if 0%{?rhel} %if 0%{?rhel}
Epoch: %{rhel} Epoch: %{rhel}
%endif %endif
Version: 2.03.21 Version: 2.03.28
%if 0%{?from_snapshot} Release: %autorelease
Release: 0.1.20211115git%{shortcommit}%{?dist}%{?rel_suffix} License: GPL-2.0-only
%else URL: https://sourceware.org/lvm2
Release: 3%{?dist}%{?rel_suffix} Source0: https://sourceware.org/pub/lvm2/releases/LVM2.%{version}.tgz
%endif Patch1: 0001-RHEL10.patch
License: GPLv2 Patch2: 0002-lv_manip-fix-stripe-count-and-size-validation-for-RA.patch
URL: http://sourceware.org/lvm2 Patch3: 0003-lv_manip-use-the-same-param-validation-for-RAID-0-as.patch
%if 0%{?from_snapshot} Patch4: 0004-tests-remove-superfluous-a-option-for-df-used-in-lvr.patch
Source0: lvm2-%{shortcommit}.tgz Patch5: 0005-WHATS_NEW-update.patch
%else Patch6: 0006-vdo-fix-input-units-for-minimim_io_size.patch
Source0: ftp://sourceware.org/pub/lvm2/releases/LVM2.%{version}.tgz Patch7: 0007-tests-check-vdo-minimum_io_size.patch
%endif Patch8: 0008-raid-fix-name-rotation.patch
# BZ 2179430: Patch9: 0009-tests-check-_tdata-conversion-to-raid1.patch
Patch1: 0001-fix-dev_name-use-in-add_areas_line.patch Patch10: 0010-WHATS_NEW-update.patch
Patch2: 0002-raidintegrity-allow-snapshots.patch
Patch3: 0003-lvmdbus-preserve-PATH-envvar.patch
Patch4: 0004-lvmcache-fix-valgrind-error-when-dropping-md-duplica.patch
# BZ 2188718
Patch5: 0005-pvck-improve-error-for-write-to-existing-file.patch
# BZ 2191683:
Patch6: 0006-lvreduce-make-_lvseg_get_stripes-handle-integrity-la.patch
# BZ 2188480:
#Patch7: 0007-toollib-provide-proper-hint-for-referencing-VG-uuid-.patch
# BZ 2179430:
Patch8: 0008-tests-integrity-snapshots-now-work-on-raid-integrity.patch
# BZ 2212295:
Patch9: 0009-lvresize-fix-multiple-mounts.patch
# BZ 2208039:
Patch10: 0010-device_id-ignore-trailing-underscores-in-t10-wwid-fr.patch
# - 2212968:
Patch11: 0011-device_id-fix-handling-of-non-PV-with-duplicate-seri.patch
# - 2213653:
Patch12: 0012-device_id-ignore-leading-and-trailing-spaces-for-sys.patch
# BZ 2204467:
Patch13: 0013-Fix-multisegment-RAID1-allocator-uses-one-disk-for-b.patch
Patch14: 0014-tests-integrity-caching-ensure-raid-redundancy.patch
BuildRequires: make BuildRequires: make
BuildRequires: gcc BuildRequires: gcc
@ -98,9 +77,6 @@ BuildRequires: libblkid-devel >= %{util_linux_version}
BuildRequires: ncurses-devel BuildRequires: ncurses-devel
BuildRequires: libedit-devel BuildRequires: libedit-devel
BuildRequires: libaio-devel BuildRequires: libaio-devel
%if %{enable_lockd_dlm}
BuildRequires: dlm-devel >= %{dlm_version}
%endif
BuildRequires: module-init-tools BuildRequires: module-init-tools
BuildRequires: pkgconfig BuildRequires: pkgconfig
BuildRequires: systemd-devel BuildRequires: systemd-devel
@ -139,11 +115,7 @@ or more physical volumes and creating one or more logical volumes
(kind of logical partitions) in volume groups. (kind of logical partitions) in volume groups.
%prep %prep
%if 0%{?from_snapshot}
%setup -q -n lvm2-%{commit}
%else
%autosetup -p1 -n LVM2.%{version} %autosetup -p1 -n LVM2.%{version}
%endif
%build %build
%global _default_pid_dir /run %global _default_pid_dir /run
@ -180,9 +152,6 @@ or more physical volumes and creating one or more logical volumes
%if %{enable_lvmpolld} %if %{enable_lvmpolld}
--enable-lvmpolld \ --enable-lvmpolld \
%endif %endif
%if %{enable_lockd_dlm}
--enable-lvmlockd-dlm --enable-lvmlockd-dlmcontrol \
%endif
%if %{enable_lockd_sanlock} %if %{enable_lockd_sanlock}
--enable-lvmlockd-sanlock \ --enable-lvmlockd-sanlock \
%endif %endif
@ -215,6 +184,7 @@ V=1 make install_system_dirs DESTDIR=$RPM_BUILD_ROOT
V=1 make install_systemd_units DESTDIR=$RPM_BUILD_ROOT V=1 make install_systemd_units DESTDIR=$RPM_BUILD_ROOT
V=1 make install_systemd_generators DESTDIR=$RPM_BUILD_ROOT V=1 make install_systemd_generators DESTDIR=$RPM_BUILD_ROOT
V=1 make install_tmpfiles_configuration DESTDIR=$RPM_BUILD_ROOT V=1 make install_tmpfiles_configuration DESTDIR=$RPM_BUILD_ROOT
#install -d ${RPM_BUILD_ROOT}%{_sysconfdir}/lvm/devices
%if %{enable_testsuite} %if %{enable_testsuite}
%make_install -C test %make_install -C test
%endif %endif
@ -258,13 +228,11 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
/bin/systemctl try-restart lvm2-monitor.service > /dev/null 2>&1 || : /bin/systemctl try-restart lvm2-monitor.service > /dev/null 2>&1 || :
%files %files
%{!?_licensedir:%global license %%doc}
%license COPYING COPYING.LIB %license COPYING COPYING.LIB
%doc README VERSION WHATS_NEW %doc README VERSION WHATS_NEW
%doc doc/lvm_fault_handling.txt %doc doc/lvm_fault_handling.txt
# Main binaries # Main binaries
%defattr(555,root,root,-)
%{_sbindir}/fsadm %{_sbindir}/fsadm
%{_sbindir}/lvm %{_sbindir}/lvm
%{_sbindir}/lvmconfig %{_sbindir}/lvmconfig
@ -276,7 +244,6 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
%{_sbindir}/lvm_import_vdo %{_sbindir}/lvm_import_vdo
# Other files # Other files
%defattr(444,root,root,-)
%{_sbindir}/lvchange %{_sbindir}/lvchange
%{_sbindir}/lvconvert %{_sbindir}/lvconvert
%{_sbindir}/lvcreate %{_sbindir}/lvcreate
@ -389,8 +356,8 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
%endif %endif
%dir %{_sysconfdir}/lvm %dir %{_sysconfdir}/lvm
%ghost %{_sysconfdir}/lvm/cache/.cache %ghost %{_sysconfdir}/lvm/cache/.cache
%attr(644, -, -) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lvm/lvm.conf %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lvm/lvm.conf
%attr(644, -, -) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lvm/lvmlocal.conf %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lvm/lvmlocal.conf
%dir %{_sysconfdir}/lvm/profile %dir %{_sysconfdir}/lvm/profile
%{_sysconfdir}/lvm/profile/command_profile_template.profile %{_sysconfdir}/lvm/profile/command_profile_template.profile
%{_sysconfdir}/lvm/profile/metadata_profile_template.profile %{_sysconfdir}/lvm/profile/metadata_profile_template.profile
@ -405,6 +372,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
%dir %{_sysconfdir}/lvm/backup %dir %{_sysconfdir}/lvm/backup
%dir %{_sysconfdir}/lvm/cache %dir %{_sysconfdir}/lvm/cache
%dir %{_sysconfdir}/lvm/archive %dir %{_sysconfdir}/lvm/archive
%dir %{_sysconfdir}/lvm/devices
%dir %{_default_locking_dir} %dir %{_default_locking_dir}
%dir %{_default_run_dir} %dir %{_default_run_dir}
%{_tmpfilesdir}/%{name}.conf %{_tmpfilesdir}/%{name}.conf
@ -415,13 +383,15 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
%{_unitdir}/lvm2-lvmpolld.socket %{_unitdir}/lvm2-lvmpolld.socket
%{_unitdir}/lvm2-lvmpolld.service %{_unitdir}/lvm2-lvmpolld.service
%endif %endif
%{_unitdir}/lvm-devices-import.service
%{_unitdir}/lvm-devices-import.path
############################################################################## ##############################################################################
# Library and Development subpackages # Library and Development subpackages
############################################################################## ##############################################################################
%package devel %package devel
Summary: Development libraries and headers Summary: Development libraries and headers
License: LGPLv2 License: LGPL-2.1-only
Requires: %{name} = %{?epoch}:%{version}-%{release} Requires: %{name} = %{?epoch}:%{version}-%{release}
Requires: device-mapper-devel = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-devel = %{?epoch}:%{device_mapper_version}-%{release}
Requires: device-mapper-event-devel = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-event-devel = %{?epoch}:%{device_mapper_version}-%{release}
@ -432,14 +402,13 @@ This package contains files needed to develop applications that use
the lvm2 libraries. the lvm2 libraries.
%files devel %files devel
%defattr(444,root,root,-)
%{_libdir}/liblvm2cmd.so %{_libdir}/liblvm2cmd.so
%{_libdir}/libdevmapper-event-lvm2.so %{_libdir}/libdevmapper-event-lvm2.so
%{_includedir}/lvm2cmd.h %{_includedir}/lvm2cmd.h
%package libs %package libs
Summary: Shared libraries for lvm2 Summary: Shared libraries for lvm2
License: LGPLv2 License: LGPL-2.1-only
Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release}
%description libs %description libs
@ -448,9 +417,7 @@ This package contains shared lvm2 libraries for applications.
%ldconfig_scriptlets libs %ldconfig_scriptlets libs
%files libs %files libs
%{!?_licensedir:%global license %%doc}
%license COPYING.LIB %license COPYING.LIB
%defattr(555,root,root,-)
%{_libdir}/liblvm2cmd.so.* %{_libdir}/liblvm2cmd.so.*
%{_libdir}/libdevmapper-event-lvm2.so.* %{_libdir}/libdevmapper-event-lvm2.so.*
%dir %{_libdir}/device-mapper %dir %{_libdir}/device-mapper
@ -472,16 +439,13 @@ This package contains shared lvm2 libraries for applications.
############################################################################## ##############################################################################
# LVM locking daemon # LVM locking daemon
############################################################################## ##############################################################################
%if %{enable_lockd_dlm} || %{enable_lockd_sanlock} %if %{enable_lockd_sanlock}
%package lockd %package lockd
Summary: LVM locking daemon Summary: LVM locking daemon
Requires: lvm2 = %{?epoch}:%{version}-%{release} Requires: lvm2 = %{?epoch}:%{version}-%{release}
%if %{enable_lockd_sanlock} %if %{enable_lockd_sanlock}
Requires: sanlock-lib >= %{sanlock_version} Requires: sanlock-lib >= %{sanlock_version}
%endif %endif
%if %{enable_lockd_dlm}
Requires: dlm-lib >= %{dlm_version}
%endif
Requires(post): systemd-units >= %{systemd_version} Requires(post): systemd-units >= %{systemd_version}
Requires(preun): systemd-units >= %{systemd_version} Requires(preun): systemd-units >= %{systemd_version}
Requires(postun): systemd-units >= %{systemd_version} Requires(postun): systemd-units >= %{systemd_version}
@ -500,9 +464,8 @@ LVM commands use lvmlockd to coordinate access to shared storage.
%systemd_postun lvmlockd.service lvmlocks.service %systemd_postun lvmlockd.service lvmlocks.service
%files lockd %files lockd
%defattr(444,root,root,-) %{_sbindir}/lvmlockd
%%attr(555, -, -) %{_sbindir}/lvmlockd %{_sbindir}/lvmlockctl
%%attr(555, -, -) %{_sbindir}/lvmlockctl
%{_mandir}/man8/lvmlockd.8.gz %{_mandir}/man8/lvmlockd.8.gz
%{_mandir}/man8/lvmlockctl.8.gz %{_mandir}/man8/lvmlockctl.8.gz
%{_unitdir}/lvmlockd.service %{_unitdir}/lvmlockd.service
@ -517,7 +480,7 @@ LVM commands use lvmlockd to coordinate access to shared storage.
%package dbusd %package dbusd
Summary: LVM2 D-Bus daemon Summary: LVM2 D-Bus daemon
License: GPLv2 License: GPL-2.0-only
BuildArch: noarch BuildArch: noarch
Requires: lvm2 >= %{?epoch}:%{version}-%{release} Requires: lvm2 >= %{?epoch}:%{version}-%{release}
Requires: dbus Requires: dbus
@ -542,9 +505,7 @@ Daemon for access to LVM2 functionality through a D-Bus interface.
%systemd_postun lvm2-lvmdbusd.service %systemd_postun lvm2-lvmdbusd.service
%files dbusd %files dbusd
%defattr(555,root,root,-)
%{_sbindir}/lvmdbusd %{_sbindir}/lvmdbusd
%defattr(444,root,root,-)
%{_sysconfdir}/dbus-1/system.d/com.redhat.lvmdbus1.conf %{_sysconfdir}/dbus-1/system.d/com.redhat.lvmdbus1.conf
%{_datadir}/dbus-1/system-services/com.redhat.lvmdbus1.service %{_datadir}/dbus-1/system-services/com.redhat.lvmdbus1.service
%{_mandir}/man8/lvmdbusd.8.gz %{_mandir}/man8/lvmdbusd.8.gz
@ -559,8 +520,8 @@ Daemon for access to LVM2 functionality through a D-Bus interface.
%package -n device-mapper %package -n device-mapper
Summary: Device mapper utility Summary: Device mapper utility
Version: %{device_mapper_version} Version: %{device_mapper_version}
License: GPLv2 License: GPL-2.0-only
URL: http://sources.redhat.com/dm URL: https://www.sourceware.org/dm/
Requires: device-mapper-libs = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-libs = %{?epoch}:%{device_mapper_version}-%{release}
Requires: util-linux-core >= %{util_linux_version} Requires: util-linux-core >= %{util_linux_version}
Requires: systemd >= %{systemd_version} Requires: systemd >= %{systemd_version}
@ -573,19 +534,17 @@ This package contains the supporting userspace utility, dmsetup,
for the kernel device-mapper. for the kernel device-mapper.
%files -n device-mapper %files -n device-mapper
%{!?_licensedir:%global license %%doc}
%license COPYING COPYING.LIB %license COPYING COPYING.LIB
%doc WHATS_NEW_DM VERSION_DM README %doc WHATS_NEW_DM VERSION_DM README
%doc udev/12-dm-permissions.rules %doc udev/12-dm-permissions.rules
%defattr(444,root,root,-) %{_sbindir}/dmsetup
%attr(555, -, -) %{_sbindir}/dmsetup %{_sbindir}/blkdeactivate
%attr(555, -, -) %{_sbindir}/blkdeactivate %{_sbindir}/dmstats
%attr(555, -, -) %{_sbindir}/dmstats
%{_mandir}/man8/dmsetup.8.gz %{_mandir}/man8/dmsetup.8.gz
%{_mandir}/man8/dmstats.8.gz %{_mandir}/man8/dmstats.8.gz
%{_mandir}/man8/blkdeactivate.8.gz %{_mandir}/man8/blkdeactivate.8.gz
%if %{enable_dmfilemapd} %if %{enable_dmfilemapd}
%attr(555, -, -) %{_sbindir}/dmfilemapd %{_sbindir}/dmfilemapd
%{_mandir}/man8/dmfilemapd.8.gz %{_mandir}/man8/dmfilemapd.8.gz
%endif %endif
%{_udevdir}/10-dm.rules %{_udevdir}/10-dm.rules
@ -595,7 +554,7 @@ for the kernel device-mapper.
%package -n device-mapper-devel %package -n device-mapper-devel
Summary: Development libraries and headers for device-mapper Summary: Development libraries and headers for device-mapper
Version: %{device_mapper_version} Version: %{device_mapper_version}
License: LGPLv2 License: LGPL-2.1-only
Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release}
Requires: pkgconfig Requires: pkgconfig
@ -604,7 +563,6 @@ This package contains files needed to develop applications that use
the device-mapper libraries. the device-mapper libraries.
%files -n device-mapper-devel %files -n device-mapper-devel
%defattr(444,root,root,-)
%{_libdir}/libdevmapper.so %{_libdir}/libdevmapper.so
%{_includedir}/libdevmapper.h %{_includedir}/libdevmapper.h
%{_libdir}/pkgconfig/devmapper.pc %{_libdir}/pkgconfig/devmapper.pc
@ -612,7 +570,7 @@ the device-mapper libraries.
%package -n device-mapper-libs %package -n device-mapper-libs
Summary: Device-mapper shared library Summary: Device-mapper shared library
Version: %{device_mapper_version} Version: %{device_mapper_version}
License: LGPLv2 License: LGPL-2.1-only
Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release}
%description -n device-mapper-libs %description -n device-mapper-libs
@ -621,9 +579,7 @@ This package contains the device-mapper shared library, libdevmapper.
%ldconfig_scriptlets -n device-mapper-libs %ldconfig_scriptlets -n device-mapper-libs
%files -n device-mapper-libs %files -n device-mapper-libs
%{!?_licensedir:%global license %%doc}
%license COPYING COPYING.LIB %license COPYING COPYING.LIB
%defattr(555,root,root,-)
%{_libdir}/libdevmapper.so.* %{_libdir}/libdevmapper.so.*
%package -n device-mapper-event %package -n device-mapper-event
@ -654,8 +610,7 @@ fi
%systemd_preun dm-event.service dm-event.socket %systemd_preun dm-event.service dm-event.socket
%files -n device-mapper-event %files -n device-mapper-event
%defattr(444,root,root,-) %{_sbindir}/dmeventd
%attr(555, -, -) %{_sbindir}/dmeventd
%{_mandir}/man8/dmeventd.8.gz %{_mandir}/man8/dmeventd.8.gz
%{_unitdir}/dm-event.socket %{_unitdir}/dm-event.socket
%{_unitdir}/dm-event.service %{_unitdir}/dm-event.service
@ -663,7 +618,7 @@ fi
%package -n device-mapper-event-libs %package -n device-mapper-event-libs
Summary: Device-mapper event daemon shared library Summary: Device-mapper event daemon shared library
Version: %{device_mapper_version} Version: %{device_mapper_version}
License: LGPLv2 License: LGPL-2.1-only
%description -n device-mapper-event-libs %description -n device-mapper-event-libs
This package contains the device-mapper event daemon shared library, This package contains the device-mapper event daemon shared library,
@ -672,15 +627,13 @@ libdevmapper-event.
%ldconfig_scriptlets -n device-mapper-event-libs %ldconfig_scriptlets -n device-mapper-event-libs
%files -n device-mapper-event-libs %files -n device-mapper-event-libs
%{!?_licensedir:%global license %%doc}
%license COPYING.LIB %license COPYING.LIB
%defattr(555,root,root,-)
%{_libdir}/libdevmapper-event.so.* %{_libdir}/libdevmapper-event.so.*
%package -n device-mapper-event-devel %package -n device-mapper-event-devel
Summary: Development libraries and headers for the device-mapper event daemon Summary: Development libraries and headers for the device-mapper event daemon
Version: %{device_mapper_version} Version: %{device_mapper_version}
License: LGPLv2 License: LGPL-2.1-only
Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release}
Requires: pkgconfig Requires: pkgconfig
@ -689,7 +642,6 @@ This package contains files needed to develop applications that use
the device-mapper event library. the device-mapper event library.
%files -n device-mapper-event-devel %files -n device-mapper-event-devel
%defattr(444,root,root,-)
%{_libdir}/libdevmapper-event.so %{_libdir}/libdevmapper-event.so
%{_includedir}/libdevmapper-event.h %{_includedir}/libdevmapper-event.h
%{_libdir}/pkgconfig/devmapper-event.pc %{_libdir}/pkgconfig/devmapper-event.pc
@ -701,7 +653,7 @@ the device-mapper event library.
%package testsuite %package testsuite
Summary: LVM2 Testsuite Summary: LVM2 Testsuite
# Most of the code is GPLv2, the harness in test/lib/{brick-shelltest.h,runner.cpp} is BSD, and C files in test/api are LGPLv2... # Most of the code is GPLv2, the harness in test/lib/{brick-shelltest.h,runner.cpp} is BSD, and C files in test/api are LGPLv2...
License: LGPLv2 and GPLv2 and BSD-2-Clause License: GPL-2.0-only AND LGPL-2.1-only AND BSD-2-Clause
%description testsuite %description testsuite
An extensive functional testsuite for LVM2. An extensive functional testsuite for LVM2.
@ -714,100 +666,129 @@ An extensive functional testsuite for LVM2.
%endif %endif
%changelog %changelog
* Thu Jul 13 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.21-3 * Thu Nov 14 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.28-3
- Fix lvresize fail in case of multiple mountpoints. - Fix duplicate LV names when converting pools to RAID1 with more than 2 legs.
- Fix allocator for RAID LVs allocating multiple legs on single device.
- Fix device id handling of WWIDs with trailing spaces. * Wed Nov 13 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.28-2
- Fix input units for VDO LV's minimim_io_size.
- Fix stripe count and validation for RAID LVs.
* Tue Nov 05 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.28-1
- Update to upstream version 2.03.28.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Fri Oct 25 2024 MSVSphere Packaging Team <packager@msvsphere-os.ru> - 2.03.27-1
- Rebuilt for MSVSphere 10
* Wed Oct 02 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.27-1
- Update to upstream version 2.03.27.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Wed Sep 25 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.24-4
- Bump release.
* Thu Sep 19 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.24-3
- Bump release and rebuild.
* Fri Sep 13 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.24-2
- Remove dlm.
- Update License tags to SPDX compliant identifiers.
* Wed May 24 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.21-2 * Thu Aug 15 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.24-1
- Allow snapshots over raid+integrity LV. - Update to upstream version 2.03.24.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Wed Jan 24 2024 Marian Csontos <mcsontos@redhat.com> - 2.03.23-1
- Update to upstream version 2.03.23.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.22-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Wed Aug 02 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.22-1
- Update to upstream version 2.03.22.
- Allow snapshots of raid+integrity LV.
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.21-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Fri Jun 16 2023 Python Maint <python-maint@redhat.com> - 2.03.21-3
- Rebuilt for Python 3.12
* Sat May 20 2023 Todd Zullinger <tmz@pobox.com> - 2.03.21-2
- Avoid unowned %%{python3_sitelib}/lvmdbusd directory
* Fri Apr 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.21-1 * Fri Apr 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.21-1
- Update to upstream version 2.03.21. - Update to upstream version 2.03.21.
- Allow (write)cache over raid+integrity LV. - Allow (write)cache over raid+integrity LV.
* Wed Apr 05 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.20-2 * Tue Apr 04 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.20-3
- Fix ModuleNotFoundError: No module named 'utils' in lvmdbusd. - Fix segfault in lvmdbusd on s390x.
* Tue Mar 21 2023 Adam Williamson <awilliam@redhat.com> - 2.03.20-2
- Backport PR #114 to fix #2180557
* Tue Mar 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.20-1 * Tue Mar 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.20-1
- Update to upstream version 2.03.20. - Update to upstream version 2.03.20.
* Tue Mar 07 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.19-1 * Wed Mar 08 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.19-2
- Update to upstream version 2.03.19. - Fix lvresize's check for mounted and renamed LVs to handle spaces.
- See WHATS_NEW and WHATS_NEW_DM for more information. - Fix segfault when using -S|--select with log/report_command_log=1.
* Thu Feb 16 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-7 * Tue Feb 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.19-1
- Fix segfault in previous build. - Update to upstream version 2.03.19.
* Thu Feb 09 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-6
- Fix lvresize resizing LUKS device only when resizing FS is enabled.
- Improve lvresize handling of renamed volumes.
- Fix random unmount when resizing volume backed by thin pool.
* Fri Jan 27 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-5
- Fix vgimportclone fail if PV has no metadata.
- Fix lvmdbusd missing stderr for commands not returning JSON.
* Fri Jan 06 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-4 * Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.18-2
- Fix missing warning on thin pool over provisioning. - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
- Fix infinite recursion in lvresize_fs_helper when resizing LUKS device.
* Tue Dec 06 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.17-3 * Thu Dec 22 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.18-1
- Fix segfault during scanning PVs. - Update to upstream version 2.03.18.
* Tue Nov 29 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.17-2 * Wed Nov 30 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.17-2
- Fix permissions on lvresize_fs_helper. - Fix permission issue.
* Thu Nov 10 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.17-1 * Wed Nov 16 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.17-1
- Update to upstream version 2.03.17. - Update to upstream version 2.03.17.
- Add new options (--fs, --fsmode) for FS handling when resizing LVs.
- Many bugfixes mainly in VDO, lvmdbusd and devices file support.
- See WHATS_NEW and WHATS_NEW_DM for more information. - See WHATS_NEW and WHATS_NEW_DM for more information.
* Fri Jul 29 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.16-3 * Mon Sep 26 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.16-1
- Fix effect of setting multipath_component_detection to 0.
- Fix lvmdbusd using lvm shell with editline.
* Thu Jul 14 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.16-2
- Exit with error when --devicesfile used does not exist.
- Restore --reportformat option in pvdisplay.
- Improve multipath backlist option handling.
* Wed May 18 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.16-1
- Update to upstream version 2.03.16. - Update to upstream version 2.03.16.
- See WHATS_NEW and WHATS_NEW_DM for more information. - Devices file feature - see lvmdevices(8).
- Changes in udev support:
- obtain_device_list_from_udev defaults to 0.
- see devices/external_device_info_source,
devices/obtain_device_list_from_udev, and devices/multipath_wwids_file help
in lvm.conf
- Remove service based autoactivation. global/event_activation = 0 is NOOP.
- see lvmautoactivation(7).
- Many fixes and improvements, see WHATS_NEW and WHATS_NEW_DM for more.
* Tue Feb 15 2022 Marian Csontos <mcsontos@redhat.com> - 2.03.14-4 * Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.11-9
- Remove service based autoactivation. - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
- New lvmautoactivation(7) man page.
- Fix missing PVIDs for multipath devices in system.devices file.
* Fri Nov 19 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.14-3 * Mon Jun 13 2022 Python Maint <python-maint@redhat.com> - 2.03.11-8
- Fix gating tests. - Rebuilt for Python 3.11
* Thu Nov 18 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.14-2 * Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.11-7
- Change use_devices_file default back to 1. - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Wed Oct 20 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.14-1 * Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 2.03.11-6
- Update to upstream version 2.03.14. - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Wed Aug 11 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.13-1 * Fri Jun 04 2021 Python Maint <python-maint@redhat.com> - 2.03.11-5
- Update to upstream version 2.03.13. - Rebuilt for Python 3.10
- Change in obtain_devices_list_from_udev default.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 8:2.03.12-4 * Mon Mar 22 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.11-4
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags - Fix editline compilation.
Related: rhbz#1991688
* Mon May 24 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-2 * Tue Mar 16 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.11-3
- Fix dependency on newer systemd package than available. - Replace readline library with editline.
* Fri May 14 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-1
- Update to upstream version 2.03.12.
- See WHATS_NEW and WHATS_NEW_DM for more information.
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 8:2.03.11-2 * Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 2.03.11-2
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 - Rebuilt for updated systemd-rpm-macros
See https://pagure.io/fesco/issue/2583.
* Mon Feb 22 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.11-1 * Mon Feb 22 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.11-1
- Fix mpath filtering of NVMe devices. - Fix mpath filtering of NVMe devices.

Loading…
Cancel
Save