diff --git a/.gitignore b/.gitignore index 325731b..49c2c57 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/LVM2.2.03.12.tgz +SOURCES/LVM2.2.03.14.tgz diff --git a/.lvm2.metadata b/.lvm2.metadata index dc25d8a..db0e692 100644 --- a/.lvm2.metadata +++ b/.lvm2.metadata @@ -1 +1 @@ -6d74d987b474dd0b45f239eb6dcc050622ad6962 SOURCES/LVM2.2.03.12.tgz +e5d4364e823d72b9a08b3aecc13cd677972830f0 SOURCES/LVM2.2.03.14.tgz diff --git a/SOURCES/lvm2-2_03_13-device_id-handle-scsi_debug-wwid.patch b/SOURCES/lvm2-2_03_13-device_id-handle-scsi_debug-wwid.patch deleted file mode 100644 index 84cc940..0000000 --- a/SOURCES/lvm2-2_03_13-device_id-handle-scsi_debug-wwid.patch +++ /dev/null @@ -1,18 +0,0 @@ - lib/device/device_id.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/lib/device/device_id.c b/lib/device/device_id.c -index f158e4f..9cc82f1 100644 ---- a/lib/device/device_id.c -+++ b/lib/device/device_id.c -@@ -308,6 +308,10 @@ const char *device_id_system_read(struct cmd_context *cmd, struct device *dev, u - - if (!sysbuf[0]) - _read_sys_block(cmd, dev, "wwid", sysbuf, sizeof(sysbuf)); -+ -+ /* scsi_debug wwid begins "t10.Linux scsi_debug ..." */ -+ if (strstr(sysbuf, "scsi_debug")) -+ sysbuf[0] = '\0'; - } - - else if (idtype == DEV_ID_TYPE_SYS_SERIAL) diff --git a/SOURCES/lvm2-2_03_13-devices-don-t-use-deleted-loop-backing-file-for-devi.patch b/SOURCES/lvm2-2_03_13-devices-don-t-use-deleted-loop-backing-file-for-devi.patch deleted file mode 100644 index 6de11be..0000000 --- a/SOURCES/lvm2-2_03_13-devices-don-t-use-deleted-loop-backing-file-for-devi.patch +++ /dev/null @@ -1,21 +0,0 @@ - lib/device/device_id.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/lib/device/device_id.c b/lib/device/device_id.c -index 67f72e5..1b98487 100644 ---- a/lib/device/device_id.c -+++ b/lib/device/device_id.c -@@ -325,8 +325,12 @@ const char *device_id_system_read(struct cmd_context *cmd, struct device *dev, u - else if (idtype == DEV_ID_TYPE_MD_UUID) - _read_sys_block(cmd, dev, "md/uuid", sysbuf, sizeof(sysbuf)); - -- else if (idtype == DEV_ID_TYPE_LOOP_FILE) -+ else if (idtype == DEV_ID_TYPE_LOOP_FILE) { - _read_sys_block(cmd, dev, "loop/backing_file", sysbuf, sizeof(sysbuf)); -+ /* if backing file is deleted, fall back to devname */ -+ if (strstr(sysbuf, "(deleted)")) -+ sysbuf[0] = '\0'; -+ } - - else if (idtype == DEV_ID_TYPE_DEVNAME) { - if (!(idname = strdup(dev_name(dev)))) diff --git a/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch b/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch deleted file mode 100644 index 652b0b7..0000000 --- a/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch +++ /dev/null @@ -1,25 +0,0 @@ - tools/command-lines.in | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/tools/command-lines.in b/tools/command-lines.in -index 1107c1e..67c37ff 100644 ---- a/tools/command-lines.in -+++ b/tools/command-lines.in -@@ -534,7 +534,7 @@ RULE: all and lv_is_visible - - --- - --lvconvert --type thin-pool LV_linear_striped_raid_cache_error_zero -+lvconvert --type thin-pool LV_linear_striped_raid_cache_writecache_error_zero - OO: --stripes_long Number, --stripesize SizeKB, - OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT - OP: PV ... -@@ -566,7 +566,7 @@ RULE: --poolmetadata not --readahead --stripesize --stripes_long - # This command syntax is deprecated, and the primary forms - # of creating a pool or swapping metadata should be used. - --lvconvert --thinpool LV_linear_striped_raid_cache_thinpool -+lvconvert --thinpool LV_linear_striped_raid_cache_writecache_thinpool - OO: --stripes_long Number, --stripesize SizeKB, - OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT - OP: PV ... diff --git a/SOURCES/lvm2-2_03_13-lvconvert-allow-writecache-with-other-thinpool-comma.patch b/SOURCES/lvm2-2_03_13-lvconvert-allow-writecache-with-other-thinpool-comma.patch deleted file mode 100644 index 2875b22..0000000 --- a/SOURCES/lvm2-2_03_13-lvconvert-allow-writecache-with-other-thinpool-comma.patch +++ /dev/null @@ -1,16 +0,0 @@ - tools/lvconvert.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index 8dd8a15..6066d1f 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -4803,7 +4803,7 @@ static int _lvconvert_to_pool_or_swap_metadata_single(struct cmd_context *cmd, - - switch (cmd->command->command_enum) { - case lvconvert_to_thinpool_or_swap_metadata_CMD: -- if (lv_is_cache(lv)) -+ if (lv_is_cache(lv) || lv_is_writecache(lv)) - /* For cached LV check the cache origin LV type */ - lvt_enum = get_lvt_enum(seg_lv(first_seg(lv), 0)); - to_thinpool = 1; diff --git a/SOURCES/lvm2-2_03_13-lvconvert-fix-vdo-virtual-size-when-specified.patch b/SOURCES/lvm2-2_03_13-lvconvert-fix-vdo-virtual-size-when-specified.patch deleted file mode 100644 index 7758cca..0000000 --- a/SOURCES/lvm2-2_03_13-lvconvert-fix-vdo-virtual-size-when-specified.patch +++ /dev/null @@ -1,17 +0,0 @@ - lib/metadata/vdo_manip.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c -index 7d5a2cb..afc513a 100644 ---- a/lib/metadata/vdo_manip.c -+++ b/lib/metadata/vdo_manip.c -@@ -393,7 +393,8 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - } else { - log_verbose("Skiping VDO formating %s.", display_lvname(data_lv)); - /* TODO: parse existing VDO data and retrieve vdo_logical_size */ -- vdo_logical_size = data_lv->size; -+ if (!*virtual_extents) -+ vdo_logical_size = data_lv->size; - } - - if (!deactivate_lv(data_lv->vg->cmd, data_lv)) { diff --git a/SOURCES/lvm2-2_03_13-lvmdevices-add-deviceidtype-option.patch b/SOURCES/lvm2-2_03_13-lvmdevices-add-deviceidtype-option.patch deleted file mode 100644 index 6d4e6bf..0000000 --- a/SOURCES/lvm2-2_03_13-lvmdevices-add-deviceidtype-option.patch +++ /dev/null @@ -1,211 +0,0 @@ - lib/device/device_id.c | 32 ++++++++++++++---------- - man/lvmdevices.8_des | 68 +++++++++++++++++++++++++++++++++++++++----------- - tools/args.h | 5 ++++ - tools/command-lines.in | 1 + - tools/lvmdevices.c | 7 ++++-- - 5 files changed, 84 insertions(+), 29 deletions(-) - -diff --git a/lib/device/device_id.c b/lib/device/device_id.c -index 1b98487..f158e4f 100644 ---- a/lib/device/device_id.c -+++ b/lib/device/device_id.c -@@ -931,6 +931,7 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_ - /* - * Choose the device_id type for the device being added. - * -+ * 0. use an idtype specified by the user - * 1. use an idtype specific to a special/virtual device type - * e.g. loop, mpath, crypt, lvmlv, md, etc. - * 2. use an idtype specified by user option. -@@ -939,6 +940,24 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_ - * 5. use devname as the last resort. - */ - -+ if (idtype_arg) { -+ if (!(idtype = idtype_from_str(idtype_arg))) -+ log_warn("WARNING: ignoring unknown device_id type %s.", idtype_arg); -+ else { -+ if (id_arg) { -+ if ((idname = strdup(id_arg))) -+ goto id_done; -+ log_warn("WARNING: ignoring device_id name %s.", id_arg); -+ } -+ -+ if ((idname = device_id_system_read(cmd, dev, idtype))) -+ goto id_done; -+ -+ log_warn("WARNING: ignoring deviceidtype %s which is not available for device.", idtype_arg); -+ idtype = 0; -+ } -+ } -+ - if (MAJOR(dev->dev) == cmd->dev_types->device_mapper_major) { - if (_dev_has_mpath_uuid(cmd, dev, &idname)) { - idtype = DEV_ID_TYPE_MPATH_UUID; -@@ -972,19 +991,6 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_ - log_warn("Missing support for DRBD idtype"); - } - -- if (idtype_arg) { -- if (!(idtype = idtype_from_str(idtype_arg))) -- log_warn("WARNING: ignoring unknown device_id type %s.", idtype_arg); -- else { -- if (id_arg) { -- if (!(idname = strdup(id_arg))) -- stack; -- goto id_done; -- } -- goto id_name; -- } -- } -- - /* - * No device-specific, existing, or user-specified idtypes, - * so use first available of sys_wwid / sys_serial / devname. -diff --git a/man/lvmdevices.8_des b/man/lvmdevices.8_des -index 015aa11..2335456 100644 ---- a/man/lvmdevices.8_des -+++ b/man/lvmdevices.8_des -@@ -9,18 +9,18 @@ remove it from the devices file with lvmdevices --deldev. The - vgimportdevices(8) command adds all PVs from a VG to the devices file, - and updates the VG metadata to include device IDs of the PVs. - .P --Commands adding new devices to the devices file necessarily look outside --the existing devices file to find the devices to add. pvcreate, vgcreate, --and vgextend also look outside the devices file to create new PVs and add --them to the devices file. -+Commands that add new devices to the devices file necessarily look outside -+the existing devices file to find the devices being added. pvcreate, -+vgcreate, and vgextend also look outside the devices file to create new -+PVs and add those PVs to the devices file. - .P - LVM records devices in the devices file using hardware-specific IDs, such - as the WWID, and attempts to use subsystem-specific IDs for virtual device --types (which also aim to be as unique and stable as possible.) --These device IDs are also written in the VG metadata. When no hardware or -+types (which also aim to be as unique and stable as possible.) These -+device IDs are also written in the VG metadata. When no hardware or - virtual ID is available, lvm falls back using the unstable device name as --the device ID. When devnames are used, lvm performs extra scanning to --find devices if their devname changes, e.g. after reboot. -+the device ID. When devnames are used as IDs, lvm performs extra scanning -+to find devices if their devname changes, e.g. after reboot. - .P - When proper device IDs are used, an lvm command will not look at devices - outside the devices file, but when devnames are used as a fallback, lvm -@@ -34,12 +34,13 @@ overriding the devices file. The listed devices act as a sort of devices - file in terms of limiting which devices lvm will see and use. Devices - that are not listed will appear to be missing to the lvm command. - .P --Multiple devices files can be kept in \fI#DEFAULT_SYS_DIR#/devices\fP, which allows lvm --to be used with different sets of devices, e.g. system devices do not need --to be exposed to a specific application, and the application can use lvm on --its own devices that are not exposed to the system. The option ----devicesfile is used to select the devices file to use with the --command. Without the option set, the default system devices file is used. -+Multiple devices files can be kept \fI#DEFAULT_SYS_DIR#/devices\fP, which -+allows lvm to be used with different sets of devices. For example, system -+devices do not need to be exposed to a specific application, and the -+application can use lvm on its own devices that are not exposed to the -+system. The option --devicesfile is used to select the devices -+file to use with the command. Without the option set, the default system -+devices file is used. - .P - Setting --devicesfile "" causes lvm to not use a devices file. - .P -@@ -59,3 +60,42 @@ if it does not yet exist. - .P - It is recommended to use lvm commands to make changes to the devices file to - ensure proper updates. -+.P -+The device ID and device ID type are included in the VG metadata and can -+be reported with pvs -o deviceid,deviceidtype. (Note that the lvmdevices -+command does not update VG metadata, but subsequent lvm commands modifying -+the metadata will include the device ID.) -+.P -+Possible device ID types are: -+.br -+.IP \[bu] 2 -+.B sys_wwid -+uses the wwid reported by sysfs. This is the first choice for non-virtual -+devices. -+.IP \[bu] 2 -+.B sys_serial -+uses the serial number reported by sysfs. This is the second choice for -+non-virtual devices. -+.IP \[bu] 2 -+.B mpath_uuid -+is used for dm multipath devices, reported by sysfs. -+.IP \[bu] 2 -+.B crypt_uuid -+is used for dm crypt devices, reported by sysfs. -+.IP \[bu] 2 -+.B md_uuid -+is used for md devices, reported by sysfs. -+.B lvmlv_uuid -+is used if a PV is placed on top of an lvm LV, reported by sysfs. -+.IP \[bu] 2 -+.B loop_file -+is used for loop devices, the backing file name repored by sysfs. -+.IP \[bu] 2 -+.B devname -+the device name is used if no other type applies. -+.P -+ -+The default choice for device ID type can be overriden using lvmdevices -+--addev --deviceidtype . If the specified type is available for the -+device it will be used, otherwise the device will be added using the type -+that would otherwise be chosen. -diff --git a/tools/args.h b/tools/args.h -index 741c82b..d4f23f8 100644 ---- a/tools/args.h -+++ b/tools/args.h -@@ -228,6 +228,11 @@ arg(detachprofile_ARG, '\0', "detachprofile", 0, 0, 0, - "Detaches a metadata profile from a VG or LV.\n" - "See \\fBlvm.conf\\fP(5) for more information about profiles.\n") - -+arg(deviceidtype_ARG, '\0', "deviceidtype", string_VAL, 0, 0, -+ "The type of device ID to use for the device.\n" -+ "If the specified type is available for the device,\n" -+ "then it will override the default type that lvm would use.\n") -+ - arg(devices_ARG, '\0', "devices", pv_VAL, ARG_GROUPABLE, 0, - "Devices that the command can use. This option can be repeated\n" - "or accepts a comma separated list of devices. This overrides\n" -diff --git a/tools/command-lines.in b/tools/command-lines.in -index 67c37ff..8607305 100644 ---- a/tools/command-lines.in -+++ b/tools/command-lines.in -@@ -1430,6 +1430,7 @@ ID: lvmdevices_update - DESC: Update the devices file to fix incorrect values. - - lvmdevices --adddev PV -+OO: --deviceidtype String - ID: lvmdevices_edit - DESC: Add a device to the devices file. - -diff --git a/tools/lvmdevices.c b/tools/lvmdevices.c -index 6b3e056..3448bdd 100644 ---- a/tools/lvmdevices.c -+++ b/tools/lvmdevices.c -@@ -265,6 +265,7 @@ int lvmdevices(struct cmd_context *cmd, int argc, char **argv) - - if (arg_is_set(cmd, adddev_ARG)) { - const char *devname; -+ const char *deviceidtype; - - if (!(devname = arg_str_value(cmd, adddev_ARG, NULL))) - goto_bad; -@@ -311,8 +312,10 @@ int lvmdevices(struct cmd_context *cmd, int argc, char **argv) - dev_name(dev), dev_filtered_reason(dev)); - } - -- /* allow deviceidtype_ARG/deviceid_ARG ? */ -- if (!device_id_add(cmd, dev, dev->pvid, NULL, NULL)) -+ /* also allow deviceid_ARG ? */ -+ deviceidtype = arg_str_value(cmd, deviceidtype_ARG, NULL); -+ -+ if (!device_id_add(cmd, dev, dev->pvid, deviceidtype, NULL)) - goto_bad; - if (!device_ids_write(cmd)) - goto_bad; diff --git a/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch b/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch deleted file mode 100644 index 45a878d..0000000 --- a/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch +++ /dev/null @@ -1,150 +0,0 @@ - lib/metadata/lv_manip.c | 19 +++++++++ - lib/metadata/metadata-exported.h | 2 + - lib/metadata/thin_manip.c | 12 ++++++ - test/shell/lvremove-thindata-caches.sh | 71 ++++++++++++++++++++++++++++++++++ - 4 files changed, 104 insertions(+) - create mode 100644 test/shell/lvremove-thindata-caches.sh - -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 508f78c..37dd361 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -6692,6 +6692,25 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, - return_0; - } - -+ /* if thin pool data lv is writecache, then detach and remove the writecache */ -+ if (lv_is_thin_pool(lv)) { -+ struct logical_volume *data_lv = data_lv_from_thin_pool(lv); -+ -+ if (data_lv && lv_is_writecache(data_lv)) { -+ struct logical_volume *cachevol_lv = first_seg(data_lv)->writecache; -+ -+ if (!lv_detach_writecache_cachevol(data_lv, 1)) { -+ log_error("Failed to detach writecache from %s", display_lvname(data_lv)); -+ return 0; -+ } -+ -+ if (!lv_remove_single(cmd, cachevol_lv, force, 1)) { -+ log_error("Failed to remove cachevol %s.", display_lvname(cachevol_lv)); -+ return 0; -+ } -+ } -+ } -+ - if (lv_is_writecache(lv)) { - struct logical_volume *cachevol_lv = first_seg(lv)->writecache; - -diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h -index c611635..54bc0d0 100644 ---- a/lib/metadata/metadata-exported.h -+++ b/lib/metadata/metadata-exported.h -@@ -927,6 +927,8 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - int vg_set_pool_metadata_spare(struct logical_volume *lv); - int vg_remove_pool_metadata_spare(struct volume_group *vg); - -+struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv); -+ - int attach_thin_external_origin(struct lv_segment *seg, - struct logical_volume *external_lv); - int detach_thin_external_origin(struct lv_segment *seg); -diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c -index 451c382..6ce88bd 100644 ---- a/lib/metadata/thin_manip.c -+++ b/lib/metadata/thin_manip.c -@@ -21,6 +21,18 @@ - #include "lib/config/defaults.h" - #include "lib/display/display.h" - -+struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv) -+{ -+ struct lv_segment *seg_thinpool = first_seg(pool_lv); -+ -+ if (!seg_thinpool || !seg_is_thin_pool(seg_thinpool)) { -+ log_error(INTERNAL_ERROR "data_lv_from_thin_pool arg not thin pool %s", pool_lv->name); -+ return NULL; -+ } -+ -+ return seg_thinpool->areas[0].u.lv.lv; -+} -+ - /* TODO: drop unused no_update */ - int attach_pool_message(struct lv_segment *pool_seg, dm_thin_message_t type, - struct logical_volume *lv, uint32_t delete_id, -diff --git a/test/shell/lvremove-thindata-caches.sh b/test/shell/lvremove-thindata-caches.sh -new file mode 100644 -index 0000000..ba099c3 ---- /dev/null -+++ b/test/shell/lvremove-thindata-caches.sh -@@ -0,0 +1,71 @@ -+#!/usr/bin/env bash -+ -+# Copyright (C) 2017-2020 Red Hat, Inc. All rights reserved. -+# -+# This copyrighted material is made available to anyone wishing to use, -+# modify, copy, or redistribute it subject to the terms and conditions -+# of the GNU General Public License v.2. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software Foundation, -+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ -+SKIP_WITH_LVMPOLLD=1 -+ -+. lib/inittest -+ -+aux have_cache 1 10 0 || skip -+aux have_writecache 1 0 0 || skip -+which mkfs.xfs || skip -+ -+aux prepare_devs 6 70 # want 64M of usable space from each dev -+ -+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4" "$dev5" "$dev6" -+ -+# lv1 is thinpool LV: 128M -+# lv2 is fast LV: 64M -+# lv3 is thin LV: 1G -+ -+# -+# Test lvremove of a thinpool that uses cache|writecache on data -+# -+ -+# attach writecache to thinpool data -+lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" -+lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg -+lvcreate -n $lv2 -L64M -an $vg "$dev3" -+lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1 -+lvchange -ay $vg/$lv1 -+lvs -a $vg -+mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" -+lvremove -y $vg/$lv1 -+ -+# attach cache/writeback (cachevol) to thinpool data -+lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" -+lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg -+lvcreate -n $lv2 -L64M -an $vg "$dev3" -+lvconvert -y --type cache --cachevol $lv2 --cachemode writeback $vg/$lv1 -+lvchange -ay $vg/$lv1 -+mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" -+lvremove -y $vg/$lv1 -+ -+# attach cache/writethrough (cachevol) to thinpool data -+lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" -+lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg -+lvcreate -n $lv2 -L64M -an $vg "$dev3" -+lvconvert -y --type cache --cachevol $lv2 --cachemode writethrough $vg/$lv1 -+lvchange -ay $vg/$lv1 -+mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" -+lvremove -y $vg/$lv1 -+ -+# attach cache (cachepool) to thinpool data -+lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2" -+lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg -+lvcreate -y --type cache-pool -n $lv2 -L64M --poolmetadataspare n $vg "$dev3" "$dev6" -+lvconvert -y --type cache --cachepool $lv2 --poolmetadataspare n $vg/$lv1 -+lvchange -ay $vg/$lv1 -+mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3" -+lvremove -y $vg/$lv1 -+ -+vgremove -f $vg -+ diff --git a/SOURCES/lvm2-2_03_13-man-vdoimport-page.patch b/SOURCES/lvm2-2_03_13-man-vdoimport-page.patch deleted file mode 100644 index fe6032c..0000000 --- a/SOURCES/lvm2-2_03_13-man-vdoimport-page.patch +++ /dev/null @@ -1,102 +0,0 @@ - man/vdoimport.8_main | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 92 insertions(+) - create mode 100644 man/vdoimport.8_main - -diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main -new file mode 100644 -index 0000000..1f32909 ---- /dev/null -+++ b/man/vdoimport.8_main -@@ -0,0 +1,92 @@ -+.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" -+. -+.SH "NAME" -+. -+vdoimport \(em utility to import VDO volumes into a new volume group. -+. -+.SH SYNOPSIS -+. -+.PD 0 -+.ad l -+.TP 10 -+.B vdoimport -+.RI [ options ] -+.IR device -+. -+.PD -+. -+.SH DESCRIPTION -+. -+vdoimport utility imports VDO volumes created and managed by -+.BR vdo (8) -+manager into -+.BR lvm2 (8) -+managed VDO LV. This is realized by moving VDO superblock by 2MiB -+and creating lvm2 metadata at the front of this device. The operation is not reversible, -+thus after conversion to lvm2 the access to VDO data is only possible with -+.BR lvm2 (8) -+commands, -+.BR vdo (8) -+manager no longer control such volume. -+. -+.SH OPTIONS -+. -+.TP -+.BR -f | --force -+Bypass some sanity checks. -+. -+.TP -+.BR -h | --help -+Display the help text. -+. -+.TP -+.BR -n | --name -+Specifies the name of converted VDO LV. When the name is not specified, -+some automatic name is selected. In case the converted VDO volume is -+already using LV a backend device, the name of this LV is used for VDO LV. -+In this case also the of volume group must stay same. -+. -+.TP -+.BR -v | --verbose -+Be more verbose. -+. -+.TP -+.BR -y | --yes -+Answer "yes" at any prompts. -+. -+.TP -+.BR --dry-run -+Print commands without running them. -+. -+. -+.SH DIAGNOSTICS -+. -+On successful completion, the status code is 0. -+A status code of 1 is used for failure. -+. -+.SH EXAMPLES -+. -+Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. -+.P -+# -+.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume -+. -+.SH ENVIRONMENT VARIABLES -+. -+.TP -+.B TMPDIR -+The temporary directory name for mount points. Defaults to "\fI/tmp\fP". -+.TP -+.B DM_DEV_DIR -+The device directory name. -+Defaults to "\fI/dev\fP" and must be an absolute path. -+. -+.SH SEE ALSO -+. -+.nh -+.ad l -+.BR lvm (8), -+.BR lvm.conf (5), -+.P -+.BR vdo (8), -+.BR vdo2lvm (8), diff --git a/SOURCES/lvm2-2_03_13-test.patch b/SOURCES/lvm2-2_03_13-test.patch deleted file mode 100644 index f6672b7..0000000 --- a/SOURCES/lvm2-2_03_13-test.patch +++ /dev/null @@ -1,61 +0,0 @@ - test/shell/vgsplit-cache.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 47 insertions(+) - -diff --git a/test/shell/vgsplit-cache.sh b/test/shell/vgsplit-cache.sh -index eba85be..202e4b5 100644 ---- a/test/shell/vgsplit-cache.sh -+++ b/test/shell/vgsplit-cache.sh -@@ -75,6 +75,53 @@ lvremove -y $vg - vgremove -ff $vg - vgremove -ff $vg1 - -+# -+# Check we handle pmspare for splitted VGs -+# -+aux prepare_vg 7 -+ -+# Create cache-pool and pmspare on single PV1 -+lvcreate -L10 --type cache-pool $vg/cpool "$dev1" -+# Move spare to separate PV3 -+pvmove -n $vg/lvol0_pmspare "$dev1" "$dev3" -+# Create origin on PV2 -+lvcreate -L10 -n orig $vg "$dev2" -+lvconvert -H -y --cachepool $vg/cpool $vg/orig -+ -+vgchange -an $vg -+ -+# Check we do not create new _pmspare -+vgsplit --poolmetadataspare n $vg $vg1 "$dev2" "$dev1" -+ -+check lv_exists $vg/lvol0_pmspare -+check lv_not_exists $vg1/lvol0_pmspare -+ -+vgremove $vg -+vgremove -f $vg1 -+ -+ -+aux prepare_vg 7 -+ -+# Again - now with handling _pmspare by vgsplit -+lvcreate -L10 --type cache-pool $vg/cpool "$dev1" -+# Move spare to separate PV3 -+pvmove -n $vg/lvol0_pmspare "$dev1" "$dev3" -+# Create origin on PV2 -+lvcreate -L10 -n orig $vg "$dev2" -+lvconvert -H -y --cachepool $vg/cpool $vg/orig -+ -+vgchange -an $vg -+ -+# Handle _pmspare (default) -+vgsplit --poolmetadataspare y $vg $vg1 "$dev2" "$dev1" -+ -+check lv_not_exists $vg/lvol0_pmspare -+check lv_exists $vg1/lvol0_pmspare -+ -+vgremove $vg -+vgremove -f $vg1 -+ -+ - vgcreate $vg "$dev1" "$dev2" "$dev3" "$dev4" - - lvcreate -L6 -n $lv1 -an $vg "$dev2" diff --git a/SOURCES/lvm2-2_03_13-tests-extend-vgmerge-testing.patch b/SOURCES/lvm2-2_03_13-tests-extend-vgmerge-testing.patch deleted file mode 100644 index 22dca89..0000000 --- a/SOURCES/lvm2-2_03_13-tests-extend-vgmerge-testing.patch +++ /dev/null @@ -1,53 +0,0 @@ - test/shell/vgmerge-operation.sh | 42 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 42 insertions(+) - -diff --git a/test/shell/vgmerge-operation.sh b/test/shell/vgmerge-operation.sh -index 21889e9..0bf517d 100644 ---- a/test/shell/vgmerge-operation.sh -+++ b/test/shell/vgmerge-operation.sh -@@ -80,3 +80,45 @@ grep "Duplicate logical volume name \"$lv1\" in \"$vg2\" and \"$vg1" err - check pvlv_counts $vg1 2 1 0 - check pvlv_counts $vg2 2 1 0 - vgremove -f $vg1 $vg2 -+ -+ -+# 'vgmerge' handle pmspare for merged VG -+if aux have_thin 1 5 0; then -+ -+# With disabled pmspare nothing is created -+vgcreate $vg1 "$dev1" "$dev2" -+vgcreate $vg2 "$dev3" "$dev4" -+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M --poolmetadataspare n -+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M --poolmetadataspare n -+vgchange -an $vg1 $vg2 -+ -+vgmerge --poolmetadataspare n $vg1 $vg2 -+check lv_not_exists $vg/lvol0_pmspare -+vgremove -ff $vg1 -+ -+ -+# With pmspare handling there are one created -+vgcreate $vg1 "$dev1" "$dev2" -+vgcreate $vg2 "$dev3" "$dev4" -+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M --poolmetadataspare n -+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M --poolmetadataspare n -+vgchange -an $vg1 $vg2 -+ -+vgmerge $vg1 $vg2 -+check lv_field $vg1/lvol0_pmspare size "8.00m" -+vgremove -ff $vg1 -+ -+ -+# When merged, bigger pmspare is preserved -+vgcreate $vg1 "$dev1" "$dev2" -+vgcreate $vg2 "$dev3" "$dev4" -+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M -+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M -+vgchange -an $vg1 $vg2 -+ -+vgmerge $vg1 $vg2 -+ -+check lv_field $vg1/lvol0_pmspare size "8.00m" -+vgremove -ff $vg1 -+ -+fi diff --git a/SOURCES/lvm2-2_03_13-thin-fix-component-detection-of-external-origin.patch b/SOURCES/lvm2-2_03_13-thin-fix-component-detection-of-external-origin.patch deleted file mode 100644 index 5b97d90..0000000 --- a/SOURCES/lvm2-2_03_13-thin-fix-component-detection-of-external-origin.patch +++ /dev/null @@ -1,63 +0,0 @@ - WHATS_NEW | 1 + - lib/activate/activate.c | 5 ++++- - test/shell/lvconvert-cache-thin.sh | 22 ++++++++++++++++++++++ - 3 files changed, 27 insertions(+), 1 deletion(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 5806ecb..097160e 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.13 - - =============================== -+ Fix detection of active components of external origin volume. - Add vdoimport tool to support conversion of VDO volumes. - Support configurable allocation/vdo_pool_header_size. - Fix handling of lvconvert --type vdo-pool --virtualsize. -diff --git a/lib/activate/activate.c b/lib/activate/activate.c -index 6bda738..94fc944 100644 ---- a/lib/activate/activate.c -+++ b/lib/activate/activate.c -@@ -2740,7 +2740,10 @@ static int _component_cb(struct logical_volume *lv, void *data) - (lv_is_thin_pool(lv) && pool_is_active(lv))) - return -1; - -- if (lv_is_active(lv)) { -+ /* External origin is activated through thinLV and uses -real suffix. -+ * Note: for old clustered logic we would need to check for all thins */ -+ if ((lv_is_external_origin(lv) && lv_info(lv->vg->cmd, lv, 1, NULL, 0, 0)) || -+ lv_is_active(lv)) { - if (!lv_is_component(lv) || lv_is_visible(lv)) - return -1; /* skip whole subtree */ - -diff --git a/test/shell/lvconvert-cache-thin.sh b/test/shell/lvconvert-cache-thin.sh -index 7dda6e6..9254239 100644 ---- a/test/shell/lvconvert-cache-thin.sh -+++ b/test/shell/lvconvert-cache-thin.sh -@@ -67,4 +67,26 @@ fail lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/$lv - # Thin-pool CAN use cached data LV - lvconvert --yes --thinpool $vg/$lv - -+lvremove -f $vg -+ -+# Check we can active snapshot of cached external origin (BZ: 1967744) -+lvcreate -T -L10M $vg/pool "$dev1" -+ -+lvcreate -L10M -n origin $vg "$dev1" -+lvcreate -H -L4M -n CPOOL $vg/origin "$dev2" -+ -+# Use cached origin as external origin -+lvconvert -y -T --thinpool $vg/pool --originname extorig origin -+ -+# Check we can easily create snapshot of such LV -+lvcreate -y -kn -n snap -s $vg/origin -+ -+# Deactivate everything and do a component activation of _cmeta volume -+lvchange -an $vg -+lvchange -ay -y $vg/CPOOL_cpool_cmeta -+ -+# Now this must fail since component volume is active -+not lvcreate -y -kn -n snap2 -s $vg/origin |& tee err -+grep "cmeta is active" err -+ - vgremove -f $vg diff --git a/SOURCES/lvm2-2_03_13-vdo-add-vdoimport-support.patch b/SOURCES/lvm2-2_03_13-vdo-add-vdoimport-support.patch deleted file mode 100644 index aed2254..0000000 --- a/SOURCES/lvm2-2_03_13-vdo-add-vdoimport-support.patch +++ /dev/null @@ -1,729 +0,0 @@ - WHATS_NEW | 3 + - configure | 25 +++ - configure.ac | 15 ++ - include/configure.h.in | 3 + - man/Makefile.in | 7 +- - scripts/Makefile.in | 4 + - scripts/vdoimport.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++ - test/Makefile.in | 1 + - test/shell/vdo-convert.sh | 110 ++++++++++++++ - 9 files changed, 543 insertions(+), 1 deletion(-) - create mode 100755 scripts/vdoimport.sh - create mode 100644 test/shell/vdo-convert.sh - -diff --git a/WHATS_NEW b/WHATS_NEW -index 04c6dcd..5806ecb 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,8 @@ - Version 2.03.13 - - =============================== -+ Add vdoimport tool to support conversion of VDO volumes. -+ Support configurable allocation/vdo_pool_header_size. -+ Fix handling of lvconvert --type vdo-pool --virtualsize. - Fix load of kvdo target when it is not present in memory (2.03.12). - - Version 2.03.12 - 07th May 2021 -diff --git a/configure b/configure -index 7c6bd48..661702d 100755 ---- a/configure -+++ b/configure -@@ -643,6 +643,8 @@ WRITE_INSTALL - WRITECACHE - VDO_LIB - VDO_INCLUDE -+VDOIMPORT_PATH -+VDOIMPORT - VDO - VALGRIND_POOL - USRSBINDIR -@@ -966,6 +968,7 @@ enable_dbus_service - enable_pkgconfig - enable_write_install - enable_fsadm -+enable_vdoimport - enable_blkdeactivate - enable_dmeventd - enable_selinux -@@ -1701,6 +1704,7 @@ Optional Features: - --enable-pkgconfig install pkgconfig support - --enable-write_install install user writable files - --disable-fsadm disable fsadm -+ --disable-vdoimport disable vdoimport - --disable-blkdeactivate disable blkdeactivate - --enable-dmeventd enable the device-mapper event daemon - --disable-selinux disable selinux support -@@ -3128,6 +3132,7 @@ case "$host_os" in - DM_IOCTLS=yes - SELINUX=yes - FSADM=yes -+ VDOIMPORT=yes - BLKDEACTIVATE=yes - ;; - darwin*) -@@ -3141,6 +3146,7 @@ case "$host_os" in - DM_IOCTLS=no - SELINUX=no - FSADM=no -+ VDOIMPORT=no - BLKDEACTIVATE=no - ;; - *) -@@ -12371,6 +12377,18 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FSADM" >&5 - $as_echo "$FSADM" >&6; } - -+ -+################################################################################ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5 -+$as_echo_n "checking whether to install vdoimport... " >&6; } -+# Check whether --enable-vdoimport was given. -+if test "${enable_vdoimport+set}" = set; then : -+ enableval=$enable_vdoimport; VDOIMPORT=$enableval -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $VDOIMPORT" >&5 -+$as_echo "$VDOIMPORT" >&6; } -+ - ################################################################################ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install blkdeactivate" >&5 - $as_echo_n "checking whether to install blkdeactivate... " >&6; } -@@ -13857,6 +13875,13 @@ cat >>confdefs.h <<_ACEOF - _ACEOF - - -+VDOIMPORT_PATH="$SBINDIR/vdoimport" -+ -+cat >>confdefs.h <<_ACEOF -+#define VDOIMPORT_PATH "$VDOIMPORT_PATH" -+_ACEOF -+ -+ - ################################################################################ - if test "$BUILD_DMEVENTD" = yes; then - -diff --git a/configure.ac b/configure.ac -index 1a49e7f..5a8b486 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -45,6 +45,7 @@ case "$host_os" in - DM_IOCTLS=yes - SELINUX=yes - FSADM=yes -+ VDOIMPORT=yes - BLKDEACTIVATE=yes - ;; - darwin*) -@@ -58,6 +59,7 @@ case "$host_os" in - DM_IOCTLS=no - SELINUX=no - FSADM=no -+ VDOIMPORT=no - BLKDEACTIVATE=no - ;; - *) -@@ -1291,6 +1293,14 @@ AC_ARG_ENABLE(fsadm, AC_HELP_STRING([--disable-fsadm], [disable fsadm]), - FSADM=$enableval) - AC_MSG_RESULT($FSADM) - -+ -+################################################################################ -+dnl -- Enable vdoimport -+AC_MSG_CHECKING(whether to install vdoimport) -+AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]), -+ VDOIMPORT=$enableval) -+AC_MSG_RESULT($VDOIMPORT) -+ - ################################################################################ - dnl -- Enable blkdeactivate - AC_MSG_CHECKING(whether to install blkdeactivate) -@@ -1646,6 +1656,9 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))" - FSADM_PATH="$SBINDIR/fsadm" - AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.]) - -+VDOIMPORT_PATH="$SBINDIR/vdoimport" -+AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.]) -+ - ################################################################################ - dnl -- dmeventd pidfile and executable path - if test "$BUILD_DMEVENTD" = yes; then -@@ -1882,6 +1895,8 @@ AC_SUBST(SILENT_RULES) - AC_SUBST(USRSBINDIR) - AC_SUBST(VALGRIND_POOL) - AC_SUBST(VDO) -+AC_SUBST(VDOIMPORT) -+AC_SUBST(VDOIMPORT_PATH) - AC_SUBST(VDO_FORMAT_CMD) - AC_SUBST(VDO_INCLUDE) - AC_SUBST(VDO_LIB) -diff --git a/include/configure.h.in b/include/configure.h.in -index 671d201..6df8d89 100644 ---- a/include/configure.h.in -+++ b/include/configure.h.in -@@ -684,6 +684,9 @@ - /* Enable a valgrind aware build of pool */ - #undef VALGRIND_POOL - -+/* Path to vdoimport binary. */ -+#undef VDOIMPORT_PATH -+ - /* The path to 'vdoformat', if available. */ - #undef VDO_FORMAT_CMD - -diff --git a/man/Makefile.in b/man/Makefile.in -index 29afc77..d60a92c 100644 ---- a/man/Makefile.in -+++ b/man/Makefile.in -@@ -23,6 +23,7 @@ else - endif - - FSADMMAN = fsadm.8 -+VDOIMPORTMAN = vdoimport.8 - BLKDEACTIVATEMAN = blkdeactivate.8 - DMEVENTDMAN = dmeventd.8 - DMFILEMAPDMAN = dmfilemapd.8 -@@ -50,7 +51,7 @@ MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8 - - ifeq (,$(findstring $(MAKECMDGOALS), distclean all_man install_all_man)) - MAN7 += lvmcache.7 lvmthin.7 lvmvdo.7 -- MAN8+=$(FSADMMAN) $(LVMPOLLDMAN) $(LVMLOCKDMAN) $(LVMDBUSDMAN) -+ MAN8+=$(FSADMMAN) $(LVMPOLLDMAN) $(LVMLOCKDMAN) $(LVMDBUSDMAN) $(VDOIMPORTMAN) - MAN8DM+=$(BLKDEACTIVATEMAN) $(DMEVENTDMAN) $(DMFILEMAPDMAN) - MAN8CLUSTER+=$(CMIRRORDMAN) - else -@@ -58,6 +59,10 @@ else - MAN8+=$(FSADMMAN) - endif - -+ ifeq ("@VDOIMPORT@", "yes") -+ MAN8+=$(VDOIMPORTMAN) -+ endif -+ - ifeq ("@BUILD_LVMDBUSD@", "yes") - MAN8+=$(LVMDBUSDMAN) - endif -diff --git a/scripts/Makefile.in b/scripts/Makefile.in -index e8f6742..1fe88ca 100644 ---- a/scripts/Makefile.in -+++ b/scripts/Makefile.in -@@ -31,6 +31,10 @@ ifeq ("@FSADM@", "yes") - LVM_SCRIPTS += fsadm.sh - endif - -+ifeq ("@VDOIMPORT@", "yes") -+ LVM_SCRIPTS += vdoimport.sh -+endif -+ - ifeq ("@BLKDEACTIVATE@", "yes") - DM_SCRIPTS += blkdeactivate.sh - endif -diff --git a/scripts/vdoimport.sh b/scripts/vdoimport.sh -new file mode 100755 -index 0000000..ef96591 ---- /dev/null -+++ b/scripts/vdoimport.sh -@@ -0,0 +1,376 @@ -+#!/bin/bash -+# -+# Copyright (C) 2021 Red Hat, Inc. All rights reserved. -+# -+# This file is part of LVM2. -+# -+# 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 -+# -+# Author: Zdenek Kabelac -+# -+# Script for converting VDO volumes to lvm2 VDO LVs -+# -+# Needed utilities: -+# lvm, dmsetup, -+# vdo, vdo2lvm, -+# grep, awk, sed, blockdev, readlink, mkdir -+# -+# Conversion is using 'vdo convert' support from VDO manager to move -+# existing VDO header by 2M which makes space to place in PV header -+# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. -+# -+ -+set -euE -o pipefail -+ -+TOOL=vdoimport -+ -+_SAVEPATH=$PATH -+PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" -+ -+# user may override lvm location by setting LVM_BINARY -+LVM=${LVM_BINARY:-lvm} -+VDO=${VDO_BINARY:-vdo} -+VDOCONF=${VDOCONF:-} -+BLOCKDEV="blockdev" -+READLINK="readlink" -+READLINK_E="-e" -+MKDIR="mkdir" -+ -+TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" -+DM_DEV_DIR="${DM_DEV_DIR:-/dev}" -+ -+DRY=0 -+VERB="" -+FORCE="" -+YES="" -+ -+# default name for converted VG and its VDO LV -+NAME="vdovg/vdolvol" -+ -+# help message -+tool_usage() { -+ echo "${TOOL}: Utility to convert VDO volume to VDO LV." -+ echo -+ echo " ${TOOL} [options] " -+ echo -+ echo " Options:" -+ echo " -f | --force Bypass sanity checks" -+ echo " -h | --help Show this help message" -+ echo " -n | --name Specifies VG/LV name for converted VDO volume" -+ echo " -v | --verbose Be verbose" -+ echo " -y | --yes Answer \"yes\" at any prompts" -+ echo " --dry-run Print commands without running them" -+ -+ exit -+} -+ -+verbose() { -+ test -z "$VERB" || echo "$TOOL:" "$@" -+} -+ -+# Support multi-line error messages -+error() { -+ for i in "$@" ; do -+ echo "$TOOL: $i" >&2 -+ done -+ cleanup 1 -+} -+ -+dry() { -+ if [ "$DRY" -ne 0 ]; then -+ verbose "Dry execution" "$@" -+ return 0 -+ fi -+ verbose "Executing" "$@" -+ "$@" -+} -+ -+cleanup() { -+ trap '' 2 -+ -+ rm -rf "$TEMPDIR" -+ # error exit status for break -+ exit "${1:-1}" -+} -+ -+get_enabled_value_() { -+ case "$1" in -+ enabled) echo "1" ;; -+ *) echo "0" ;; -+ esac -+} -+ -+get_kb_size_with_unit_() { -+ case "$1" in -+ *[kK]) echo $(( ${1%[kK]} )) ;; -+ *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; -+ *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; -+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; -+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; -+ esac -+} -+ -+get_mb_size_with_unit_() { -+ case "$1" in -+ *[mM]) echo $(( ${1%[mM]} )) ;; -+ *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; -+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; -+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; -+ esac -+} -+ -+# Figure out largest possible extent size usable for VG -+# $1 physical size -+# $2 logical size -+get_largest_extent_size_() { -+ local max=4 -+ local i -+ local d -+ -+ for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do -+ d=$(( $1 / i )) -+ test $(( d * i )) -eq "$1" || break -+ d=$(( $2 / i )) -+ test $(( d * i )) -eq "$2" || break -+ max=$i -+ done -+ echo "$max" -+} -+ -+# detect LV on the given device -+# dereference device name if it is symbolic link -+detect_lv_() { -+ local DEVICE=$1 -+ local MAJOR -+ local MINOR -+ local SYSVOLUME -+ local MAJORMINOR -+ -+ DEVICE=${1/#"${DM_DEV_DIR}/"/} -+ DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") -+ test -n "$DEVICE" || error "Cannot get readlink \"$1\"." -+ RDEVICE=$DEVICE -+ case "$RDEVICE" in -+ # hardcoded /dev since udev does not create these entries elsewhere -+ /dev/dm-[0-9]*) -+ read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" -+ read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." -+ MAJOR=${MAJORMINOR%%:*} -+ MINOR=${MAJORMINOR##*:} -+ ;; -+ *) -+ STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") -+ test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." -+ eval "$STAT" -+ ;; -+ esac -+ -+ eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" -+} -+ -+# parse yaml config files into 'prefix_yaml_part_names=("value")' strings -+parse_yaml_() { -+ local yaml_file=$1 -+ local prefix=$2 -+ local s -+ local w -+ local fs -+ -+ s='[[:space:]]*' -+ w='[a-zA-Z0-9_.-]*' -+ fs="$(echo @|tr @ '\034')" -+ -+ ( -+ sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ -+ -e 's/\$/\\\$/g' \ -+ -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ -+ -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -+ -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | -+ -+ awk -F"$fs" '{ -+ indent = length($1)/2; -+ if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} -+ vname[indent] = $2; -+ for (i in vname) {if (i > indent) {delete vname[i]}} -+ if (length($3) > 0) { -+ vn=""; for (i=0; i"$TEMPDIR/vdoconf.yml" -+ -+ VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") -+ TRVDONAME=$(echo "$VDONAME" | tr '-' '_') -+ -+ # When VDO volume is 'active', check it's not mounted/being used -+ eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" -+ test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" -+ -+ #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ -+ eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" -+ -+ vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") -+ vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") -+ -+ verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." -+ verbose "With logical volume of size $vdo_logicalSize KiB." -+ -+ PARAMS=$(cat <vg; - struct logical_volume *vdo_lv; - struct dm_vdo_target_params vdo_params; /* vdo */ -@@ -5497,12 +5497,12 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - goto out; - } - -- zero_vdopool = arg_int_value(cmd, zero_ARG, 1); -+ vdo_pool_zero = arg_int_value(cmd, zero_ARG, 1); - - log_warn("WARNING: Converting logical volume %s to VDO pool volume %s formating.", -- display_lvname(lv), zero_vdopool ? "with" : "WITHOUT"); -+ display_lvname(lv), vdo_pool_zero ? "with" : "WITHOUT"); - -- if (zero_vdopool) -+ if (vdo_pool_zero) - log_warn("THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)"); - else - log_warn("WARNING: Using invalid VDO pool data MAY DESTROY YOUR DATA!"); -@@ -5514,7 +5514,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - goto out; - } - -- if (zero_vdopool) { -+ if (vdo_pool_zero) { - if (!wipe_lv(lv, (struct wipe_params) { .do_zero = 1, .do_wipe_signatures = 1, - .yes = arg_count(cmd, yes_ARG), - .force = arg_count(cmd, force_ARG)})) { -@@ -5526,7 +5526,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - if (!archive(vg)) - goto_out; - -- if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, zero_vdopool)) -+ if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, vdo_pool_zero)) - goto_out; - - dm_list_init(&lvc.tags); diff --git a/SOURCES/lvm2-2_03_13-vdo-support-vdo_pool_header_size.patch b/SOURCES/lvm2-2_03_13-vdo-support-vdo_pool_header_size.patch deleted file mode 100644 index 63235b0..0000000 --- a/SOURCES/lvm2-2_03_13-vdo-support-vdo_pool_header_size.patch +++ /dev/null @@ -1,197 +0,0 @@ - conf/example.conf.in | 5 +++++ - lib/config/config_settings.h | 3 +++ - lib/config/defaults.h | 3 +-- - lib/metadata/lv_manip.c | 3 ++- - lib/metadata/metadata-exported.h | 5 ++++- - lib/metadata/vdo_manip.c | 13 ++++++++----- - tools/lvconvert.c | 6 ++++-- - tools/lvcreate.c | 2 +- - 8 files changed, 28 insertions(+), 12 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index aaf73a4..78547a6 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -734,6 +734,11 @@ allocation { - # The default and minimum is 1. The maximum is UINT_MAX / 4096. - # This configuration option has an automatic default value. - # vdo_max_discard = 1 -+ -+ # Configuration option allocation/vdo_pool_header_size. -+ # Specified the emptry header size in KiB at the front and end of vdo pool device. -+ # This configuration option has an automatic default value. -+ # vdo_pool_header_size = 512 - } - - # Configuration section log. -diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index f5dac4d..5217da8 100644 ---- a/lib/config/config_settings.h -+++ b/lib/config/config_settings.h -@@ -816,6 +816,9 @@ cfg(allocation_vdo_max_discard_CFG, "vdo_max_discard", allocation_CFG_SECTION, C - "increased latency for the individual discard requests.\n" - "The default and minimum is 1. The maximum is UINT_MAX / 4096.\n") - -+cfg(allocation_vdo_pool_header_size_CFG, "vdo_pool_header_size", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_POOL_HEADER_SIZE_KB, vsn(2, 3, 12), NULL, 0, NULL, -+ "Specified the emptry header size in KiB at the front and end of vdo pool device.\n") -+ - cfg(log_report_command_log_CFG, "report_command_log", log_CFG_SECTION, CFG_PROFILABLE | CFG_DEFAULT_COMMENTED | CFG_DISALLOW_INTERACTIVE, CFG_TYPE_BOOL, DEFAULT_COMMAND_LOG_REPORT, vsn(2, 2, 158), NULL, 0, NULL, - "Enable or disable LVM log reporting.\n" - "If enabled, LVM will collect a log of operations, messages,\n" -diff --git a/lib/config/defaults.h b/lib/config/defaults.h -index 2870dee..d5e5b3b 100644 ---- a/lib/config/defaults.h -+++ b/lib/config/defaults.h -@@ -181,8 +181,7 @@ - * VDO pool will reverve some sectors in the front and the back of pool device to avoid - * seeing same device twice in the system. - */ --#define DEFAULT_VDO_POOL_HEADER_SIZE (1024) // 512KiB -- -+#define DEFAULT_VDO_POOL_HEADER_SIZE_KB (512) - - - #define DEFAULT_FSADM_PATH FSADM_PATH -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 37dd361..43af474 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -8766,7 +8766,8 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, - } - - if (seg_is_vdo_pool(lp)) { -- if (!convert_vdo_pool_lv(lv, &lp->vdo_params, &lp->virtual_extents, 1)) { -+ if (!convert_vdo_pool_lv(lv, &lp->vdo_params, &lp->virtual_extents, -+ 1, lp->vdo_pool_header_size)) { - stack; - goto deactivate_and_revert_new_lv; - } -diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h -index 54bc0d0..adbbe76 100644 ---- a/lib/metadata/metadata-exported.h -+++ b/lib/metadata/metadata-exported.h -@@ -1033,6 +1033,7 @@ struct lvcreate_params { - int approx_alloc; /* all */ - alloc_policy_t alloc; /* all */ - struct dm_vdo_target_params vdo_params; /* vdo */ -+ uint64_t vdo_pool_header_size; /* VDO */ - - int raidintegrity; - const char *raidintegritymode; -@@ -1367,10 +1368,12 @@ int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_ - struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - const struct dm_vdo_target_params *vtp, - uint32_t *virtual_extents, -- int format); -+ int format, -+ uint64_t vdo_pool_header_size); - int set_vdo_write_policy(enum dm_vdo_write_policy *vwp, const char *policy); - int fill_vdo_target_params(struct cmd_context *cmd, - struct dm_vdo_target_params *vtp, -+ uint64_t *vdo_pool_header_size, - struct profile *profile); - /* -- metadata/vdo_manip.c */ - -diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c -index afc513a..3f2de1a 100644 ---- a/lib/metadata/vdo_manip.c -+++ b/lib/metadata/vdo_manip.c -@@ -356,9 +356,9 @@ static int _format_vdo_pool_data_lv(struct logical_volume *data_lv, - struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - const struct dm_vdo_target_params *vtp, - uint32_t *virtual_extents, -- int format) -+ int format, -+ uint64_t vdo_pool_header_size) - { -- const uint64_t header_size = DEFAULT_VDO_POOL_HEADER_SIZE; - const uint32_t extent_size = data_lv->vg->extent_size; - struct cmd_context *cmd = data_lv->vg->cmd; - struct logical_volume *vdo_pool_lv = data_lv; -@@ -379,7 +379,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - - if (*virtual_extents) - vdo_logical_size = -- _get_virtual_size(*virtual_extents, extent_size, header_size); -+ _get_virtual_size(*virtual_extents, extent_size, vdo_pool_header_size); - - if (!dm_vdo_validate_target_params(vtp, vdo_logical_size)) - return_0; -@@ -403,7 +403,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - return NULL; - } - -- vdo_logical_size -= 2 * header_size; -+ vdo_logical_size -= 2 * vdo_pool_header_size; - - if (vdo_logical_size < extent_size) { - if (!*virtual_extents) -@@ -426,7 +426,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - vdo_pool_seg = first_seg(vdo_pool_lv); - vdo_pool_seg->segtype = vdo_pool_segtype; - vdo_pool_seg->vdo_params = *vtp; -- vdo_pool_seg->vdo_pool_header_size = DEFAULT_VDO_POOL_HEADER_SIZE; -+ vdo_pool_seg->vdo_pool_header_size = vdo_pool_header_size; - vdo_pool_seg->vdo_pool_virtual_extents = *virtual_extents; - - vdo_pool_lv->status |= LV_VDO_POOL; -@@ -453,6 +453,7 @@ int set_vdo_write_policy(enum dm_vdo_write_policy *vwp, const char *policy) - - int fill_vdo_target_params(struct cmd_context *cmd, - struct dm_vdo_target_params *vtp, -+ uint64_t *vdo_pool_header_size, - struct profile *profile) - { - const char *policy; -@@ -501,5 +502,7 @@ int fill_vdo_target_params(struct cmd_context *cmd, - if (!set_vdo_write_policy(&vtp->write_policy, policy)) - return_0; - -+ *vdo_pool_header_size = 2 * find_config_tree_int64(cmd, allocation_vdo_pool_header_size_CFG, profile); -+ - return 1; - } -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index 8488596..f87ee78 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -5439,6 +5439,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - { - const char *vg_name = NULL; - unsigned int vdo_pool_zero; -+ uint64_t vdo_pool_header_size; - struct volume_group *vg = lv->vg; - struct logical_volume *vdo_lv; - struct dm_vdo_target_params vdo_params; /* vdo */ -@@ -5481,7 +5482,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - goto out; - } - -- if (!fill_vdo_target_params(cmd, &vdo_params, vg->profile)) -+ if (!fill_vdo_target_params(cmd, &vdo_params, &vdo_pool_header_size, vg->profile)) - goto_out; - - if (arg_is_set(cmd, compression_ARG)) -@@ -5526,7 +5527,8 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - if (!archive(vg)) - goto_out; - -- if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, vdo_pool_zero)) -+ if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, -+ vdo_pool_zero, vdo_pool_header_size)) - goto_out; - - dm_list_init(&lvc.tags); -diff --git a/tools/lvcreate.c b/tools/lvcreate.c -index a28f093..0def236 100644 ---- a/tools/lvcreate.c -+++ b/tools/lvcreate.c -@@ -1097,7 +1097,7 @@ static int _lvcreate_params(struct cmd_context *cmd, - - // FIXME: prefiling here - this is wrong place - // but will work for this moment -- if (!fill_vdo_target_params(cmd, &lp->vdo_params, NULL)) -+ if (!fill_vdo_target_params(cmd, &lp->vdo_params, &lp->vdo_pool_header_size, NULL)) - return_0; - - if (arg_is_set(cmd, compression_ARG)) diff --git a/SOURCES/lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch b/SOURCES/lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch deleted file mode 100644 index 62d6686..0000000 --- a/SOURCES/lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch +++ /dev/null @@ -1,28 +0,0 @@ - tools/vgmerge.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/tools/vgmerge.c b/tools/vgmerge.c -index 895018a..884ad4b 100644 ---- a/tools/vgmerge.c -+++ b/tools/vgmerge.c -@@ -92,6 +92,20 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to, - } - } - -+ if (vg_from->pool_metadata_spare_lv && -+ vg_to->pool_metadata_spare_lv) { -+ if (vg_from->pool_metadata_spare_lv->le_count > -+ vg_to->pool_metadata_spare_lv->le_count) -+ /* Preserve bigger pmspare from VG_FROM */ -+ lv = vg_to->pool_metadata_spare_lv; -+ else -+ lv = vg_from->pool_metadata_spare_lv; -+ -+ log_debug_metadata("Removing pool metadata spare %s.", display_lvname(lv)); -+ if (!lv_remove_single(cmd, lv, DONT_PROMPT, 0)) -+ return_ECMD_FAILED; -+ } -+ - if (!vgs_are_compatible(cmd, vg_from, vg_to)) - goto_bad; - diff --git a/SOURCES/lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch b/SOURCES/lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch deleted file mode 100644 index 002c060..0000000 --- a/SOURCES/lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch +++ /dev/null @@ -1,82 +0,0 @@ - WHATS_NEW | 2 +- - man/vgmerge.8_pregen | 9 +++++++++ - tools/command-lines.in | 2 +- - tools/vgmerge.c | 6 ++++++ - 4 files changed, 17 insertions(+), 2 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 0b8e3f2..5556789 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,6 +1,6 @@ - Version 2.03.13 - - =============================== -- Support --poolmetadataspare with vgsplit. -+ Support --poolmetadataspare with vgsplit and vgmerge. - Fix detection of active components of external origin volume. - Add vdoimport tool to support conversion of VDO volumes. - Support configurable allocation/vdo_pool_header_size. -diff --git a/man/vgmerge.8_pregen b/man/vgmerge.8_pregen -index 1264bb5..e229218 100644 ---- a/man/vgmerge.8_pregen -+++ b/man/vgmerge.8_pregen -@@ -27,6 +27,8 @@ of both VGs fit into the destination VG's limits. - .br - [ \fB-l\fP|\fB--list\fP ] - .br -+[ \fB--poolmetadataspare\fP \fBy\fP|\fBn\fP ] -+.br - [ COMMON_OPTIONS ] - .ad b - .RE -@@ -147,6 +149,13 @@ Display long help text. - Disable locking. - . - .HP -+\fB--poolmetadataspare\fP \fBy\fP|\fBn\fP -+.br -+Enable or disable the automatic creation and management of a -+spare pool metadata LV in the VG. A spare metadata LV is reserved -+space that can be used when repairing a pool. -+. -+.HP - \fB--profile\fP \fIString\fP - .br - An alias for --commandprofile or --metadataprofile, depending -diff --git a/tools/command-lines.in b/tools/command-lines.in -index a4785b3..0bc5a49 100644 ---- a/tools/command-lines.in -+++ b/tools/command-lines.in -@@ -1847,7 +1847,7 @@ DESC: Add devices from all accessible VGs to the devices file. - --- - - vgmerge VG VG --OO: --autobackup Bool, --list -+OO: --autobackup Bool, --list, --poolmetadataspare Bool - ID: vgmerge_general - - --- -diff --git a/tools/vgmerge.c b/tools/vgmerge.c -index 884ad4b..08615cd 100644 ---- a/tools/vgmerge.c -+++ b/tools/vgmerge.c -@@ -64,6 +64,8 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to, - struct lv_list *lvl1, *lvl2; - int r = ECMD_FAILED; - int lock_vg_from_first = 0; -+ struct logical_volume *lv; -+ int poolmetadataspare = arg_int_value(cmd, poolmetadataspare_ARG, DEFAULT_POOL_METADATA_SPARE); - - if (!strcmp(vg_name_to, vg_name_from)) { - log_error("Duplicate volume group name \"%s\"", vg_name_from); -@@ -185,6 +187,10 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to, - /* Flag up that some PVs have moved from another VG */ - vg_to->old_name = vg_from->name; - -+ /* Check whether size of pmspare is big enough now for merged VG */ -+ if (!handle_pool_metadata_spare(vg_to, 0, &vg_to->pvs, poolmetadataspare)) -+ goto_bad; -+ - /* store it on disks */ - log_verbose("Writing out updated volume group"); - if (!vg_write(vg_to) || !vg_commit(vg_to)) diff --git a/SOURCES/lvm2-2_03_13-vgremove-remove-forgotten-pmspare.patch b/SOURCES/lvm2-2_03_13-vgremove-remove-forgotten-pmspare.patch deleted file mode 100644 index 53fa667..0000000 --- a/SOURCES/lvm2-2_03_13-vgremove-remove-forgotten-pmspare.patch +++ /dev/null @@ -1,18 +0,0 @@ - tools/vgremove.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/tools/vgremove.c b/tools/vgremove.c -index 8f73297..b6685ae 100644 ---- a/tools/vgremove.c -+++ b/tools/vgremove.c -@@ -65,6 +65,10 @@ static int _vgremove_single(struct cmd_context *cmd, const char *vg_name, - } - } - -+ if (vg->pool_metadata_spare_lv && -+ !lvremove_single(cmd, vg->pool_metadata_spare_lv, &void_handle)) -+ return_ECMD_FAILED; -+ - if (!lockd_free_vg_before(cmd, vg, 0)) - return_ECMD_FAILED; - diff --git a/SOURCES/lvm2-2_03_13-vgsplit-add-support-for-option-poolmetadataspare.patch b/SOURCES/lvm2-2_03_13-vgsplit-add-support-for-option-poolmetadataspare.patch deleted file mode 100644 index 1a9d26b..0000000 --- a/SOURCES/lvm2-2_03_13-vgsplit-add-support-for-option-poolmetadataspare.patch +++ /dev/null @@ -1,106 +0,0 @@ - WHATS_NEW | 1 + - lib/metadata/pool_manip.c | 11 +++++++++++ - man/vgsplit.8_pregen | 9 +++++++++ - tools/command-lines.in | 2 +- - tools/vgsplit.c | 8 ++++++++ - 5 files changed, 30 insertions(+), 1 deletion(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 097160e..0b8e3f2 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.13 - - =============================== -+ Support --poolmetadataspare with vgsplit. - Fix detection of active components of external origin volume. - Add vdoimport tool to support conversion of VDO volumes. - Support configurable allocation/vdo_pool_header_size. -diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c -index 9ceec3a..e451e92 100644 ---- a/lib/metadata/pool_manip.c -+++ b/lib/metadata/pool_manip.c -@@ -722,6 +722,17 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - return 1; - } - -+ if (!extents) { -+ /* pmspare is not needed */ -+ if (lv) { -+ log_debug_metadata("Dropping unused pool metadata spare LV %s.", -+ display_lvname(lv)); -+ if (!lv_remove_single(vg->cmd, lv, DONT_PROMPT, 0)) -+ return_0; -+ } -+ return 1; -+ } -+ - if (extents > MAX_SIZE) - extents = MAX_SIZE; - -diff --git a/man/vgsplit.8_pregen b/man/vgsplit.8_pregen -index 331c6e4..8a0ae59 100644 ---- a/man/vgsplit.8_pregen -+++ b/man/vgsplit.8_pregen -@@ -70,6 +70,8 @@ Common options for command: - .hy - ] - .br -+[ \fB--poolmetadataspare\fP \fBy\fP|\fBn\fP ] -+.br - [ \fB--\fP[\fBvg\fP]\fBmetadatacopies\fP \fBall\fP|\fBunmanaged\fP|\fINumber\fP ] - .ad b - .RE -@@ -235,6 +237,13 @@ Move only PVs used by the named LV. - Disable locking. - . - .HP -+\fB--poolmetadataspare\fP \fBy\fP|\fBn\fP -+.br -+Enable or disable the automatic creation and management of a -+spare pool metadata LV in the VG. A spare metadata LV is reserved -+space that can be used when repairing a pool. -+. -+.HP - \fB--profile\fP \fIString\fP - .br - An alias for --commandprofile or --metadataprofile, depending -diff --git a/tools/command-lines.in b/tools/command-lines.in -index 8607305..a4785b3 100644 ---- a/tools/command-lines.in -+++ b/tools/command-lines.in -@@ -1912,7 +1912,7 @@ ID: vgscan_general - - --- - --OO_VGSPLIT: --autobackup Bool -+OO_VGSPLIT: --autobackup Bool, --poolmetadataspare Bool - - # used only when the destination VG is new - OO_VGSPLIT_NEW: --alloc Alloc, -diff --git a/tools/vgsplit.c b/tools/vgsplit.c -index 296248e..a085ac2 100644 ---- a/tools/vgsplit.c -+++ b/tools/vgsplit.c -@@ -525,6 +525,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv) - int existing_vg = 0; - int r = ECMD_FAILED; - const char *lv_name; -+ int poolmetadataspare = arg_int_value(cmd, poolmetadataspare_ARG, DEFAULT_POOL_METADATA_SPARE); - - if ((arg_is_set(cmd, name_ARG) + argc) < 3) { - log_error("Existing VG, new VG and either physical volumes " -@@ -699,6 +700,13 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv) - */ - vg_to->status |= EXPORTED_VG; - -+ -+ if (!handle_pool_metadata_spare(vg_to, 0, &vg_to->pvs, poolmetadataspare)) -+ goto_bad; -+ -+ if (!handle_pool_metadata_spare(vg_from, 0, &vg_from->pvs, poolmetadataspare)) -+ goto_bad; -+ - if (!archive(vg_to)) - goto_bad; - diff --git a/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch b/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch deleted file mode 100644 index 1457f7f..0000000 --- a/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch +++ /dev/null @@ -1,23 +0,0 @@ - tools/pvmove.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/tools/pvmove.c b/tools/pvmove.c -index da635a6..bb372f7 100644 ---- a/tools/pvmove.c -+++ b/tools/pvmove.c -@@ -387,6 +387,15 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd, - return NULL; - } - -+ if (lv_is_writecache(lv)) { -+ struct logical_volume *lv_cachevol = first_seg(lv)->writecache; -+ if (lv_is_on_pvs(lv_cachevol, source_pvl)) { -+ log_error("Unable to move device used for writecache cachevol %s.", display_lvname(lv_cachevol)); -+ return NULL; -+ } -+ -+ } -+ - if (lv_is_raid(lv) && lv_raid_has_integrity(lv)) { - log_error("Unable to pvmove device used for raid with integrity."); - return NULL; diff --git a/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch b/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch deleted file mode 100644 index b926cac..0000000 --- a/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch +++ /dev/null @@ -1,17 +0,0 @@ - lib/metadata/metadata.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c -index 002d80c..1f65045 100644 ---- a/lib/metadata/metadata.c -+++ b/lib/metadata/metadata.c -@@ -4402,6 +4402,9 @@ int lv_on_pmem(struct logical_volume *lv) - - dm_list_iterate_items(seg, &lv->segments) { - for (s = 0; s < seg->area_count; s++) { -+ if (seg_type(seg, s) != AREA_PV) -+ continue; -+ - pv = seg_pv(seg, s); - - if (dev_is_pmem(lv->vg->cmd->dev_types, pv->dev)) { diff --git a/SOURCES/lvm2-2_03_14-tests-check-lvm2-parses-vdo-statistics.patch b/SOURCES/lvm2-2_03_14-tests-check-lvm2-parses-vdo-statistics.patch deleted file mode 100644 index 1adbfdd..0000000 --- a/SOURCES/lvm2-2_03_14-tests-check-lvm2-parses-vdo-statistics.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 155d8c55086b09528de799425e77f7aeafd9b165 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Thu, 9 Sep 2021 15:22:20 +0200 -Subject: [PATCH 2/5] tests: check lvm2 parses vdo statistics - -(cherry picked from commit bd2dae464386033241afa35934cdeddfe47f6a77) ---- - test/shell/lvcreate-vdo.sh | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/test/shell/lvcreate-vdo.sh b/test/shell/lvcreate-vdo.sh -index d66e353..5b370fb 100644 ---- a/test/shell/lvcreate-vdo.sh -+++ b/test/shell/lvcreate-vdo.sh -@@ -47,6 +47,7 @@ fi - check lv_field $vg/$lv1 size "<1.24g" - check lv_field $vg/${lv2} size "4.00g" - check lv_field $vg/${lv2}_vdata size "4.00g" -+check lv_field $vg/${lv1} data_percent "0.00" - lvremove -ff $vg - - --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch b/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch deleted file mode 100644 index 2250e1c..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch +++ /dev/null @@ -1,1137 +0,0 @@ - WHATS_NEW | 4 + - configure | 6 +- - configure.ac | 8 +- - include/configure.h.in | 2 +- - man/Makefile.in | 2 +- - man/lvm_import_vdo.8_main | 92 ++++++++++++ - man/vdoimport.8_main | 92 ------------ - scripts/Makefile.in | 2 +- - scripts/lvm_import_vdo.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++ - scripts/vdoimport.sh | 376 ---------------------------------------------- - test/Makefile.in | 2 +- - test/shell/vdo-convert.sh | 12 +- - 12 files changed, 489 insertions(+), 485 deletions(-) - create mode 100644 man/lvm_import_vdo.8_main - delete mode 100644 man/vdoimport.8_main - create mode 100755 scripts/lvm_import_vdo.sh - delete mode 100755 scripts/vdoimport.sh - -diff --git a/WHATS_NEW b/WHATS_NEW -index 5556789..3637e31 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,3 +1,7 @@ -+Version 2.03.14 - -+================================== -+ Rename vdoimport to lvm_import_vdo. -+ - Version 2.03.13 - - =============================== - Support --poolmetadataspare with vgsplit and vgmerge. -diff --git a/configure b/configure -index 661702d..897a810 100755 ---- a/configure -+++ b/configure -@@ -12379,8 +12379,8 @@ $as_echo "$FSADM" >&6; } - - - ################################################################################ --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5 --$as_echo_n "checking whether to install vdoimport... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install lvm_import_vdo" >&5 -+$as_echo_n "checking whether to install lvm_import_vdo... " >&6; } - # Check whether --enable-vdoimport was given. - if test "${enable_vdoimport+set}" = set; then : - enableval=$enable_vdoimport; VDOIMPORT=$enableval -@@ -13875,7 +13875,7 @@ cat >>confdefs.h <<_ACEOF - _ACEOF - - --VDOIMPORT_PATH="$SBINDIR/vdoimport" -+VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" - - cat >>confdefs.h <<_ACEOF - #define VDOIMPORT_PATH "$VDOIMPORT_PATH" -diff --git a/configure.ac b/configure.ac -index 5a8b486..f769a63 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1295,8 +1295,8 @@ AC_MSG_RESULT($FSADM) - - - ################################################################################ --dnl -- Enable vdoimport --AC_MSG_CHECKING(whether to install vdoimport) -+dnl -- Enable lvm_import_vdo -+AC_MSG_CHECKING(whether to install lvm_import_vdo) - AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]), - VDOIMPORT=$enableval) - AC_MSG_RESULT($VDOIMPORT) -@@ -1656,8 +1656,8 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))" - FSADM_PATH="$SBINDIR/fsadm" - AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.]) - --VDOIMPORT_PATH="$SBINDIR/vdoimport" --AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.]) -+VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" -+AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to lvm_import_vdo binary.]) - - ################################################################################ - dnl -- dmeventd pidfile and executable path -diff --git a/include/configure.h.in b/include/configure.h.in -index 6df8d89..028ae48 100644 ---- a/include/configure.h.in -+++ b/include/configure.h.in -@@ -684,7 +684,7 @@ - /* Enable a valgrind aware build of pool */ - #undef VALGRIND_POOL - --/* Path to vdoimport binary. */ -+/* Path to lvm_import_vdo binary. */ - #undef VDOIMPORT_PATH - - /* The path to 'vdoformat', if available. */ -diff --git a/man/Makefile.in b/man/Makefile.in -index d60a92c..45ebf54 100644 ---- a/man/Makefile.in -+++ b/man/Makefile.in -@@ -23,7 +23,7 @@ else - endif - - FSADMMAN = fsadm.8 --VDOIMPORTMAN = vdoimport.8 -+VDOIMPORTMAN = lvm_import_vdo.8 - BLKDEACTIVATEMAN = blkdeactivate.8 - DMEVENTDMAN = dmeventd.8 - DMFILEMAPDMAN = dmfilemapd.8 -diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main -new file mode 100644 -index 0000000..ee817a0 ---- /dev/null -+++ b/man/lvm_import_vdo.8_main -@@ -0,0 +1,92 @@ -+.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" -+. -+.SH "NAME" -+. -+lvm_import_vdo \(em utility to import VDO volumes into a new volume group. -+. -+.SH SYNOPSIS -+. -+.PD 0 -+.ad l -+.TP 10 -+.B lvm_import_vdo -+.RI [ options ] -+.IR device -+. -+.PD -+. -+.SH DESCRIPTION -+. -+lvm_import_vdo utility imports VDO volumes created and managed by -+.BR vdo (8) -+manager into -+.BR lvm2 (8) -+managed VDO LV. This is realized by moving VDO superblock by 2MiB -+and creating lvm2 metadata at the front of this device. The operation is not reversible, -+thus after conversion to lvm2 the access to VDO data is only possible with -+.BR lvm2 (8) -+commands, -+.BR vdo (8) -+manager no longer control such volume. -+. -+.SH OPTIONS -+. -+.TP -+.BR -f | --force -+Bypass some sanity checks. -+. -+.TP -+.BR -h | --help -+Display the help text. -+. -+.TP -+.BR -n | --name -+Specifies the name of converted VDO LV. When the name is not specified, -+some automatic name is selected. In case the converted VDO volume is -+already using LV a backend device, the name of this LV is used for VDO LV. -+In this case also the of volume group must stay same. -+. -+.TP -+.BR -v | --verbose -+Be more verbose. -+. -+.TP -+.BR -y | --yes -+Answer "yes" at any prompts. -+. -+.TP -+.BR --dry-run -+Print commands without running them. -+. -+. -+.SH DIAGNOSTICS -+. -+On successful completion, the status code is 0. -+A status code of 1 is used for failure. -+. -+.SH EXAMPLES -+. -+Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. -+.P -+# -+.B lvm_import_vdo --name VG1/LV1 /dev/mapper/vdo-volume -+. -+.SH ENVIRONMENT VARIABLES -+. -+.TP -+.B TMPDIR -+The temporary directory name for mount points. Defaults to "\fI/tmp\fP". -+.TP -+.B DM_DEV_DIR -+The device directory name. -+Defaults to "\fI/dev\fP" and must be an absolute path. -+. -+.SH SEE ALSO -+. -+.nh -+.ad l -+.BR lvm (8), -+.BR lvm.conf (5), -+.P -+.BR vdo (8), -+.BR vdo2lvm (8), -diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main -deleted file mode 100644 -index 1f32909..0000000 ---- a/man/vdoimport.8_main -+++ /dev/null -@@ -1,92 +0,0 @@ --.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" --. --.SH "NAME" --. --vdoimport \(em utility to import VDO volumes into a new volume group. --. --.SH SYNOPSIS --. --.PD 0 --.ad l --.TP 10 --.B vdoimport --.RI [ options ] --.IR device --. --.PD --. --.SH DESCRIPTION --. --vdoimport utility imports VDO volumes created and managed by --.BR vdo (8) --manager into --.BR lvm2 (8) --managed VDO LV. This is realized by moving VDO superblock by 2MiB --and creating lvm2 metadata at the front of this device. The operation is not reversible, --thus after conversion to lvm2 the access to VDO data is only possible with --.BR lvm2 (8) --commands, --.BR vdo (8) --manager no longer control such volume. --. --.SH OPTIONS --. --.TP --.BR -f | --force --Bypass some sanity checks. --. --.TP --.BR -h | --help --Display the help text. --. --.TP --.BR -n | --name --Specifies the name of converted VDO LV. When the name is not specified, --some automatic name is selected. In case the converted VDO volume is --already using LV a backend device, the name of this LV is used for VDO LV. --In this case also the of volume group must stay same. --. --.TP --.BR -v | --verbose --Be more verbose. --. --.TP --.BR -y | --yes --Answer "yes" at any prompts. --. --.TP --.BR --dry-run --Print commands without running them. --. --. --.SH DIAGNOSTICS --. --On successful completion, the status code is 0. --A status code of 1 is used for failure. --. --.SH EXAMPLES --. --Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. --.P --# --.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume --. --.SH ENVIRONMENT VARIABLES --. --.TP --.B TMPDIR --The temporary directory name for mount points. Defaults to "\fI/tmp\fP". --.TP --.B DM_DEV_DIR --The device directory name. --Defaults to "\fI/dev\fP" and must be an absolute path. --. --.SH SEE ALSO --. --.nh --.ad l --.BR lvm (8), --.BR lvm.conf (5), --.P --.BR vdo (8), --.BR vdo2lvm (8), -diff --git a/scripts/Makefile.in b/scripts/Makefile.in -index 1fe88ca..f16c37d 100644 ---- a/scripts/Makefile.in -+++ b/scripts/Makefile.in -@@ -32,7 +32,7 @@ ifeq ("@FSADM@", "yes") - endif - - ifeq ("@VDOIMPORT@", "yes") -- LVM_SCRIPTS += vdoimport.sh -+ LVM_SCRIPTS += lvm_import_vdo.sh - endif - - ifeq ("@BLKDEACTIVATE@", "yes") -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -new file mode 100755 -index 0000000..35140a0 ---- /dev/null -+++ b/scripts/lvm_import_vdo.sh -@@ -0,0 +1,376 @@ -+#!/bin/bash -+# -+# Copyright (C) 2021 Red Hat, Inc. All rights reserved. -+# -+# This file is part of LVM2. -+# -+# 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 -+# -+# Author: Zdenek Kabelac -+# -+# Script for converting VDO volumes to lvm2 VDO LVs -+# -+# Needed utilities: -+# lvm, dmsetup, -+# vdo, vdo2lvm, -+# grep, awk, sed, blockdev, readlink, mkdir -+# -+# Conversion is using 'vdo convert' support from VDO manager to move -+# existing VDO header by 2M which makes space to place in PV header -+# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. -+# -+ -+set -euE -o pipefail -+ -+TOOL=lvm_import_vdo -+ -+_SAVEPATH=$PATH -+PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" -+ -+# user may override lvm location by setting LVM_BINARY -+LVM=${LVM_BINARY:-lvm} -+VDO=${VDO_BINARY:-vdo} -+VDOCONF=${VDOCONF:-} -+BLOCKDEV="blockdev" -+READLINK="readlink" -+READLINK_E="-e" -+MKDIR="mkdir" -+ -+TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" -+DM_DEV_DIR="${DM_DEV_DIR:-/dev}" -+ -+DRY=0 -+VERB="" -+FORCE="" -+YES="" -+ -+# default name for converted VG and its VDO LV -+NAME="vdovg/vdolvol" -+ -+# help message -+tool_usage() { -+ echo "${TOOL}: Utility to convert VDO volume to VDO LV." -+ echo -+ echo " ${TOOL} [options] " -+ echo -+ echo " Options:" -+ echo " -f | --force Bypass sanity checks" -+ echo " -h | --help Show this help message" -+ echo " -n | --name Specifies VG/LV name for converted VDO volume" -+ echo " -v | --verbose Be verbose" -+ echo " -y | --yes Answer \"yes\" at any prompts" -+ echo " --dry-run Print commands without running them" -+ -+ exit -+} -+ -+verbose() { -+ test -z "$VERB" || echo "$TOOL:" "$@" -+} -+ -+# Support multi-line error messages -+error() { -+ for i in "$@" ; do -+ echo "$TOOL: $i" >&2 -+ done -+ cleanup 1 -+} -+ -+dry() { -+ if [ "$DRY" -ne 0 ]; then -+ verbose "Dry execution" "$@" -+ return 0 -+ fi -+ verbose "Executing" "$@" -+ "$@" -+} -+ -+cleanup() { -+ trap '' 2 -+ -+ rm -rf "$TEMPDIR" -+ # error exit status for break -+ exit "${1:-1}" -+} -+ -+get_enabled_value_() { -+ case "$1" in -+ enabled) echo "1" ;; -+ *) echo "0" ;; -+ esac -+} -+ -+get_kb_size_with_unit_() { -+ case "$1" in -+ *[kK]) echo $(( ${1%[kK]} )) ;; -+ *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; -+ *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; -+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; -+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; -+ esac -+} -+ -+get_mb_size_with_unit_() { -+ case "$1" in -+ *[mM]) echo $(( ${1%[mM]} )) ;; -+ *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; -+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; -+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; -+ esac -+} -+ -+# Figure out largest possible extent size usable for VG -+# $1 physical size -+# $2 logical size -+get_largest_extent_size_() { -+ local max=4 -+ local i -+ local d -+ -+ for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do -+ d=$(( $1 / i )) -+ test $(( d * i )) -eq "$1" || break -+ d=$(( $2 / i )) -+ test $(( d * i )) -eq "$2" || break -+ max=$i -+ done -+ echo "$max" -+} -+ -+# detect LV on the given device -+# dereference device name if it is symbolic link -+detect_lv_() { -+ local DEVICE=$1 -+ local MAJOR -+ local MINOR -+ local SYSVOLUME -+ local MAJORMINOR -+ -+ DEVICE=${1/#"${DM_DEV_DIR}/"/} -+ DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") -+ test -n "$DEVICE" || error "Cannot get readlink \"$1\"." -+ RDEVICE=$DEVICE -+ case "$RDEVICE" in -+ # hardcoded /dev since udev does not create these entries elsewhere -+ /dev/dm-[0-9]*) -+ read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" -+ read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." -+ MAJOR=${MAJORMINOR%%:*} -+ MINOR=${MAJORMINOR##*:} -+ ;; -+ *) -+ STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") -+ test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." -+ eval "$STAT" -+ ;; -+ esac -+ -+ eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" -+} -+ -+# parse yaml config files into 'prefix_yaml_part_names=("value")' strings -+parse_yaml_() { -+ local yaml_file=$1 -+ local prefix=$2 -+ local s -+ local w -+ local fs -+ -+ s='[[:space:]]*' -+ w='[a-zA-Z0-9_.-]*' -+ fs="$(echo @|tr @ '\034')" -+ -+ ( -+ sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ -+ -e 's/\$/\\\$/g' \ -+ -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ -+ -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -+ -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | -+ -+ awk -F"$fs" '{ -+ indent = length($1)/2; -+ if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} -+ vname[indent] = $2; -+ for (i in vname) {if (i > indent) {delete vname[i]}} -+ if (length($3) > 0) { -+ vn=""; for (i=0; i"$TEMPDIR/vdoconf.yml" -+ -+ VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") -+ TRVDONAME=$(echo "$VDONAME" | tr '-' '_') -+ -+ # When VDO volume is 'active', check it's not mounted/being used -+ eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" -+ test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" -+ -+ #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ -+ eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" -+ -+ vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") -+ vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") -+ -+ verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." -+ verbose "With logical volume of size $vdo_logicalSize KiB." -+ -+ PARAMS=$(cat < --# --# Script for converting VDO volumes to lvm2 VDO LVs --# --# Needed utilities: --# lvm, dmsetup, --# vdo, vdo2lvm, --# grep, awk, sed, blockdev, readlink, mkdir --# --# Conversion is using 'vdo convert' support from VDO manager to move --# existing VDO header by 2M which makes space to place in PV header --# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. --# -- --set -euE -o pipefail -- --TOOL=vdoimport -- --_SAVEPATH=$PATH --PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" -- --# user may override lvm location by setting LVM_BINARY --LVM=${LVM_BINARY:-lvm} --VDO=${VDO_BINARY:-vdo} --VDOCONF=${VDOCONF:-} --BLOCKDEV="blockdev" --READLINK="readlink" --READLINK_E="-e" --MKDIR="mkdir" -- --TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" --DM_DEV_DIR="${DM_DEV_DIR:-/dev}" -- --DRY=0 --VERB="" --FORCE="" --YES="" -- --# default name for converted VG and its VDO LV --NAME="vdovg/vdolvol" -- --# help message --tool_usage() { -- echo "${TOOL}: Utility to convert VDO volume to VDO LV." -- echo -- echo " ${TOOL} [options] " -- echo -- echo " Options:" -- echo " -f | --force Bypass sanity checks" -- echo " -h | --help Show this help message" -- echo " -n | --name Specifies VG/LV name for converted VDO volume" -- echo " -v | --verbose Be verbose" -- echo " -y | --yes Answer \"yes\" at any prompts" -- echo " --dry-run Print commands without running them" -- -- exit --} -- --verbose() { -- test -z "$VERB" || echo "$TOOL:" "$@" --} -- --# Support multi-line error messages --error() { -- for i in "$@" ; do -- echo "$TOOL: $i" >&2 -- done -- cleanup 1 --} -- --dry() { -- if [ "$DRY" -ne 0 ]; then -- verbose "Dry execution" "$@" -- return 0 -- fi -- verbose "Executing" "$@" -- "$@" --} -- --cleanup() { -- trap '' 2 -- -- rm -rf "$TEMPDIR" -- # error exit status for break -- exit "${1:-1}" --} -- --get_enabled_value_() { -- case "$1" in -- enabled) echo "1" ;; -- *) echo "0" ;; -- esac --} -- --get_kb_size_with_unit_() { -- case "$1" in -- *[kK]) echo $(( ${1%[kK]} )) ;; -- *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; -- *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; -- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; -- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; -- esac --} -- --get_mb_size_with_unit_() { -- case "$1" in -- *[mM]) echo $(( ${1%[mM]} )) ;; -- *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; -- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; -- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; -- esac --} -- --# Figure out largest possible extent size usable for VG --# $1 physical size --# $2 logical size --get_largest_extent_size_() { -- local max=4 -- local i -- local d -- -- for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do -- d=$(( $1 / i )) -- test $(( d * i )) -eq "$1" || break -- d=$(( $2 / i )) -- test $(( d * i )) -eq "$2" || break -- max=$i -- done -- echo "$max" --} -- --# detect LV on the given device --# dereference device name if it is symbolic link --detect_lv_() { -- local DEVICE=$1 -- local MAJOR -- local MINOR -- local SYSVOLUME -- local MAJORMINOR -- -- DEVICE=${1/#"${DM_DEV_DIR}/"/} -- DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") -- test -n "$DEVICE" || error "Cannot get readlink \"$1\"." -- RDEVICE=$DEVICE -- case "$RDEVICE" in -- # hardcoded /dev since udev does not create these entries elsewhere -- /dev/dm-[0-9]*) -- read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" -- read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." -- MAJOR=${MAJORMINOR%%:*} -- MINOR=${MAJORMINOR##*:} -- ;; -- *) -- STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") -- test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." -- eval "$STAT" -- ;; -- esac -- -- eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" --} -- --# parse yaml config files into 'prefix_yaml_part_names=("value")' strings --parse_yaml_() { -- local yaml_file=$1 -- local prefix=$2 -- local s -- local w -- local fs -- -- s='[[:space:]]*' -- w='[a-zA-Z0-9_.-]*' -- fs="$(echo @|tr @ '\034')" -- -- ( -- sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ -- -e 's/\$/\\\$/g' \ -- -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ -- -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -- -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | -- -- awk -F"$fs" '{ -- indent = length($1)/2; -- if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} -- vname[indent] = $2; -- for (i in vname) {if (i > indent) {delete vname[i]}} -- if (length($3) > 0) { -- vn=""; for (i=0; i"$TEMPDIR/vdoconf.yml" -- -- VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") -- TRVDONAME=$(echo "$VDONAME" | tr '-' '_') -- -- # When VDO volume is 'active', check it's not mounted/being used -- eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" -- test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" -- -- #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ -- eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" -- -- vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") -- vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") -- -- verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." -- verbose "With logical volume of size $vdo_logicalSize KiB." -- -- PARAMS=$(cat < -Date: Wed, 1 Sep 2021 15:46:04 +0200 -Subject: [PATCH 3/5] vdo: better message for missing device - -Show readable message when passed device cannot be accessed. -And use STAT shell var wrapper to call 'stat' command. - -(cherry picked from commit 3287d37f440ca272b52f900fc60ee5effcf73697) - -Conflicts: - scripts/lvm_import_vdo.sh ---- - scripts/lvm_import_vdo.sh | 21 +++++++++++---------- - 1 file changed, 11 insertions(+), 10 deletions(-) - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index f8dd71f..dec32bc 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -18,8 +18,8 @@ - # - # Needed utilities: - # lvm, dmsetup, --# vdo, vdo2lvm, --# grep, awk, sed, blockdev, readlink, mkdir -+# vdo, -+# grep, awk, sed, blockdev, readlink, stat, mkdir - # - # Conversion is using 'vdo convert' support from VDO manager to move - # existing VDO header by 2M which makes space to place in PV header -@@ -40,6 +40,7 @@ VDOCONF=${VDOCONF:-} - BLOCKDEV="blockdev" - READLINK="readlink" - READLINK_E="-e" -+STAT="stat" - MKDIR="mkdir" - DMSETUP="dmsetup" - -@@ -156,8 +157,8 @@ detect_lv_() { - local MAJORMINOR - - DEVICE=${1/#"${DM_DEV_DIR}/"/} -- DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") -- test -n "$DEVICE" || error "Cannot get readlink \"$1\"." -+ DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE" || true) -+ test -n "$DEVICE" || error "Readlink cannot access device \"$1\"." - RDEVICE=$DEVICE - case "$RDEVICE" in - # hardcoded /dev since udev does not create these entries elsewhere -@@ -168,9 +169,9 @@ detect_lv_() { - DEVMINOR=${MAJORMINOR##*:} - ;; - *) -- STAT=$(stat --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE") -- test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." -- eval "$STAT" -+ RSTAT=$("$STAT" --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE" || true) -+ test -n "$RSTAT" || error "Cannot get major:minor for \"$DEVICE\"." -+ eval "$RSTAT" - ;; - esac - -@@ -269,8 +270,8 @@ convert2lvm_() { - for i in $(awk '/.*device:/ {print $2}' "$TEMPDIR/vdoconf.yml") ; do - local DEV - DEV=$("$READLINK" $READLINK_E "$i") || continue -- STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue -- eval "$STAT" -+ RSTAT=$("$STAT" --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue -+ eval "$RSTAT" - test "$MAJOR" = "$DEVMAJOR" && test "$MINOR" = "$DEVMINOR" && { - test -z "$FOUND" || error "VDO configuration contains duplicate entries $FOUND and $i" - FOUND=$i -@@ -287,7 +288,7 @@ convert2lvm_() { - DM_OPEN="$("$DMSETUP" info -c -o open "$VDONAME" --noheadings --nameprefixes 2>/dev/null || true)" - case "$DM_OPEN" in - Device*) ;; # no devices -- *) eval "$DM_OPEN" -+ *) eval "$DM_OPEN" - test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" - ;; - esac --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-fix-conversion-of-large-virtual-sizes.patch b/SOURCES/lvm2-2_03_14-vdo-fix-conversion-of-large-virtual-sizes.patch deleted file mode 100644 index 9899966..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-fix-conversion-of-large-virtual-sizes.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 70467e905cea0811c269faf7e84f24d4e1c758cc Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Mon, 30 Aug 2021 18:12:59 +0200 -Subject: [PATCH 5/5] vdo: fix conversion of large virtual sizes - -Properly accept virtual sizes above 2TiB. - -(cherry picked from commit 4afe872fd6c43fcfcd519c862574d010cdbda653) ---- - tools/lvconvert.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index f87ee78..518b48f 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -5462,7 +5462,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, - return_0; - - lvc.virtual_extents = extents_from_size(cmd, -- arg_uint_value(cmd, virtualsize_ARG, 0), -+ arg_uint64_value(cmd, virtualsize_ARG, UINT64_C(0)), - vg->extent_size); - - if (!(lvc.segtype = get_segtype_from_string(cmd, SEG_TYPE_NAME_VDO))) --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-fixes.patch b/SOURCES/lvm2-2_03_14-vdo-fixes.patch deleted file mode 100644 index ac6acb5..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-fixes.patch +++ /dev/null @@ -1,256 +0,0 @@ -From 5d0756fc33bced8453fb5cf5807c5a3fa2b59dbb Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Tue, 31 Aug 2021 20:52:26 +0200 -Subject: [PATCH 1/5] vdo: fixes - -Better identify VDO device with major:minor. -Handle different LV name from originally converted origin LV. -Improve --dry-run handling. - -(cherry picked from commit 1ae157a0f67e984ef3037d19d62b84a3b0201c84) ---- - WHATS_NEW | 4 +++ - scripts/lvm_import_vdo.sh | 70 +++++++++++++++++++++++++++++++++++------------ - test/shell/vdo-convert.sh | 28 ++++++++++++++----- - 3 files changed, 78 insertions(+), 24 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 3637e31..b751009 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,9 @@ - Version 2.03.14 - - ================================== -+ Improve lvm_import_vdo script. -+ Support VDO LV with lvcreate -ky. -+ Fix lvconvert for VDO LV bigger then 2T. -+ Create VDO LVs automatically without zeroing. - Rename vdoimport to lvm_import_vdo. - - Version 2.03.13 - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index 35140a0..bc73306 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -41,10 +41,15 @@ BLOCKDEV="blockdev" - READLINK="readlink" - READLINK_E="-e" - MKDIR="mkdir" -+DMSETUP="dmsetup" - - TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" - DM_DEV_DIR="${DM_DEV_DIR:-/dev}" - -+DEVICENAME="" -+DEVMAJOR=0 -+DEVMINOR=0 -+ - DRY=0 - VERB="" - FORCE="" -@@ -147,8 +152,6 @@ get_largest_extent_size_() { - # dereference device name if it is symbolic link - detect_lv_() { - local DEVICE=$1 -- local MAJOR -- local MINOR - local SYSVOLUME - local MAJORMINOR - -@@ -161,17 +164,21 @@ detect_lv_() { - /dev/dm-[0-9]*) - read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" - read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." -- MAJOR=${MAJORMINOR%%:*} -- MINOR=${MAJORMINOR##*:} -+ DEVMAJOR=${MAJORMINOR%%:*} -+ DEVMINOR=${MAJORMINOR##*:} - ;; - *) -- STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") -+ STAT=$(stat --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE") - test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." - eval "$STAT" - ;; - esac - -- eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" -+ DEV="$("$DMSETUP" info -c -j "$DEVMAJOR" -m "$DEVMINOR" -o uuid,name --noheadings --nameprefixes --separator ' ' 2>/dev/null)" -+ case "$DEV" in -+ Device*) ;; # no devices -+ *) eval "$DEV" ;; -+ esac - } - - # parse yaml config files into 'prefix_yaml_part_names=("value")' strings -@@ -226,20 +233,26 @@ convert2lvm_() { - local TRVDONAME - local EXTENTSZ - local IS_LV=1 -+ local FOUND="" -+ local MAJOR=0 -+ local MINOR=0 -+ local DM_VG_NAME -+ local DM_LV_NAME - - DM_UUID="" - detect_lv_ "$DEVICE" - case "$DM_UUID" in -- LVM-*) eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" -+ LVM-*) eval "$("$DMSETUP" splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" - if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then - VGNAME=$DM_VG_NAME -+ LVNAME=$DM_LV_NAME - elif test "$VGNAME" != "$DM_VG_NAME" ; then - error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"." - fi - ;; - *) IS_LV=0 - # Check $VGNANE does not already exists -- "$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"." -+ "$LVM" vgs "$VGNAME" >/dev/null 2>&1 && error "Cannot use already existing volume group name \"$VGNAME\"." - ;; - esac - -@@ -247,15 +260,37 @@ convert2lvm_() { - - "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR." - -+ # TODO: might use directly /etc/vdoconf.yml (avoding need of 'vdo' manager) - verbose "Getting YAML VDO configuration." - "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml" - -- VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") -+ # Check list of devices in VDO configure file for their major:minor -+ # and match with given $DEVICE devmajor:devminor -+ for i in $(awk '/.*device:/ {print $2}' "$TEMPDIR/vdoconf.yml") ; do -+ local DEV -+ DEV=$("$READLINK" $READLINK_E "$i") || continue -+ STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue -+ eval "$STAT" -+ test "$MAJOR" = "$DEVMAJOR" && test "$MINOR" = "$DEVMINOR" && { -+ test -z "$FOUND" || error "VDO configuration contains duplicate entries $FOUND and $i" -+ FOUND=$i -+ } -+ done -+ -+ test -n "$FOUND" || error "Can't find matching device in vdo configuration file." -+ verbose "Found matching device $FOUND $MAJOR:$MINOR" -+ -+ VDONAME=$(awk -v DNAME="$FOUND" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") - TRVDONAME=$(echo "$VDONAME" | tr '-' '_') - - # When VDO volume is 'active', check it's not mounted/being used -- eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" -- test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" -+ DM_OPEN="$("$DMSETUP" info -c -o open "$VDONAME" --noheadings --nameprefixes 2>/dev/null || true)" -+ case "$DM_OPEN" in -+ Device*) ;; # no devices -+ *) eval "$DM_OPEN" -+ test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" -+ ;; -+ esac - - #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ - eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" -@@ -263,8 +298,7 @@ convert2lvm_() { - vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") - vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") - -- verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." -- verbose "With logical volume of size $vdo_logicalSize KiB." -+ verbose "Converted VDO device has logical/physical size $vdo_logicalSize/$vdo_physicalSize KiB." - - PARAMS=$(cat </dev/null || true -+ -+lvremove -f $vg -+ -+ -+# Test user can specify different VDO LV name (so the original LV is renamed) -+lvcreate -y -L5G -n $lv1 $vg -+ -+vdo create $VDOCONF --name "$VDONAME" --device="$DM_DEV_DIR/$vg/$lv1" --vdoLogicalSize=10G -+ -+lvm_import_vdo -y --name $vg/$lv2 "$DM_DEV_DIR/$vg/$lv1" -+ -+check lv_exists $vg $lv2 -+check lv_not_exists $vg $lv1 - - vgremove -f $vg - -+# ensure VDO device is not left in config file -+vdo remove $VDOCONF --force --name "$VDONAME" 2>/dev/null || true -+ - aux wipefs_a "$dev1" - - # prepare 'unused' $vg2 - vgcreate $vg2 "$dev2" - - # --# Check conversion of VDO volume on non-LV device -+# Check conversion of VDO volume on non-LV device and with >2T size - # --vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=31G -- --mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME" -+vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=3T - - # Fail with an already existing volume group $vg2 - not lvm_import_vdo --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err -@@ -87,7 +101,7 @@ vdo stop $VDOCONF --name "$VDONAME" - - lvm_import_vdo -y -v --name $vg/$lv1 "$dev1" - --fsck -n "$DM_DEV_DIR/$vg/$lv1" -+check lv_field $vg/$lv1 size "3.00t" - - vgremove -f $vg - --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-fix-max_discard-size.patch b/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-fix-max_discard-size.patch deleted file mode 100644 index 0265448..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-fix-max_discard-size.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 60eb37394b536e3b969496611ff4b59b71123476 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Mon, 6 Sep 2021 14:57:43 +0200 -Subject: [PATCH 2/5] vdo: lvm_import_vdo fix max_discard size - -Use correct 4K units in lvm2 for max_discard VDO option. - -(cherry picked from commit 8d5b7de54f21ce5e34d533599f9d5a42f2977cd5) ---- - scripts/lvm_import_vdo.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index bc73306..f8dd71f 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -320,7 +320,7 @@ allocation { - vdo_logical_threads = $vdo_logicalThreads - vdo_physical_threads = $vdo_physicalThreads - vdo_write_policy = $vdo_writePolicy -- vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 )) -+ vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") / 4 )) - vdo_pool_header_size = 0 - } - EOF --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-script-needs-to-continue-when-vgn.patch b/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-script-needs-to-continue-when-vgn.patch deleted file mode 100644 index 02bd359..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-lvm_import_vdo-script-needs-to-continue-when-vgn.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 4cf3e8bd846a171b4b945f289bf0c6f9c7b5864c Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Thu, 9 Sep 2021 18:10:13 +0200 -Subject: [PATCH 3/5] vdo: lvm_import_vdo script needs to continue when vgname - does not exist - -When the script cannot find vgname - it needs to continue to run. - -(cherry picked from commit 9db4ddabc1cf912dee30e0e6293767f01c976a4a) ---- - scripts/lvm_import_vdo.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index 70904f7..e5b30d8 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -262,7 +262,7 @@ convert2lvm_() { - if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then - VGNAME=${DEFAULT_NAME%/*} - # Find largest matching VG name to our 'default' vgname -- LASTVGNAME=$(LC_ALL=C "$LVM" vgs -oname -O-name --noheadings -S name=~${VGNAME} | grep -E "$VGNAME[0-9]? ?" | head -1) -+ LASTVGNAME=$(LC_ALL=C "$LVM" vgs -oname -O-name --noheadings -S name=~${VGNAME} | grep -E "$VGNAME[0-9]? ?" | head -1 || true) - if test -n "$LASTVGNAME" ; then - LASTVGNAME=${LASTVGNAME#*${VGNAME}} - # If the number is becoming too high, try some random number --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-man-page-updates.patch b/SOURCES/lvm2-2_03_14-vdo-man-page-updates.patch deleted file mode 100644 index 03ca40a..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-man-page-updates.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 073cdd0ba8c39a0330e73773c92d78546d06e687 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Fri, 10 Sep 2021 01:15:01 +0200 -Subject: [PATCH 4/5] vdo: man page updates - -(cherry picked from commit 812653d59806439379d80bb8124f6962ae42d46a) ---- - man/lvm_import_vdo.8_main | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main -index ee817a0..c6cb5c3 100644 ---- a/man/lvm_import_vdo.8_main -+++ b/man/lvm_import_vdo.8_main -@@ -45,6 +45,9 @@ Specifies the name of converted VDO LV. When the name is not specified, - some automatic name is selected. In case the converted VDO volume is - already using LV a backend device, the name of this LV is used for VDO LV. - In this case also the of volume group must stay same. -+Automatic name may change between releases and currently selects -+"vdolv" as LV name and VG name is selected from sequence -+"vdovg", "vdovg1", ... - . - .TP - .BR -v | --verbose --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-more-lvm_import_vdo-fixes.patch b/SOURCES/lvm2-2_03_14-vdo-more-lvm_import_vdo-fixes.patch deleted file mode 100644 index fb70af2..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-more-lvm_import_vdo-fixes.patch +++ /dev/null @@ -1,185 +0,0 @@ -From 6621116b61f4c9ee53166a994be2ef7d80a3c346 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Mon, 6 Sep 2021 15:06:32 +0200 -Subject: [PATCH 4/5] vdo: more lvm_import_vdo fixes - -Do not call 'dmsetup info' for non-dm devices. - -Better handling for VGNAME and LVNAME - so when convering LV as -backend device automatically recognize it and reuse LV name for VDOLV. - -Add prompt for final confirmation before actual conversion is started -(once confirmed, lvm2 commands no longer prompts to avoid leaving -conversion in the middle of its process.) - -(cherry picked from commit 89595a366554191c3df1a18e1f82b79c450a21ad) ---- - scripts/lvm_import_vdo.sh | 48 ++++++++++++++++++++++++++++++++++------ - test/shell/vdo-convert.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 97 insertions(+), 7 deletions(-) - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index dec32bc..70904f7 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -50,6 +50,7 @@ DM_DEV_DIR="${DM_DEV_DIR:-/dev}" - DEVICENAME="" - DEVMAJOR=0 - DEVMINOR=0 -+PROMPTING="" - - DRY=0 - VERB="" -@@ -57,7 +58,8 @@ FORCE="" - YES="" - - # default name for converted VG and its VDO LV --NAME="vdovg/vdolvol" -+DEFAULT_NAME="vdovg/vdolvol" -+NAME="" - - # help message - tool_usage() { -@@ -100,6 +102,7 @@ dry() { - cleanup() { - trap '' 2 - -+ test -z "$PROMPTING" || echo "No" - rm -rf "$TEMPDIR" - # error exit status for break - exit "${1:-1}" -@@ -175,7 +178,9 @@ detect_lv_() { - ;; - esac - -- DEV="$("$DMSETUP" info -c -j "$DEVMAJOR" -m "$DEVMINOR" -o uuid,name --noheadings --nameprefixes --separator ' ' 2>/dev/null)" -+ test "$DEVMAJOR" != "$(grep device-mapper /proc/devices | cut -f1 -d' ')" && return -+ -+ DEV="$("$DMSETUP" info -c -j "$DEVMAJOR" -m "$DEVMINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" - case "$DEV" in - Device*) ;; # no devices - *) eval "$DEV" ;; -@@ -244,15 +249,31 @@ convert2lvm_() { - detect_lv_ "$DEVICE" - case "$DM_UUID" in - LVM-*) eval "$("$DMSETUP" splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" -- if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then -+ if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then - VGNAME=$DM_VG_NAME -- LVNAME=$DM_LV_NAME -+ verbose "Using existing volume group name $VGNAME." -+ test -n "$LVNAME" || LVNAME=$DM_LV_NAME - elif test "$VGNAME" != "$DM_VG_NAME" ; then -- error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"." -+ error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for VDO device \"$DEVICE\"." - fi - ;; -- *) IS_LV=0 -- # Check $VGNANE does not already exists -+ *) IS_LV=0 -+ # Check if we need to generate unused $VGNANE -+ if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then -+ VGNAME=${DEFAULT_NAME%/*} -+ # Find largest matching VG name to our 'default' vgname -+ LASTVGNAME=$(LC_ALL=C "$LVM" vgs -oname -O-name --noheadings -S name=~${VGNAME} | grep -E "$VGNAME[0-9]? ?" | head -1) -+ if test -n "$LASTVGNAME" ; then -+ LASTVGNAME=${LASTVGNAME#*${VGNAME}} -+ # If the number is becoming too high, try some random number -+ test "$LASTVGNAME" -gt 99999999 2>/dev/null && LASTVGNAME=$RANDOM -+ # Generate new unused VG name -+ VGNAME="${VGNAME}$(( ${LASTVGNAME} + 1 ))" -+ verbose "Selected unused volume group name $VGNAME." -+ fi -+ fi -+ # New VG is created, LV name should be always unused. -+ test -n "$LVNAME" || LVNAME=${DEFAULT_NAME#*/} - "$LVM" vgs "$VGNAME" >/dev/null 2>&1 && error "Cannot use already existing volume group name \"$VGNAME\"." - ;; - esac -@@ -328,6 +349,19 @@ EOF - ) - verbose "VDO conversion paramaters: $PARAMS" - -+ # If user has not provided '--yes', prompt before conversion -+ if test -z "$YES" ; then -+ PROMPTING=yes -+ echo -n "Convert VDO device \"$DEVICE\" to VDO LV \"$VGNAME/$LVNAME\"? [y|N]: " -+ read -n 1 -s ANSWER -+ case "${ANSWER:0:1}" in -+ y|Y ) echo "Yes" ;; -+ * ) echo "No" ; PROMPTING=""; exit ;; -+ esac -+ PROMPTING="" -+ YES="-y" # From now, now prompting -+ fi -+ - verbose "Stopping VDO volume." - dry "$VDO" stop $VDOCONF --name "$VDONAME" - -diff --git a/test/shell/vdo-convert.sh b/test/shell/vdo-convert.sh -index 493f415..632f86a 100644 ---- a/test/shell/vdo-convert.sh -+++ b/test/shell/vdo-convert.sh -@@ -122,3 +122,59 @@ fsck -n "$DM_DEV_DIR/$vg1/$lv2" - - vgremove -f $vg1 - -+aux teardown_devs -+ -+ -+# Check with some real non-DM device from system -+# this needs to dropping DM_DEV_DIR -+ -+aux prepare_loop 60000 || skip -+ -+test -f LOOP -+LOOP=$(< LOOP) -+ -+aux extend_filter "a|$LOOP|" -+aux extend_devices "$LOOP" -+ -+# -+# Unfortunatelly generates this in syslog: -+# -+# vdo-start-by-dev@loop0.service: Main process exited, code=exited, status=1/FAILURE -+# vdo-start-by-dev@loop0.service: Failed with result 'exit-code'. -+# Failed to start Start VDO volume backed by loop0. -+# -+# TODO: Could be handled by: -+# -+# systemctl mask vdo-start-by-dev@ -+# systemctl unmask vdo-start-by-dev@ -+# -+# automate... -+# -+vdo create $VDOCONF --name "$VDONAME" --device="$LOOP" --vdoLogicalSize=23G \ -+ --blockMapCacheSize 192 \ -+ --blockMapPeriod 2048 \ -+ --emulate512 disabled \ -+ --indexMem 0.5 \ -+ --maxDiscardSize 10 \ -+ --sparseIndex disabled \ -+ --vdoAckThreads 2 \ -+ --vdoBioRotationInterval 8 \ -+ --vdoBioThreads 2 \ -+ --vdoCpuThreads 5 \ -+ --vdoHashZoneThreads 3 \ -+ --vdoLogicalThreads 3 \ -+ --writePolicy async-unsafe -+ -+# Get VDO table line -+dmsetup table "$VDONAME" | tr " " "\n" | sed -e '5,6d' -e '12d' | tee vdo-orig -+ -+DM_DEV_DIR= lvm_import_vdo -y --name $vg/$lv "$LOOP" -+lvs -a $vg -+ -+dmsetup table "$vg-${lv}_vpool-vpool" | tr " " "\n" | sed -e '5,6d' -e '12d' | tee new-vdo-lv -+ -+# Check there is a match between VDO and LV managed volume -+# (when differentiating parameters are deleted first) -+diff -u vdo-orig new-vdo-lv || die "Found mismatching VDO table lines!" -+ -+check lv_field $vg/$lv size "23.00g" --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-prompt-with-no-return-failure.patch b/SOURCES/lvm2-2_03_14-vdo-prompt-with-no-return-failure.patch deleted file mode 100644 index 4642667..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-prompt-with-no-return-failure.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f3f99d45b89d415528e21a66f94ab4576f95ba56 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Fri, 10 Sep 2021 22:39:23 +0200 -Subject: [PATCH 5/5] vdo: prompt with no return failure - -Exit 1 (failure) when prompt for conversion is answered as 'No'. - -(cherry picked from commit 3b24c0fe4e197383101eae53b14f19586cf2eda1) ---- - scripts/lvm_import_vdo.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh -index e5b30d8..06a043c 100755 ---- a/scripts/lvm_import_vdo.sh -+++ b/scripts/lvm_import_vdo.sh -@@ -356,7 +356,7 @@ EOF - read -n 1 -s ANSWER - case "${ANSWER:0:1}" in - y|Y ) echo "Yes" ;; -- * ) echo "No" ; PROMPTING=""; exit ;; -+ * ) echo "No" ; PROMPTING=""; exit 1 ;; - esac - PROMPTING="" - YES="-y" # From now, now prompting --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_14-vdo-read-new-sysfs-path.patch b/SOURCES/lvm2-2_03_14-vdo-read-new-sysfs-path.patch deleted file mode 100644 index c2d5f72..0000000 --- a/SOURCES/lvm2-2_03_14-vdo-read-new-sysfs-path.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 1c6992d37eff5af7134a11b662eacc1bab538ac2 Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Thu, 9 Sep 2021 14:59:38 +0200 -Subject: [PATCH 1/5] vdo: read new sysfs path - -New versions of kvdo module exposes statistics at new location: -/sys/block/dm-XXX/vdo/statistics/... - -Enhance lvm2 to access this location first. -Also if the statistic info is missing - make it 'debug' level info, -so it is not failing 'lvs' command. - -(cherry picked from commit e6f735d411e5911de186a610932c9bb9638275eb) - -Conflicts: - WHATS_NEW ---- - WHATS_NEW | 1 + - lib/activate/dev_manager.c | 7 +++--- - lib/metadata/metadata-exported.h | 3 ++- - lib/metadata/vdo_manip.c | 46 ++++++++++++++++++++++------------------ - 4 files changed, 32 insertions(+), 25 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index b751009..c5a5ca5 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.14 - - ================================== -+ Support newer location for VDO statistics. - Improve lvm_import_vdo script. - Support VDO LV with lvcreate -ky. - Fix lvconvert for VDO LV bigger then 2T. -diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c -index c4a6739..0d954d1 100644 ---- a/lib/activate/dev_manager.c -+++ b/lib/activate/dev_manager.c -@@ -157,6 +157,7 @@ out: - - static int _get_segment_status_from_target_params(const char *target_name, - const char *params, -+ const struct dm_info *dminfo, - struct lv_seg_status *seg_status) - { - const struct lv_segment *seg = seg_status->seg; -@@ -216,7 +217,7 @@ static int _get_segment_status_from_target_params(const char *target_name, - return_0; - seg_status->type = SEG_STATUS_SNAPSHOT; - } else if (segtype_is_vdo_pool(segtype)) { -- if (!parse_vdo_pool_status(seg_status->mem, seg->lv, params, &seg_status->vdo_pool)) -+ if (!parse_vdo_pool_status(seg_status->mem, seg->lv, params, dminfo, &seg_status->vdo_pool)) - return_0; - seg_status->type = SEG_STATUS_VDO_POOL; - } else if (segtype_is_writecache(segtype)) { -@@ -320,7 +321,7 @@ static int _info_run(const char *dlid, struct dm_info *dminfo, - } while (target); - - if (!target_name || -- !_get_segment_status_from_target_params(target_name, target_params, seg_status)) -+ !_get_segment_status_from_target_params(target_name, target_params, dminfo, seg_status)) - stack; - } - -@@ -1886,7 +1887,7 @@ int dev_manager_vdo_pool_status(struct dev_manager *dm, - goto out; - } - -- if (!parse_vdo_pool_status(dm->mem, lv, params, *status)) -+ if (!parse_vdo_pool_status(dm->mem, lv, params, &info, *status)) - goto_out; - - (*status)->mem = dm->mem; -diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h -index adbbe76..7c21b4d 100644 ---- a/lib/metadata/metadata-exported.h -+++ b/lib/metadata/metadata-exported.h -@@ -1364,7 +1364,8 @@ const char *get_vdo_write_policy_name(enum dm_vdo_write_policy policy); - uint64_t get_vdo_pool_virtual_size(const struct lv_segment *vdo_pool_seg); - int update_vdo_pool_virtual_size(struct lv_segment *vdo_pool_seg); - int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_pool_lv, -- const char *params, struct lv_status_vdo *status); -+ const char *params, const struct dm_info *dminfo, -+ struct lv_status_vdo *status); - struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, - const struct dm_vdo_target_params *vtp, - uint32_t *virtual_extents, -diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c -index 3f2de1a..2917f29 100644 ---- a/lib/metadata/vdo_manip.c -+++ b/lib/metadata/vdo_manip.c -@@ -123,48 +123,56 @@ int update_vdo_pool_virtual_size(struct lv_segment *vdo_pool_seg) - return 1; - } - --static int _sysfs_get_kvdo_value(const char *dm_name, const char *vdo_param, uint64_t *value) -+static int _sysfs_get_kvdo_value(const char *dm_name, const struct dm_info *dminfo, -+ const char *vdo_param, uint64_t *value) - { - char path[PATH_MAX]; - char temp[64]; - int fd, size, r = 0; - -- if (dm_snprintf(path, sizeof(path), "%skvdo/%s/%s", -- dm_sysfs_dir(), dm_name, vdo_param) < 0) { -- log_error("Failed to build kmod path."); -+ if (dm_snprintf(path, sizeof(path), "%s/block/dm-%d/vdo/%s", -+ dm_sysfs_dir(), dminfo->minor, vdo_param) < 0) { -+ log_debug("Failed to build kvdo path."); - return 0; - } - - if ((fd = open(path, O_RDONLY)) < 0) { -- if (errno != ENOENT) -- log_sys_error("open", path); -- else -+ /* try with older location */ -+ if (dm_snprintf(path, sizeof(path), "%skvdo/%s/%s", -+ dm_sysfs_dir(), dm_name, vdo_param) < 0) { -+ log_debug("Failed to build kvdo path."); -+ return 0; -+ } -+ -+ if ((fd = open(path, O_RDONLY)) < 0) { - log_sys_debug("open", path); -- goto bad; -+ goto bad; -+ } - } - - if ((size = read(fd, temp, sizeof(temp) - 1)) < 0) { -- log_sys_error("read", path); -+ log_sys_debug("read", path); - goto bad; - } - temp[size] = 0; - errno = 0; - *value = strtoll(temp, NULL, 0); - if (errno) { -- log_sys_error("strtool", path); -+ log_sys_debug("strtool", path); - goto bad; - } - - r = 1; - bad: - if (fd >= 0 && close(fd)) -- log_sys_error("close", path); -+ log_sys_debug("close", path); - - return r; - } - - int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_pool_lv, -- const char *params, struct lv_status_vdo *status) -+ const char *params, const struct dm_info *dminfo, -+ struct lv_status_vdo *status) - { - struct dm_vdo_status_parse_result result; - char *dm_name; -@@ -188,15 +196,11 @@ int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_ - - status->vdo = result.status; - -- if (result.status->operating_mode == DM_VDO_MODE_NORMAL) { -- if (!_sysfs_get_kvdo_value(dm_name, "statistics/data_blocks_used", -- &status->data_blocks_used)) -- return_0; -- -- if (!_sysfs_get_kvdo_value(dm_name, "statistics/logical_blocks_used", -- &status->logical_blocks_used)) -- return_0; -- -+ if ((result.status->operating_mode == DM_VDO_MODE_NORMAL) && -+ _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/data_blocks_used", -+ &status->data_blocks_used) && -+ _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/logical_blocks_used", -+ &status->logical_blocks_used)) { - status->usage = dm_make_percent(result.status->used_blocks, - result.status->total_blocks); - status->saving = dm_make_percent(status->logical_blocks_used - status->data_blocks_used, --- -1.8.3.1 - diff --git a/SOURCES/lvm2-make-generate.patch b/SOURCES/lvm2-make-generate.patch deleted file mode 100644 index 0b37216..0000000 --- a/SOURCES/lvm2-make-generate.patch +++ /dev/null @@ -1,146 +0,0 @@ - man/lvconvert.8_pregen | 2 +- - man/lvmdevices.8_pregen | 79 ++++++++++++++++++++++++++++++++++++++++--------- - 2 files changed, 66 insertions(+), 15 deletions(-) - -diff --git a/man/lvconvert.8_pregen b/man/lvconvert.8_pregen -index d733ab6..4fafe5d 100644 ---- a/man/lvconvert.8_pregen -+++ b/man/lvconvert.8_pregen -@@ -670,7 +670,7 @@ Convert LV to type thin-pool. - .RE - .P - .RS 4 --LV1 types: linear striped cache raid error zero -+LV1 types: linear striped cache raid error zero writecache - .RE - .P - \(em -diff --git a/man/lvmdevices.8_pregen b/man/lvmdevices.8_pregen -index 267ce96..fa85362 100644 ---- a/man/lvmdevices.8_pregen -+++ b/man/lvmdevices.8_pregen -@@ -28,6 +28,8 @@ lvmdevices \(em Manage the devices file - .br - \fB--delpvid\fP \fIString\fP - .br -+ \fB--deviceidtype\fP \fIString\fP -+.br - \fB--devices\fP \fIPV\fP - .br - \fB--devicesfile\fP \fIString\fP -@@ -70,18 +72,18 @@ remove it from the devices file with lvmdevices --deldev. The - vgimportdevices(8) command adds all PVs from a VG to the devices file, - and updates the VG metadata to include device IDs of the PVs. - .P --Commands adding new devices to the devices file necessarily look outside --the existing devices file to find the devices to add. pvcreate, vgcreate, --and vgextend also look outside the devices file to create new PVs and add --them to the devices file. -+Commands that add new devices to the devices file necessarily look outside -+the existing devices file to find the devices being added. pvcreate, -+vgcreate, and vgextend also look outside the devices file to create new -+PVs and add those PVs to the devices file. - .P - LVM records devices in the devices file using hardware-specific IDs, such - as the WWID, and attempts to use subsystem-specific IDs for virtual device --types (which also aim to be as unique and stable as possible.) --These device IDs are also written in the VG metadata. When no hardware or -+types (which also aim to be as unique and stable as possible.) These -+device IDs are also written in the VG metadata. When no hardware or - virtual ID is available, lvm falls back using the unstable device name as --the device ID. When devnames are used, lvm performs extra scanning to --find devices if their devname changes, e.g. after reboot. -+the device ID. When devnames are used as IDs, lvm performs extra scanning -+to find devices if their devname changes, e.g. after reboot. - .P - When proper device IDs are used, an lvm command will not look at devices - outside the devices file, but when devnames are used as a fallback, lvm -@@ -95,12 +97,13 @@ overriding the devices file. The listed devices act as a sort of devices - file in terms of limiting which devices lvm will see and use. Devices - that are not listed will appear to be missing to the lvm command. - .P --Multiple devices files can be kept in \fI#DEFAULT_SYS_DIR#/devices\fP, which allows lvm --to be used with different sets of devices, e.g. system devices do not need --to be exposed to a specific application, and the application can use lvm on --its own devices that are not exposed to the system. The option ----devicesfile is used to select the devices file to use with the --command. Without the option set, the default system devices file is used. -+Multiple devices files can be kept \fI#DEFAULT_SYS_DIR#/devices\fP, which -+allows lvm to be used with different sets of devices. For example, system -+devices do not need to be exposed to a specific application, and the -+application can use lvm on its own devices that are not exposed to the -+system. The option --devicesfile is used to select the devices -+file to use with the command. Without the option set, the default system -+devices file is used. - .P - Setting --devicesfile "" causes lvm to not use a devices file. - .P -@@ -120,6 +123,45 @@ if it does not yet exist. - .P - It is recommended to use lvm commands to make changes to the devices file to - ensure proper updates. -+.P -+The device ID and device ID type are included in the VG metadata and can -+be reported with pvs -o deviceid,deviceidtype. (Note that the lvmdevices -+command does not update VG metadata, but subsequent lvm commands modifying -+the metadata will include the device ID.) -+.P -+Possible device ID types are: -+.br -+.IP \[bu] 2 -+.B sys_wwid -+uses the wwid reported by sysfs. This is the first choice for non-virtual -+devices. -+.IP \[bu] 2 -+.B sys_serial -+uses the serial number reported by sysfs. This is the second choice for -+non-virtual devices. -+.IP \[bu] 2 -+.B mpath_uuid -+is used for dm multipath devices, reported by sysfs. -+.IP \[bu] 2 -+.B crypt_uuid -+is used for dm crypt devices, reported by sysfs. -+.IP \[bu] 2 -+.B md_uuid -+is used for md devices, reported by sysfs. -+.B lvmlv_uuid -+is used if a PV is placed on top of an lvm LV, reported by sysfs. -+.IP \[bu] 2 -+.B loop_file -+is used for loop devices, the backing file name repored by sysfs. -+.IP \[bu] 2 -+.B devname -+the device name is used if no other type applies. -+.P -+ -+The default choice for device ID type can be overriden using lvmdevices -+--addev --deviceidtype . If the specified type is available for the -+device it will be used, otherwise the device will be added using the type -+that would otherwise be chosen. - . - .SH USAGE - . -@@ -169,6 +211,8 @@ Add a device to the devices file. - .br - .RS 4 - .ad l -+[ \fB--deviceidtype\fP \fIString\fP ] -+.br - [ COMMON_OPTIONS ] - .ad b - .RE -@@ -308,6 +352,13 @@ Remove a device from the devices file. - Remove a device with the PVID from the devices file. - . - .HP -+\fB--deviceidtype\fP \fIString\fP -+.br -+The type of device ID to use for the device. -+If the specified type is available for the device, -+then it will override the default type that lvm would use. -+. -+.HP - \fB--devices\fP \fIPV\fP - .br - Devices that the command can use. This option can be repeated diff --git a/SOURCES/lvm2-rhel8.patch b/SOURCES/lvm2-rhel8.patch index 8af2792..596b317 100644 --- a/SOURCES/lvm2-rhel8.patch +++ b/SOURCES/lvm2-rhel8.patch @@ -3,16 +3,16 @@ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION -index d9c3e23..2610861 100644 +index 0a36180..57ed15e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ --2.03.12(2) (2021-05-07) -+2.03.12(2)-RHEL8 (2021-05-19) +-2.03.14(2) (2021-10-20) ++2.03.14(2)-RHEL8 (2021-10-20) diff --git a/VERSION_DM b/VERSION_DM -index 6105a0f..0991c69 100644 +index 52cb622..bf97bda 100644 --- a/VERSION_DM +++ b/VERSION_DM @@ -1 +1 @@ --1.02.177 (2021-05-07) -+1.02.177-RHEL8 (2021-05-19) +-1.02.181 (2021-10-20) ++1.02.181-RHEL8 (2021-10-20) diff --git a/SOURCES/lvm2-set-default-preferred_names.patch b/SOURCES/lvm2-set-default-preferred_names.patch index 88912bb..0653e9c 100644 --- a/SOURCES/lvm2-set-default-preferred_names.patch +++ b/SOURCES/lvm2-set-default-preferred_names.patch @@ -3,10 +3,10 @@ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/conf/example.conf.in b/conf/example.conf.in -index b4a55ae..aaf73a4 100644 +index a78ed73..2c6ff25 100644 --- a/conf/example.conf.in +++ b/conf/example.conf.in -@@ -121,8 +121,9 @@ devices { +@@ -116,8 +116,9 @@ devices { # # Example # preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] @@ -19,10 +19,10 @@ index b4a55ae..aaf73a4 100644 # Configuration option devices/use_devicesfile. # Enable or disable the use of a devices file. diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index d3a42a1..f5dac4d 100644 +index d280e7a..1e6c20f 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h -@@ -269,7 +269,7 @@ cfg(devices_hints_CFG, "hints", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_ +@@ -257,7 +257,7 @@ cfg(devices_hints_CFG, "hints", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_ " Use no hints.\n" "#\n") diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec index 7da9aa8..a0ff032 100644 --- a/SPECS/lvm2.spec +++ b/SPECS/lvm2.spec @@ -1,4 +1,4 @@ -%global device_mapper_version 1.02.177 +%global device_mapper_version 1.02.181 %global enable_cache 1 %global enable_cluster 1 @@ -41,6 +41,15 @@ %endif %endif +%if %{enable_cluster} + %global configure_cluster --with-cluster=internal + %if %{enable_cmirror} + %global configure_cmirror --enable-cmirrord + %endif +%else + %global configure_cluster --with-cluster=internal +%endif + %global from_snapshot 0 %if 0%{?from_snapshot} %global commit 4dc5d4ac7e7a9457ccc46ff04796b347e58bf4da @@ -55,11 +64,11 @@ Name: lvm2 %if 0%{?rhel} Epoch: %{rhel} %endif -Version: 2.03.12 +Version: 2.03.14 %if 0%{?from_snapshot} Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix} %else -Release: 10%{?dist}%{?rel_suffix} +Release: 1%{?dist}%{?rel_suffix} %endif License: GPLv2 URL: http://sourceware.org/lvm2 @@ -71,51 +80,6 @@ Patch0: lvm2-rhel8.patch %endif Patch1: lvm2-set-default-preferred_names.patch Patch2: lvm2-test-skip-problematic-tests.patch -# BZ 1961890 -Patch3: lvm2-2_03_13-vdo-fix-preload-of-kvdo.patch -# BZ 1964622: -Patch4: lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch -# BZ 1957898: -Patch5: lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch -# BZ 1872903: -Patch6: lvm2-2_03_13-writecache-fix-lv_on_pmem.patch -Patch7: lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch -# BZ 1957898: -Patch8: lvm2-2_03_13-lvconvert-allow-writecache-with-other-thinpool-comma.patch -# BZ 1922312: -Patch9: lvm2-2_03_13-devices-don-t-use-deleted-loop-backing-file-for-devi.patch -Patch10: lvm2-2_03_13-lvmdevices-add-deviceidtype-option.patch -# BZ 1974901: -Patch11: lvm2-2_03_13-device_id-handle-scsi_debug-wwid.patch -# BZ 1930261: -Patch12: lvm2-2_03_13-lvconvert-fix-vdo-virtual-size-when-specified.patch -Patch13: lvm2-2_03_13-vdo-rename-variable-vdo_pool_zero.patch -Patch14: lvm2-2_03_13-vdo-support-vdo_pool_header_size.patch -Patch15: lvm2-2_03_13-vdo-add-vdoimport-support.patch -Patch16: lvm2-2_03_13-man-vdoimport-page.patch -Patch17: lvm2-make-generate.patch -# BZ 1967744: -Patch18: lvm2-2_03_13-thin-fix-component-detection-of-external-origin.patch -# BZ 1899263: -Patch19: lvm2-2_03_13-vgremove-remove-forgotten-pmspare.patch -Patch20: lvm2-2_03_13-vgsplit-add-support-for-option-poolmetadataspare.patch -Patch21: lvm2-2_03_13-test.patch -Patch22: lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch -Patch23: lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch -Patch24: lvm2-2_03_13-tests-extend-vgmerge-testing.patch -# BZ 1986930: -Patch25: lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch -# BZs #1930261 #1986885 #1986915 #1988504 #1989650 #1996227: -Patch26: lvm2-2_03_14-vdo-fixes.patch -Patch27: lvm2-2_03_14-vdo-lvm_import_vdo-fix-max_discard-size.patch -Patch28: lvm2-2_03_14-vdo-better-message-for-missing-device.patch -Patch29: lvm2-2_03_14-vdo-more-lvm_import_vdo-fixes.patch -Patch30: lvm2-2_03_14-vdo-fix-conversion-of-large-virtual-sizes.patch -Patch31: lvm2-2_03_14-vdo-read-new-sysfs-path.patch -Patch32: lvm2-2_03_14-tests-check-lvm2-parses-vdo-statistics.patch -Patch33: lvm2-2_03_14-vdo-lvm_import_vdo-script-needs-to-continue-when-vgn.patch -Patch34: lvm2-2_03_14-vdo-man-page-updates.patch -Patch35: lvm2-2_03_14-vdo-prompt-with-no-return-failure.patch BuildRequires: gcc %if %{enable_testsuite} @@ -178,39 +142,6 @@ or more physical volumes and creating one or more logical volumes %endif %patch1 -p1 -b .backup1 %patch2 -p1 -b .backup2 -%patch3 -p1 -b .backup3 -%patch4 -p1 -b .backup4 -%patch5 -p1 -b .backup5 -%patch6 -p1 -b .backup6 -%patch7 -p1 -b .backup7 -%patch8 -p1 -b .backup8 -%patch9 -p1 -b .backup9 -%patch10 -p1 -b .backup10 -%patch11 -p1 -b .backup11 -%patch12 -p1 -b .backup12 -%patch13 -p1 -b .backup13 -%patch14 -p1 -b .backup14 -%patch15 -p1 -b .backup15 -%patch16 -p1 -b .backup16 -%patch17 -p1 -b .backup17 -%patch18 -p1 -b .backup18 -%patch19 -p1 -b .backup19 -%patch20 -p1 -b .backup20 -%patch21 -p1 -b .backup21 -%patch22 -p1 -b .backup22 -%patch23 -p1 -b .backup23 -%patch24 -p1 -b .backup24 -%patch25 -p1 -b .backup25 -%patch26 -p1 -b .backup26 -%patch27 -p1 -b .backup27 -%patch28 -p1 -b .backup28 -%patch29 -p1 -b .backup29 -%patch30 -p1 -b .backup30 -%patch31 -p1 -b .backup31 -%patch32 -p1 -b .backup32 -%patch33 -p1 -b .backup33 -%patch34 -p1 -b .backup34 -%patch35 -p1 -b .backup35 %build %global _default_pid_dir /run @@ -220,17 +151,7 @@ or more physical volumes and creating one or more logical volumes %global _udevdir %{_prefix}/lib/udev/rules.d -# FIXME: Dropped in rhel9, do we need to keep this for "compatibility"? -%if %{enable_cluster} - %global configure_cluster --with-cluster=internal - %if %{enable_cmirror} - %global configure_cmirror --enable-cmirrord - %endif -%else - %global configure_cluster --with-cluster=internal -%endif - -%configure\ +%configure \ --with-default-dm-run-dir=%{_default_dm_run_dir} \ --with-default-run-dir=%{_default_run_dir} \ --with-default-pid-dir=%{_default_pid_dir} \ @@ -277,7 +198,6 @@ or more physical volumes and creating one or more logical volumes %if %{enable_vdo} --with-vdo=internal --with-vdo-format=%{_bindir}/vdoformat \ %endif - %{?configure_integrity} \ %if %{enable_integrity} --with-integrity=internal \ %endif @@ -457,7 +377,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_mandir}/man8/vgscan.8.gz %{_mandir}/man8/vgsplit.8.gz %{_udevdir}/11-dm-lvm.rules -%{_udevdir}/69-dm-lvm-metad.rules +%{_udevdir}/69-dm-lvm.rules %if %{enable_lvmpolld} %{_mandir}/man8/lvmpolld.8.gz %{_mandir}/man8/lvm-lvpoll.8.gz @@ -483,7 +403,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_tmpfilesdir}/%{name}.conf %{_unitdir}/blk-availability.service %{_unitdir}/lvm2-monitor.service -%{_unitdir}/lvm2-pvscan@.service +#%%{_unitdir}/lvm2-pvscan@.service %attr(555, -, -) %{_prefix}/lib/systemd/system-generators/lvm2-activation-generator %if %{enable_lvmpolld} %{_unitdir}/lvm2-lvmpolld.socket @@ -839,6 +759,10 @@ An extensive functional testsuite for LVM2. %endif %changelog +* Wed Oct 20 2021 Marian Csontos - 2.03.14-1 +- Update to upstream version 2.03.14. +- See WHATS_NEW for list of changes. + * Mon Sep 20 2021 Marian Csontos - 2.03.12-10 - Fix incorrect memory free.