From 26e71034ac1ea59adf3f4817099014e91bac61e5 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 06 2019 16:35:32 +0000 Subject: import lvm2-2.03.05-5.el8 --- diff --git a/.gitignore b/.gitignore index 2fa54a9..4b88233 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/LVM2.2.03.02.tgz +SOURCES/LVM2.2.03.05.tgz diff --git a/.lvm2.metadata b/.lvm2.metadata index 12fd23b..a20d07d 100644 --- a/.lvm2.metadata +++ b/.lvm2.metadata @@ -1 +1 @@ -c18fd7603188723c4e3d4f791250265da414806b SOURCES/LVM2.2.03.02.tgz +edfa340a4bbdb3e995521bebbe5307fd7687ac3b SOURCES/LVM2.2.03.05.tgz diff --git a/SOURCES/lvm2-2_03_03-config-change-scan_lvs-default-to-0.patch b/SOURCES/lvm2-2_03_03-config-change-scan_lvs-default-to-0.patch deleted file mode 100644 index 13543a7..0000000 --- a/SOURCES/lvm2-2_03_03-config-change-scan_lvs-default-to-0.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 823cff48df8cb6b077e608818f81c5805b26acc0 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Wed, 20 Feb 2019 13:30:46 -0600 -Subject: [PATCH 1/5] config: change scan_lvs default to 0 - -so that lvm does not scan LVs for PVs by default. - -+ build: make generate - -(cherry picked from commit 7be6791e707da333e56aea3cc50c079ab6207bad) ---- - conf/example.conf.in | 2 +- - lib/config/defaults.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index a54dc62..2e7bb3c 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -168,7 +168,7 @@ devices { - - # Configuration option devices/scan_lvs. - # Scan LVM LVs for layered PVs. -- scan_lvs = 1 -+ scan_lvs = 0 - - # Configuration option devices/multipath_component_detection. - # Ignore devices that are components of DM multipath devices. -diff --git a/lib/config/defaults.h b/lib/config/defaults.h -index 3da29f0..e763a17 100644 ---- a/lib/config/defaults.h -+++ b/lib/config/defaults.h -@@ -301,6 +301,6 @@ - #define DEFAULT_VDO_POOL_AUTOEXTEND_THRESHOLD 100 - #define DEFAULT_VDO_POOL_AUTOEXTEND_PERCENT 20 - --#define DEFAULT_SCAN_LVS 1 -+#define DEFAULT_SCAN_LVS 0 - - #endif /* _LVM_DEFAULTS_H */ --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-dm-ensure-migration_threshold-is-big-enough.patch b/SOURCES/lvm2-2_03_03-dm-ensure-migration_threshold-is-big-enough.patch deleted file mode 100644 index 2230572..0000000 --- a/SOURCES/lvm2-2_03_03-dm-ensure-migration_threshold-is-big-enough.patch +++ /dev/null @@ -1,72 +0,0 @@ - WHATS_NEW | 1 + - device_mapper/libdm-deptree.c | 20 +++++++++++++++++--- - 2 files changed, 18 insertions(+), 3 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 4f752fa..f429d27 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Ensure migration_threshold for cache is at least 8 chunks. - Move VDO support towards V2 target (6.2) support. - - Version 2.03.02 - 18th December 2018 -diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c -index ed96378..be16071 100644 ---- a/device_mapper/libdm-deptree.c -+++ b/device_mapper/libdm-deptree.c -@@ -196,6 +196,7 @@ struct load_segment { - uint64_t transaction_id; /* Thin_pool */ - uint64_t low_water_mark; /* Thin_pool */ - uint32_t data_block_size; /* Thin_pool + cache */ -+ uint32_t migration_threshold; /* Cache */ - unsigned skip_block_zeroing; /* Thin_pool */ - unsigned ignore_discard; /* Thin_pool target vsn 1.1 */ - unsigned no_discard_passdown; /* Thin_pool target vsn 1.1 */ -@@ -2594,10 +2595,14 @@ static int _cache_emit_segment_line(struct dm_task *dmt, - - EMIT_PARAMS(pos, " %s", name); - -- EMIT_PARAMS(pos, " %u", seg->policy_argc * 2); -+ /* Do not pass migration_threshold 2048 which is default */ -+ EMIT_PARAMS(pos, " %u", (seg->policy_argc + (seg->migration_threshold != 2048) ? 1 : 0) * 2); -+ if (seg->migration_threshold != 2048) -+ EMIT_PARAMS(pos, " migration_threshold %u", seg->migration_threshold); - if (seg->policy_settings) - for (cn = seg->policy_settings->child; cn; cn = cn->sib) -- EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); -+ if (cn->v) /* Skip deleted entry */ -+ EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); - - return 1; - } -@@ -3554,6 +3559,7 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, - seg->data_block_size = data_block_size; - seg->flags = feature_flags; - seg->policy_name = policy_name; -+ seg->migration_threshold = 2048; /* Default migration threshold 1MiB */ - - /* FIXME: better validation missing */ - if (policy_settings) { -@@ -3566,10 +3572,18 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, - log_error("Cache policy parameter %s is without integer value.", cn->key); - return 0; - } -- seg->policy_argc++; -+ if (strcmp(cn->key, "migration_threshold") == 0) { -+ seg->migration_threshold = cn->v->v.i; -+ cn->v = NULL; /* skip this entry */ -+ } else -+ seg->policy_argc++; - } - } - -+ /* Always some throughput available for cache to proceed */ -+ if (seg->migration_threshold < data_block_size * 8) -+ seg->migration_threshold = data_block_size * 8; -+ - return 1; - } - diff --git a/SOURCES/lvm2-2_03_03-dm-migration_threshold-for-old-linked-tools.patch b/SOURCES/lvm2-2_03_03-dm-migration_threshold-for-old-linked-tools.patch deleted file mode 100644 index 747b1bb..0000000 --- a/SOURCES/lvm2-2_03_03-dm-migration_threshold-for-old-linked-tools.patch +++ /dev/null @@ -1,72 +0,0 @@ - WHATS_NEW_DM | 1 + - libdm/libdm-deptree.c | 20 +++++++++++++++++--- - 2 files changed, 18 insertions(+), 3 deletions(-) - -diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM -index 24148d8..eacdc91 100644 ---- a/WHATS_NEW_DM -+++ b/WHATS_NEW_DM -@@ -1,5 +1,6 @@ - Version 1.02.157 - - ===================================== -+ Ensure migration_threshold for cache is at least 8 chunks. - Fix compilation of vdo status parsing in dmeventd. - - Version 1.02.155 - 18th December 2018 -diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c -index 3f95a0d..ee12da2 100644 ---- a/libdm/libdm-deptree.c -+++ b/libdm/libdm-deptree.c -@@ -192,6 +192,7 @@ struct load_segment { - uint64_t transaction_id; /* Thin_pool */ - uint64_t low_water_mark; /* Thin_pool */ - uint32_t data_block_size; /* Thin_pool + cache */ -+ uint32_t migration_threshold; /* Cache */ - unsigned skip_block_zeroing; /* Thin_pool */ - unsigned ignore_discard; /* Thin_pool target vsn 1.1 */ - unsigned no_discard_passdown; /* Thin_pool target vsn 1.1 */ -@@ -2462,10 +2463,14 @@ static int _cache_emit_segment_line(struct dm_task *dmt, - - EMIT_PARAMS(pos, " %s", name); - -- EMIT_PARAMS(pos, " %u", seg->policy_argc * 2); -+ /* Do not pass migration_threshold 2048 which is default */ -+ EMIT_PARAMS(pos, " %u", (seg->policy_argc + (seg->migration_threshold != 2048) ? 1 : 0) * 2); -+ if (seg->migration_threshold != 2048) -+ EMIT_PARAMS(pos, " migration_threshold %u", seg->migration_threshold); - if (seg->policy_settings) - for (cn = seg->policy_settings->child; cn; cn = cn->sib) -- EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); -+ if (cn->v) /* Skip deleted entry */ -+ EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); - - return 1; - } -@@ -3373,6 +3378,7 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, - seg->data_block_size = data_block_size; - seg->flags = feature_flags; - seg->policy_name = policy_name; -+ seg->migration_threshold = 2048; /* Default migration threshold 1MiB */ - - /* FIXME: better validation missing */ - if (policy_settings) { -@@ -3385,10 +3391,18 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, - log_error("Cache policy parameter %s is without integer value.", cn->key); - return 0; - } -- seg->policy_argc++; -+ if (strcmp(cn->key, "migration_threshold") == 0) { -+ seg->migration_threshold = cn->v->v.i; -+ cn->v = NULL; /* skip this entry */ -+ } else -+ seg->policy_argc++; - } - } - -+ /* Always some throughput available for cache to proceed */ -+ if (seg->migration_threshold < data_block_size * 8) -+ seg->migration_threshold = data_block_size * 8; -+ - return 1; - } - diff --git a/SOURCES/lvm2-2_03_03-dmeventd-resolve-compilation-of-vdo-status-parsing.patch b/SOURCES/lvm2-2_03_03-dmeventd-resolve-compilation-of-vdo-status-parsing.patch deleted file mode 100644 index de63d7d..0000000 --- a/SOURCES/lvm2-2_03_03-dmeventd-resolve-compilation-of-vdo-status-parsing.patch +++ /dev/null @@ -1,52 +0,0 @@ - daemons/dmeventd/plugins/vdo/dmeventd_vdo.c | 4 +++- - device_mapper/vdo/status.c | 22 ++++++++++++++++++++-- - 2 files changed, 23 insertions(+), 3 deletions(-) - -diff --git a/daemons/dmeventd/plugins/vdo/dmeventd_vdo.c b/daemons/dmeventd/plugins/vdo/dmeventd_vdo.c -index b5e2766..d5156cd 100644 ---- a/daemons/dmeventd/plugins/vdo/dmeventd_vdo.c -+++ b/daemons/dmeventd/plugins/vdo/dmeventd_vdo.c -@@ -15,7 +15,9 @@ - #include "lib/misc/lib.h" - #include "daemons/dmeventd/plugins/lvm2/dmeventd_lvm.h" - #include "daemons/dmeventd/libdevmapper-event.h" --#include "device_mapper/vdo/target.h" -+ -+/* Use parser from new device_mapper library */ -+#include "device_mapper/vdo/status.c" - - #include - #include -diff --git a/device_mapper/vdo/status.c b/device_mapper/vdo/status.c -index 40e69ba..a34029d 100644 ---- a/device_mapper/vdo/status.c -+++ b/device_mapper/vdo/status.c -@@ -1,8 +1,26 @@ -+/* -+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved. -+ * -+ * This file is part of the device-mapper userspace tools. -+ * -+ * 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 Lesser General Public License v.2.1. -+ * -+ * You should have received a copy of the GNU Lesser 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 -+ */ -+ -+/* Note: this object is also used by VDO dmeventd plugin for parsing status */ -+/* File could be included by VDO plugin and can use original libdm library */ -+#ifndef LIB_DMEVENT_H - #include "configure.h" --#include "target.h" -- - // For DM_ARRAY_SIZE! - #include "device_mapper/all.h" -+#endif -+ -+#include "device_mapper/vdo/target.h" - #include "base/memory/zalloc.h" - - #include diff --git a/SOURCES/lvm2-2_03_03-generators-avoid-contacting-syslog-with-generators.patch b/SOURCES/lvm2-2_03_03-generators-avoid-contacting-syslog-with-generators.patch deleted file mode 100644 index 0b5a667..0000000 --- a/SOURCES/lvm2-2_03_03-generators-avoid-contacting-syslog-with-generators.patch +++ /dev/null @@ -1,59 +0,0 @@ - WHATS_NEW | 1 + - lib/log/log.c | 3 +++ - man/lvm.8_main | 3 +++ - scripts/generator-internals.c | 3 +++ - 4 files changed, 10 insertions(+) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 4b68dbd..26628c3 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Introduce LVM_SUPPRESS_SYSLOG to suppress syslog usage by generator. - Fix generator querying config options missing from lvm.conf. - Restore missing man info lvcreate --zero for thin-pools. - Drop misleadning comment for metadata minimum_io_size for VDO segment. -diff --git a/lib/log/log.c b/lib/log/log.c -index fd056b1..f6aaa04 100644 ---- a/lib/log/log.c -+++ b/lib/log/log.c -@@ -324,6 +324,9 @@ void init_log_while_suspended(int log_while_suspended) - - void init_syslog(int facility) - { -+ if (getenv("LVM_SUPPRESS_SYSLOG")) -+ return; -+ - openlog("lvm", LOG_PID, facility); - _syslog = 1; - } -diff --git a/man/lvm.8_main b/man/lvm.8_main -index b9abf58..3e67b1b 100644 ---- a/man/lvm.8_main -+++ b/man/lvm.8_main -@@ -435,6 +435,9 @@ Defaults to "\fI#DEFAULT_SYS_DIR#\fP". - .B LVM_SUPPRESS_FD_WARNINGS - Suppress warnings about unexpected file descriptors passed into LVM. - .TP -+.B LVM_SUPPRESS_SYSLOG -+Suppress contacting syslog. -+.TP - .B LVM_VG_NAME - The Volume Group name that is assumed for - any reference to a Logical Volume that doesn't specify a path. -diff --git a/scripts/generator-internals.c b/scripts/generator-internals.c -index 7bab4f9..f7e32b0 100644 ---- a/scripts/generator-internals.c -+++ b/scripts/generator-internals.c -@@ -56,6 +56,9 @@ static bool _open_child(struct child_process *child, const char *cmd, const char - (void) close(pipe_fd[1]); - } - -+ /* Suppressing any use of syslog */ -+ (void) setenv("LVM_SUPPRESS_SYSLOG", "1", 1); -+ - if (execv(cmd, (char *const *) argv) < 0) - _error("execv failed: %s\n", strerror(errno)); - // Shouldn't get here unless exec failed. diff --git a/SOURCES/lvm2-2_03_03-lib-move-towards-v2-version-of-VDO-format.patch b/SOURCES/lvm2-2_03_03-lib-move-towards-v2-version-of-VDO-format.patch deleted file mode 100644 index 96269b3..0000000 --- a/SOURCES/lvm2-2_03_03-lib-move-towards-v2-version-of-VDO-format.patch +++ /dev/null @@ -1,490 +0,0 @@ - WHATS_NEW | 4 ++++ - WHATS_NEW_DM | 4 ++++ - device_mapper/all.h | 1 + - device_mapper/libdm-deptree.c | 16 ++++++++----- - device_mapper/vdo/target.h | 15 ++++++------ - device_mapper/vdo/vdo_limits.h | 7 ++++-- - device_mapper/vdo/vdo_target.c | 20 +++++++++++----- - lib/config/config_settings.h | 54 ++++++++++++++++++++++++------------------ - lib/config/defaults.h | 8 +++---- - lib/metadata/vdo_manip.c | 16 ++++++------- - lib/vdo/vdo.c | 44 +++++++++++++++++----------------- - 11 files changed, 110 insertions(+), 79 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 9cdc70e..4f752fa 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,3 +1,7 @@ -+Version 2.03.03 - -+==================================== -+ Move VDO support towards V2 target (6.2) support. -+ - Version 2.03.02 - 18th December 2018 - ==================================== - Fix missing proper initialization of pv_list struct when adding pv. -diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM -index 8fe5010..24148d8 100644 ---- a/WHATS_NEW_DM -+++ b/WHATS_NEW_DM -@@ -1,3 +1,7 @@ -+Version 1.02.157 - -+===================================== -+ Fix compilation of vdo status parsing in dmeventd. -+ - Version 1.02.155 - 18th December 2018 - ===================================== - Include correct internal header inside libdm list.c. -diff --git a/device_mapper/all.h b/device_mapper/all.h -index 2c452ab..b9a7a90 100644 ---- a/device_mapper/all.h -+++ b/device_mapper/all.h -@@ -924,6 +924,7 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, - int dm_tree_node_add_vdo_target(struct dm_tree_node *node, - uint64_t size, - const char *data_uuid, -+ uint64_t data_size, - const struct dm_vdo_target_params *param); - - /* -diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c -index d3a5c27..ed96378 100644 ---- a/device_mapper/libdm-deptree.c -+++ b/device_mapper/libdm-deptree.c -@@ -207,6 +207,7 @@ struct load_segment { - struct dm_tree_node *vdo_data; /* VDO */ - struct dm_vdo_target_params vdo_params; /* VDO */ - const char *vdo_name; /* VDO - device name is ALSO passed as table arg */ -+ uint64_t vdo_data_size; /* VDO - size of data storage device */ - }; - - /* Per-device properties */ -@@ -2647,17 +2648,18 @@ static int _vdo_emit_segment_line(struct dm_task *dmt, - return 0; - } - -- EMIT_PARAMS(pos, "%s %u %s " FMTu64 " " FMTu64 " %u on %s %s " -- "ack=%u,bio=%u,bioRotationInterval=%u,cpu=%u,hash=%u,logical=%u,physical=%u", -+ EMIT_PARAMS(pos, "V2 %s " FMTu64 " %u " FMTu64 " %u %s %s %s " -+ "maxDiscard %u ack %u bio %u bioRotationInterval %u cpu %u hash %u logical %u physical %u", - data_dev, -- (seg->vdo_params.emulate_512_sectors == 0) ? 4096 : 512, -- seg->vdo_params.use_read_cache ? "enabled" : "disabled", -- seg->vdo_params.read_cache_size_mb * UINT64_C(256), // 1MiB -> 4KiB units -+ seg->vdo_data_size / 8, // this parameter is in 4K units -+ seg->vdo_params.minimum_io_size, - seg->vdo_params.block_map_cache_size_mb * UINT64_C(256), // 1MiB -> 4KiB units -- seg->vdo_params.block_map_period, -+ seg->vdo_params.block_map_era_length, -+ seg->vdo_params.use_metadata_hints ? "on" : "off" , - (seg->vdo_params.write_policy == DM_VDO_WRITE_POLICY_SYNC) ? "sync" : - (seg->vdo_params.write_policy == DM_VDO_WRITE_POLICY_ASYNC) ? "async" : "auto", // policy - seg->vdo_name, -+ seg->vdo_params.max_discard, - seg->vdo_params.ack_threads, - seg->vdo_params.bio_threads, - seg->vdo_params.bio_rotation, -@@ -4034,6 +4036,7 @@ int dm_tree_node_add_cache_target_base(struct dm_tree_node *node, - int dm_tree_node_add_vdo_target(struct dm_tree_node *node, - uint64_t size, - const char *data_uuid, -+ uint64_t data_size, - const struct dm_vdo_target_params *vtp) - { - struct load_segment *seg; -@@ -4054,6 +4057,7 @@ int dm_tree_node_add_vdo_target(struct dm_tree_node *node, - - seg->vdo_params = *vtp; - seg->vdo_name = node->name; -+ seg->vdo_data_size = data_size; - - node->props.send_messages = 2; - -diff --git a/device_mapper/vdo/target.h b/device_mapper/vdo/target.h -index c597491..f83cffd 100644 ---- a/device_mapper/vdo/target.h -+++ b/device_mapper/vdo/target.h -@@ -74,16 +74,16 @@ enum dm_vdo_write_policy { - - // FIXME: review whether we should use the createParams from the userlib - struct dm_vdo_target_params { -+ uint32_t minimum_io_size; - uint32_t block_map_cache_size_mb; -- uint32_t block_map_period; -+ uint32_t block_map_era_length; // format period - - uint32_t check_point_frequency; -- uint32_t index_memory_size_mb; -+ uint32_t index_memory_size_mb; // format - -- uint32_t read_cache_size_mb; -- -- uint32_t slab_size_mb; -+ uint32_t slab_size_mb; // format - -+ uint32_t max_discard; - // threads - uint32_t ack_threads; - uint32_t bio_threads; -@@ -95,9 +95,8 @@ struct dm_vdo_target_params { - - bool use_compression; - bool use_deduplication; -- bool emulate_512_sectors; -- bool use_sparse_index; -- bool use_read_cache; -+ bool use_metadata_hints; -+ bool use_sparse_index; // format - - // write policy - enum dm_vdo_write_policy write_policy; -diff --git a/device_mapper/vdo/vdo_limits.h b/device_mapper/vdo/vdo_limits.h -index 40cf204..e145100 100644 ---- a/device_mapper/vdo/vdo_limits.h -+++ b/device_mapper/vdo/vdo_limits.h -@@ -21,8 +21,8 @@ - #define DM_VDO_BLOCK_MAP_CACHE_SIZE_MAXIMUM_MB (16 * 1024 * 1024 - 1) // 16TiB - 1 - #define DM_VDO_BLOCK_MAP_CACHE_SIZE_MINIMUM_PER_LOGICAL_THREAD (4096 * DM_VDO_BLOCK_SIZE_KB) - --#define DM_VDO_BLOCK_MAP_PERIOD_MINIMUM 1 --#define DM_VDO_BLOCK_MAP_PERIOD_MAXIMUM (16380) -+#define DM_VDO_BLOCK_MAP_ERA_LENGTH_MINIMUM (1) -+#define DM_VDO_BLOCK_MAP_ERA_LENGTH_MAXIMUM (16380) - - #define DM_VDO_INDEX_MEMORY_SIZE_MINIMUM_MB (256) // 0.25 GiB - #define DM_VDO_INDEX_MEMORY_SIZE_MAXIMUM_MB (1024 * 1024 * 1024) // 1TiB -@@ -57,4 +57,7 @@ - //#define DM_VDO_PHYSICAL_THREADS_MINIMUM (0) - #define DM_VDO_PHYSICAL_THREADS_MAXIMUM (16) - -+#define DM_VDO_MAX_DISCARD_MINIMUM (1) -+#define DM_VDO_MAX_DISCARD_MAXIMUM (UINT32_MAX / 4096) -+ - #endif // DEVICE_MAPPER_VDO_LIMITS_H -diff --git a/device_mapper/vdo/vdo_target.c b/device_mapper/vdo/vdo_target.c -index c488023..976d71a 100644 ---- a/device_mapper/vdo/vdo_target.c -+++ b/device_mapper/vdo/vdo_target.c -@@ -23,6 +23,13 @@ bool dm_vdo_validate_target_params(const struct dm_vdo_target_params *vtp, - { - bool valid = true; - -+ if ((vtp->minimum_io_size != 512) && -+ (vtp->minimum_io_size != 4096)) { -+ log_error("VDO minimum io size %u is unsupported.", -+ vtp->minimum_io_size); -+ valid = false; -+ } -+ - if ((vtp->block_map_cache_size_mb < DM_VDO_BLOCK_MAP_CACHE_SIZE_MINIMUM_MB) || - (vtp->block_map_cache_size_mb > DM_VDO_BLOCK_MAP_CACHE_SIZE_MAXIMUM_MB)) { - log_error("VDO block map cache size %u out of range.", -@@ -37,12 +44,6 @@ bool dm_vdo_validate_target_params(const struct dm_vdo_target_params *vtp, - valid = false; - } - -- if (vtp->read_cache_size_mb > DM_VDO_READ_CACHE_SIZE_MAXIMUM_MB) { -- log_error("VDO read cache size %u out of range.", -- vtp->read_cache_size_mb); -- valid = false; -- } -- - if ((vtp->slab_size_mb < DM_VDO_SLAB_SIZE_MINIMUM_MB) || - (vtp->slab_size_mb > DM_VDO_SLAB_SIZE_MAXIMUM_MB)) { - log_error("VDO slab size %u out of range.", -@@ -50,6 +51,13 @@ bool dm_vdo_validate_target_params(const struct dm_vdo_target_params *vtp, - valid = false; - } - -+ if ((vtp->max_discard < DM_VDO_MAX_DISCARD_MINIMUM) || -+ (vtp->max_discard > DM_VDO_MAX_DISCARD_MAXIMUM)) { -+ log_error("VDO max discard %u out of range.", -+ vtp->max_discard); -+ valid = false; -+ } -+ - if (vtp->ack_threads > DM_VDO_ACK_THREADS_MAXIMUM) { - log_error("VDO ack threads %u out of range.", vtp->ack_threads); - valid = false; -diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index 689a9e4..b725343 100644 ---- a/lib/config/config_settings.h -+++ b/lib/config/config_settings.h -@@ -618,10 +618,17 @@ cfg(allocation_vdo_use_compression_CFG, "vdo_use_compression", allocation_CFG_SE - cfg(allocation_vdo_use_deduplication_CFG, "vdo_use_deduplication", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_USE_DEDUPLICATION, VDO_1ST_VSN, NULL, 0, NULL, - "Enables or disables deduplication when creating a VDO volume.\n" - "Deduplication may be disabled in instances where data is not expected\n" -- "to have good deduplication rates but compression is still desired.") -+ "to have good deduplication rates but compression is still desired.\n") - --cfg(allocation_vdo_emulate_512_sectors_CFG, "vdo_emulate_512_sectors", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_EMULATE_512_SECTORS, VDO_1ST_VSN, NULL, 0, NULL, -- "Specifies that the VDO volume is to emulate a 512 byte block device.\n") -+cfg(allocation_vdo_use_metadata_hints_CFG, "vdo_use_metadata_hints", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_USE_METADATA_HINTS, VDO_1ST_VSN, NULL, 0, NULL, -+ "Enables or disables whether VDO volume should tag its latency-critical\n" -+ "writes with the REQ_SYNC flag. Some device mapper targets such as dm-raid5\n" -+ "process writes with this flag at a higher priority.\n" -+ "Default is enabled.\n") -+ -+cfg(allocation_vdo_minimum_io_size_CFG, "vdo_minimum_io_size", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_MINIMUM_IO_SIZE, VDO_1ST_VSN, NULL, 0, NULL, -+ "The minimum IO size for VDO volume to accept, in bytes.\n" -+ "Valid values are 512 or 4096. The recommended and default value is 4096.\n") - - cfg(allocation_vdo_block_map_cache_size_mb_CFG, "vdo_block_map_cache_size_mb", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_BLOCK_MAP_CACHE_SIZE_MB, VDO_1ST_VSN, NULL, 0, NULL, - "Specifies the amount of memory in MiB allocated for caching block map\n" -@@ -629,41 +636,32 @@ cfg(allocation_vdo_block_map_cache_size_mb_CFG, "vdo_block_map_cache_size_mb", a - "at least 128MiB and less than 16TiB. The cache must be at least 16MiB\n" - "per logical thread. Note that there is a memory overhead of 15%.\n") - --cfg(allocation_vdo_block_map_period_CFG, "vdo_block_map_period", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_BLOCK_MAP_PERIOD, VDO_1ST_VSN, NULL, 0, NULL, -- "Tunes the quantity of block map updates that can accumulate\n" -- "before cache pages are flushed to disk. The value must be\n" -- "at least 1 and less then 16380.\n" -- "A lower value means shorter recovery time but lower performance.\n") -+// vdo format --blockMapPeriod -+cfg(allocation_vdo_block_map_era_length_CFG, "vdo_block_map_period", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_BLOCK_MAP_ERA_LENGTH, VDO_1ST_VSN, NULL, 0, NULL, -+ "The speed with which the block map cache writes out modified block map pages.\n" -+ "A smaller era length is likely to reduce the amount time spent rebuilding,\n" -+ "at the cost of increased block map writes during normal operation.\n" -+ "The maximum and recommended value is 16380; the minimum value is 1.\n") - - cfg(allocation_vdo_check_point_frequency_CFG, "vdo_check_point_frequency", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_CHECK_POINT_FREQUENCY, VDO_1ST_VSN, NULL, 0, NULL, - "The default check point frequency for VDO volume.\n") - -+// vdo format - cfg(allocation_vdo_use_sparse_index_CFG, "vdo_use_sparse_index", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_USE_SPARSE_INDEX, VDO_1ST_VSN, NULL, 0, NULL, - "Enables sparse indexing for VDO volume.\n") - -+// vdo format - cfg(allocation_vdo_index_memory_size_mb_CFG, "vdo_index_memory_size_mb", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_INDEX_MEMORY_SIZE_MB, VDO_1ST_VSN, NULL, 0, NULL, - "Specifies the amount of index memory in MiB for VDO volume.\n" -- "The value must be at least 256MiB and at most 1TiB.\n") -- --cfg(allocation_vdo_use_read_cache_CFG, "vdo_use_read_cache", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_USE_READ_CACHE, VDO_1ST_VSN, NULL, 0, NULL, -- "Enables or disables the read cache within the VDO volume.\n" -- "The cache should be enabled if write workloads are expected\n" -- "to have high levels of deduplication, or for read intensive\n" -- "workloads of highly compressible data.\n") -- --cfg(allocation_vdo_read_cache_size_mb_CFG, "vdo_read_cache_size_mb", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_READ_CACHE_SIZE_MB, VDO_1ST_VSN, NULL, 0, NULL, -- "Specifies the extra VDO volume read cache size in MiB.\n" -- "This space is in addition to a system-defined minimum.\n" -- "The value must be less then 16TiB and 1.12 MiB of memory\n" -- "will be used per MiB of read cache specified, per bio thread.\n") -+ "The value must be at least 256MiB and at most 1TiB.") - - cfg(allocation_vdo_slab_size_mb_CFG, "vdo_slab_size_mb", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_SLAB_SIZE_MB, VDO_1ST_VSN, NULL, 0, NULL, - "Specifies the size in MiB of the increment by which a VDO is grown.\n" - "Using a smaller size constrains the total maximum physical size\n" -- "that can be accommodated. Must be a power of two between 128MiB and 32GiB.\n") -+ "that can be accommodated. Must be a power of two between 128MiB and 32GiB.") - - cfg(allocation_vdo_ack_threads_CFG, "vdo_ack_threads", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_ACK_THREADS, VDO_1ST_VSN, NULL, 0, NULL, -- "Specifies the number of threads to use for acknowledging\n" -+ "Specifies the number of threads to use for acknowledging\n" - "completion of requested VDO I/O operations.\n" - "The value must be at in range [0..100].\n") - -@@ -715,6 +713,16 @@ cfg(allocation_vdo_write_policy_CFG, "vdo_write_policy", allocation_CFG_SECTION, - "async - Writes are acknowledged after data has been cached for writing to stable storage.\n" - " Data which has not been flushed is not guaranteed to persist in this mode.\n") - -+cfg(allocation_vdo_max_discard_CFG, "vdo_max_discard", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_MAX_DISCARD, VDO_1ST_VSN, NULL, 0, NULL, -+ "Specified te maximum size of discard bio accepted, in 4096 byte blocks.\n" -+ "I/O requests to a VDO volume are normally split into 4096-byte blocks,\n" -+ "and processed up to 2048 at a time. However, discard requests to a VDO volume\n" -+ "can be automatically split to a larger size, up to 4096-byte blocks\n" -+ "in a single bio, and are limited to 1500 at a time.\n" -+ "Increasing this value may provide better overall performance, at the cost of\n" -+ "increased latency for the individual discard requests.\n" -+ "The default and minimum is 1. The maximum is UINT_MAX / 4096.\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 f3fcb09..3da29f0 100644 ---- a/lib/config/defaults.h -+++ b/lib/config/defaults.h -@@ -143,14 +143,13 @@ - /* VDO defaults */ - #define DEFAULT_VDO_USE_COMPRESSION (true) - #define DEFAULT_VDO_USE_DEDUPLICATION (true) --#define DEFAULT_VDO_EMULATE_512_SECTORS (false) -+#define DEFAULT_VDO_USE_METADATA_HINTS (true) -+#define DEFAULT_VDO_MINIMUM_IO_SIZE (4096) - #define DEFAULT_VDO_BLOCK_MAP_CACHE_SIZE_MB (DM_VDO_BLOCK_MAP_CACHE_SIZE_MINIMUM_MB) --#define DEFAULT_VDO_BLOCK_MAP_PERIOD (DM_VDO_BLOCK_MAP_PERIOD_MAXIMUM) -+#define DEFAULT_VDO_BLOCK_MAP_ERA_LENGTH (DM_VDO_BLOCK_MAP_ERA_LENGTH_MAXIMUM) - #define DEFAULT_VDO_USE_SPARSE_INDEX (false) - #define DEFAULT_VDO_CHECK_POINT_FREQUENCY (0) - #define DEFAULT_VDO_INDEX_MEMORY_SIZE_MB (DM_VDO_INDEX_MEMORY_SIZE_MINIMUM_MB) --#define DEFAULT_VDO_USE_READ_CACHE (false) --#define DEFAULT_VDO_READ_CACHE_SIZE_MB (0) - #define DEFAULT_VDO_SLAB_SIZE_MB (2 * 1024) // 2GiB ... 19 slabbits - #define DEFAULT_VDO_ACK_THREADS (1) - #define DEFAULT_VDO_BIO_THREADS (1) -@@ -160,6 +159,7 @@ - #define DEFAULT_VDO_LOGICAL_THREADS (1) - #define DEFAULT_VDO_PHYSICAL_THREADS (1) - #define DEFAULT_VDO_WRITE_POLICY "auto" -+#define DEFAULT_VDO_MAX_DISCARD (DM_VDO_MAX_DISCARD_MINIMUM) - - #define DEFAULT_VDO_FORMAT_OPTIONS_CONFIG "#S" "" - /* -diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c -index b5bbbe2..04ab1ab 100644 ---- a/lib/metadata/vdo_manip.c -+++ b/lib/metadata/vdo_manip.c -@@ -416,22 +416,20 @@ int fill_vdo_target_params(struct cmd_context *cmd, - find_config_tree_int(cmd, allocation_vdo_use_compression_CFG, profile); - vtp->use_deduplication = - find_config_tree_int(cmd, allocation_vdo_use_deduplication_CFG, profile); -- vtp->emulate_512_sectors = -- find_config_tree_int(cmd, allocation_vdo_emulate_512_sectors_CFG, profile); -+ vtp->use_metadata_hints = -+ find_config_tree_int(cmd, allocation_vdo_use_metadata_hints_CFG, profile); -+ vtp->minimum_io_size = -+ find_config_tree_int(cmd, allocation_vdo_minimum_io_size_CFG, profile); - vtp->block_map_cache_size_mb = - find_config_tree_int64(cmd, allocation_vdo_block_map_cache_size_mb_CFG, profile); -- vtp->block_map_period = -- find_config_tree_int(cmd, allocation_vdo_block_map_period_CFG, profile); -+ vtp->block_map_era_length = -+ find_config_tree_int(cmd, allocation_vdo_block_map_era_length_CFG, profile); - vtp->check_point_frequency = - find_config_tree_int(cmd, allocation_vdo_check_point_frequency_CFG, profile); - vtp->use_sparse_index = - find_config_tree_int(cmd, allocation_vdo_use_sparse_index_CFG, profile); - vtp->index_memory_size_mb = - find_config_tree_int64(cmd, allocation_vdo_index_memory_size_mb_CFG, profile); -- vtp->use_read_cache = -- find_config_tree_int(cmd, allocation_vdo_use_read_cache_CFG, profile); -- vtp->read_cache_size_mb = -- find_config_tree_int64(cmd, allocation_vdo_read_cache_size_mb_CFG, profile); - vtp->slab_size_mb = - find_config_tree_int(cmd, allocation_vdo_slab_size_mb_CFG, profile); - vtp->ack_threads = -@@ -448,6 +446,8 @@ int fill_vdo_target_params(struct cmd_context *cmd, - find_config_tree_int(cmd, allocation_vdo_logical_threads_CFG, profile); - vtp->physical_threads = - find_config_tree_int(cmd, allocation_vdo_physical_threads_CFG, profile); -+ vtp->max_discard = -+ find_config_tree_int(cmd, allocation_vdo_max_discard_CFG, profile); - - policy = find_config_tree_str(cmd, allocation_vdo_write_policy_CFG, profile); - if (!get_vdo_write_policy(&vtp->write_policy, policy)) -diff --git a/lib/vdo/vdo.c b/lib/vdo/vdo.c -index 455ce5b..c34eb93 100644 ---- a/lib/vdo/vdo.c -+++ b/lib/vdo/vdo.c -@@ -165,21 +165,19 @@ static void _vdo_pool_display(const struct lv_segment *seg) - - _print_yes_no("Compression\t", vtp->use_compression); - _print_yes_no("Deduplication", vtp->use_deduplication); -- _print_yes_no("Emulate 512 sectors", vtp->emulate_512_sectors); -+ _print_yes_no("Metadata hints", vtp->use_metadata_hints); - -+ log_print(" Minimum IO size\t%s", -+ display_size(cmd, vtp->minimum_io_size)); - log_print(" Block map cache sz\t%s", - display_size(cmd, vtp->block_map_cache_size_mb * UINT64_C(2 * 1024))); -- log_print(" Block map period\t%u", vtp->block_map_period); -+ log_print(" Block map era length\t%u", vtp->block_map_era_length); - - _print_yes_no("Sparse index", vtp->use_sparse_index); - - log_print(" Index memory size\t%s", - display_size(cmd, vtp->index_memory_size_mb * UINT64_C(2 * 1024))); - -- _print_yes_no("Using read cache", vtp->use_read_cache); -- -- log_print(" Read cache size\t%s", -- display_size(cmd, vtp->read_cache_size_mb * UINT64_C(2 * 1024))); - log_print(" Slab size\t\t%s", - display_size(cmd, vtp->slab_size_mb * UINT64_C(2 * 1024))); - -@@ -190,6 +188,7 @@ static void _vdo_pool_display(const struct lv_segment *seg) - log_print(" # Hash zone threads\t%u", (unsigned) vtp->hash_zone_threads); - log_print(" # Logical threads\t%u", (unsigned) vtp->logical_threads); - log_print(" # Physical threads\t%u", (unsigned) vtp->physical_threads); -+ log_print(" Max discard\t%u", (unsigned) vtp->max_discard); - } - - /* reused as _vdo_text_import_area_count */ -@@ -235,14 +234,17 @@ static int _vdo_pool_text_import(struct lv_segment *seg, - if (!_import_bool(n, "use_deduplication", &vtp->use_deduplication)) - return_0; - -- if (!_import_bool(n, "emulate_512_sectors", &vtp->emulate_512_sectors)) -+ if (!_import_bool(n, "use_metadata_hints", &vtp->use_metadata_hints)) - return_0; - -+ if (!dm_config_get_uint32(n, "minimum_io_size", &vtp->minimum_io_size)) -+ return _bad_field("minimum_io_size"); -+ - if (!dm_config_get_uint32(n, "block_map_cache_size_mb", &vtp->block_map_cache_size_mb)) - return _bad_field("block_map_cache_size_mb"); - -- if (!dm_config_get_uint32(n, "block_map_period", &vtp->block_map_period)) -- return _bad_field("block_map_period"); -+ if (!dm_config_get_uint32(n, "block_map_era_length", &vtp->block_map_era_length)) -+ return _bad_field("block_map_era_length"); - - if (!_import_bool(n, "use_sparse_index", &vtp->use_sparse_index)) - return_0; -@@ -250,11 +252,8 @@ static int _vdo_pool_text_import(struct lv_segment *seg, - if (!dm_config_get_uint32(n, "index_memory_size_mb", &vtp->index_memory_size_mb)) - return _bad_field("index_memory_size_mb"); - -- if (!_import_bool(n, "use_read_cache", &vtp->use_read_cache)) -- return_0; -- -- if (!dm_config_get_uint32(n, "read_cache_size_mb", &vtp->read_cache_size_mb)) -- return _bad_field("read_cache_size_mb"); -+ if (!dm_config_get_uint32(n, "max_discard", &vtp->max_discard)) -+ return _bad_field("max_discard"); - - if (!dm_config_get_uint32(n, "slab_size_mb", &vtp->slab_size_mb)) - return _bad_field("slab_size_mb"); -@@ -306,12 +305,14 @@ static int _vdo_pool_text_export(const struct lv_segment *seg, struct formatter - outf(f, "use_compression = 1"); - if (vtp->use_deduplication) - outf(f, "use_deduplication = 1"); -- if (vtp->emulate_512_sectors) -- outf(f, "emulate_512_sectors = 1"); -+ if (vtp->use_metadata_hints) -+ outf(f, "use_metadata_hints = 1"); -+ -+ outsize(f, vtp->minimum_io_size, "minimum_io_size = %u", vtp->minimum_io_size); - - outsize(f, vtp->block_map_cache_size_mb * UINT64_C(2 * 1024), - "block_map_cache_size_mb = %u", vtp->block_map_cache_size_mb); -- outf(f, "block_map_period = %u", vtp->block_map_period); -+ outf(f, "block_map_era_length = %u", vtp->block_map_era_length); - - if (vtp->use_sparse_index) - outf(f, "use_sparse_index = 1"); -@@ -319,11 +320,9 @@ static int _vdo_pool_text_export(const struct lv_segment *seg, struct formatter - outsize(f, vtp->index_memory_size_mb * UINT64_C(2 * 1024), - "index_memory_size_mb = %u", vtp->index_memory_size_mb); - -- if (vtp->use_read_cache) -- outf(f, "use_read_cache = 1"); -+ outf(f, "max_discard = %u", vtp->max_discard); -+ - // TODO - conditionally -- outsize(f, vtp->read_cache_size_mb * UINT64_C(2 * 1024), -- "read_cache_size_mb = %u", vtp->read_cache_size_mb); - outsize(f, vtp->slab_size_mb * UINT64_C(2 * 1024), - "slab_size_mb = %u", vtp->slab_size_mb); - outf(f, "ack_threads = %u", (unsigned) vtp->ack_threads); -@@ -364,7 +363,8 @@ static int _vdo_pool_add_target_line(struct dev_manager *dm, - - /* VDO uses virtual size instead of its physical size */ - if (!dm_tree_node_add_vdo_target(node, get_vdo_pool_virtual_size(seg), -- data_uuid, &seg->vdo_params)) -+ data_uuid, seg_lv(seg, 0)->size, -+ &seg->vdo_params)) - return_0; - - return 1; diff --git a/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier-with-l.patch b/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier-with-l.patch deleted file mode 100644 index b704cda..0000000 --- a/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier-with-l.patch +++ /dev/null @@ -1,18 +0,0 @@ - lib/metadata/lv_manip.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 0c54b2c..ef7b58d 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -5022,8 +5022,8 @@ static int _lvresize_extents_from_percent(const struct logical_volume *lv, - case PERCENT_VG: - lp->extents = percent_of_extents(lp->extents, vg->extent_count, - (lp->sign != SIGN_MINUS)); -- if (lp->sign == SIGN_NONE && lp->extents > vg->free_count) { -- lp->extents = vg->free_count; -+ if ((lp->sign == SIGN_NONE) && (lp->extents > (lv->le_count + vg->free_count))) { -+ lp->extents = lv->le_count + vg->free_count; - log_print_unless_silent("Reducing %u%%VG to remaining free space %s in VG.", - old_extents, - display_size(vg->cmd, (uint64_t)vg->extent_size * lp->extents)); diff --git a/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier.patch b/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier.patch deleted file mode 100644 index 64ebac4..0000000 --- a/SOURCES/lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier.patch +++ /dev/null @@ -1,79 +0,0 @@ -From afb4290111b67b5abb2cb75e543f3605f605b92b Mon Sep 17 00:00:00 2001 -From: Zdenek Kabelac -Date: Fri, 18 Jan 2019 22:27:02 +0100 -Subject: [PATCH 01/17] lv_manip: better work with PERCENT_VG modifier - -When using 'lvcreate -l100%VG' and there is big disproportion between -real available space and requested setting - automatically fallback -to 100%FREE. - -Difference can be seen when VG is big and already most space was -allocated, so the requestion 100%VG can end (and by spec for % modifier -it's correct) as LV with size of 1%VG. Usually this is not a big -problem - buit in some cases - like cache-pool allocation, this -can result a big difference for chunksize selection. - -With this patch it's more closely match common-sense logic without -the need of reitteration of too big changes in lvm2 core ATM. - -TODO: in the future there should be allocator solving all allocations -in a single call. - -(cherry picked from commit 022ebb0cfebee4ac8fdbe4e0c61e85db1038a115) - -Conflicts: - WHATS_NEW ---- - WHATS_NEW | 1 + - lib/metadata/lv_manip.c | 6 ++++++ - tools/lvcreate.c | 6 ++++++ - 3 files changed, 13 insertions(+) - -diff --git a/WHATS_NEW b/WHATS_NEW -index f429d27..152fa5e 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Improve -lXXX%VG modifier which improves cache segment estimation. - Ensure migration_threshold for cache is at least 8 chunks. - Move VDO support towards V2 target (6.2) support. - -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 9794074..0c54b2c 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -5022,6 +5022,12 @@ static int _lvresize_extents_from_percent(const struct logical_volume *lv, - case PERCENT_VG: - lp->extents = percent_of_extents(lp->extents, vg->extent_count, - (lp->sign != SIGN_MINUS)); -+ if (lp->sign == SIGN_NONE && lp->extents > vg->free_count) { -+ lp->extents = vg->free_count; -+ log_print_unless_silent("Reducing %u%%VG to remaining free space %s in VG.", -+ old_extents, -+ display_size(vg->cmd, (uint64_t)vg->extent_size * lp->extents)); -+ } - break; - case PERCENT_FREE: - lp->extents = percent_of_extents(lp->extents, vg->free_count, -diff --git a/tools/lvcreate.c b/tools/lvcreate.c -index 3c22794..ebe51d9 100644 ---- a/tools/lvcreate.c -+++ b/tools/lvcreate.c -@@ -278,6 +278,12 @@ static int _update_extents_params(struct volume_group *vg, - switch (lcp->percent) { - case PERCENT_VG: - extents = percent_of_extents(lp->extents, base_calc_extents = vg->extent_count, 0); -+ if (extents > vg->free_count) { -+ extents = vg->free_count; -+ log_print_unless_silent("Reducing %u%%VG to remaining free space %s in VG.", -+ lp->extents, -+ display_size(vg->cmd, (uint64_t)vg->extent_size * extents)); -+ } - break; - case PERCENT_FREE: - extents = percent_of_extents(lp->extents, base_calc_extents = vg->free_count, 0); --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-lvcreate-lvconvert-optionally-reenable-mirrored-mirr.patch b/SOURCES/lvm2-2_03_03-lvcreate-lvconvert-optionally-reenable-mirrored-mirr.patch deleted file mode 100644 index ef4c5f2..0000000 --- a/SOURCES/lvm2-2_03_03-lvcreate-lvconvert-optionally-reenable-mirrored-mirr.patch +++ /dev/null @@ -1,222 +0,0 @@ - conf/example.conf.in | 11 +++++++++++ - lib/config/config_settings.h | 11 +++++++++++ - lib/metadata/mirror.c | 10 +++++++--- - test/shell/lvconvert-mirror.sh | 2 ++ - test/shell/lvconvert-repair-replace.sh | 4 +++- - test/shell/lvconvert-repair.sh | 4 +++- - test/shell/lvconvert-twostep.sh | 4 +++- - test/shell/lvcreate-operation.sh | 4 +++- - test/shell/snapshots-of-mirrors.sh | 4 +++- - test/shell/vgsplit-operation.sh | 4 +++- - 10 files changed, 49 insertions(+), 9 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index 7e29aaa..0c2d378 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -897,6 +897,17 @@ global { - # - mirror_segtype_default = "@DEFAULT_MIRROR_SEGTYPE@" - -+ # Configuration option global/support_mirrored_mirror_log. -+ # Enable mirrored 'mirror' log type for testing. -+ # -+ # This type is deprecated to create or convert to but can -+ # be enabled to test that activation of existing mirrored -+ # logs and conversion to disk/core works. -+ # -+ # Not supported for regular operation! -+ # -+ support_mirrored_mirror_log = 0 -+ - # Configuration option global/raid10_segtype_default. - # The segment type used by the -i -m combination. - # The --type raid10|mirror option overrides this setting. -diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index b725343..92ceb04 100644 ---- a/lib/config/config_settings.h -+++ b/lib/config/config_settings.h -@@ -961,6 +961,17 @@ cfg(global_mirror_segtype_default_CFG, "mirror_segtype_default", global_CFG_SECT - " fashion in a cluster.\n" - "#\n") - -+cfg(global_support_mirrored_mirror_log_CFG, "support_mirrored_mirror_log", global_CFG_SECTION, 0, CFG_TYPE_BOOL, 0, vsn(2, 3, 2), NULL, 0, NULL, -+ "Configuration option global/support_mirrored_mirror_log.\n" -+ "Enable mirrored 'mirror' log type for testing.\n" -+ "#\n" -+ "This type is deprecated to create or convert to but can\n" -+ "be enabled to test that activation of existing mirrored\n" -+ "logs and conversion to disk/core works.\n" -+ "#\n" -+ "Not supported for regular operation!\n" -+ "\n") -+ - cfg(global_raid10_segtype_default_CFG, "raid10_segtype_default", global_CFG_SECTION, 0, CFG_TYPE_STRING, DEFAULT_RAID10_SEGTYPE, vsn(2, 2, 99), "@DEFAULT_RAID10_SEGTYPE@", 0, NULL, - "The segment type used by the -i -m combination.\n" - "The --type raid10|mirror option overrides this setting.\n" -diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c -index 8b20979..6950546 100644 ---- a/lib/metadata/mirror.c -+++ b/lib/metadata/mirror.c -@@ -1,6 +1,6 @@ - /* - * Copyright (C) 2003-2004 Sistina Software, Inc. All rights reserved. -- * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2004-2008,2018 Red Hat, Inc. All rights reserved. - * - * This file is part of LVM2. - * -@@ -1908,8 +1908,12 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv, - } - - if (log_count > 1) { -- log_err("Log type \"mirrored\" is DEPRECATED. Use RAID1 LV or disk log instead."); -- return 0; -+ if (find_config_tree_bool(cmd, global_support_mirrored_mirror_log_CFG, NULL)) -+ log_warn("Log type \"mirrored\" creation/conversion is not supported for regular operation!"); -+ else { -+ log_err("Log type \"mirrored\" is DEPRECATED. Use RAID1 LV or disk log instead."); -+ return 0; -+ } - } - - if (!(parallel_areas = build_parallel_areas_from_lv(lv, 0, 0))) -diff --git a/test/shell/lvconvert-mirror.sh b/test/shell/lvconvert-mirror.sh -index 39ba1c5..a422557 100644 ---- a/test/shell/lvconvert-mirror.sh -+++ b/test/shell/lvconvert-mirror.sh -@@ -14,6 +14,8 @@ - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - aux prepare_pvs 5 - get_devs - -diff --git a/test/shell/lvconvert-repair-replace.sh b/test/shell/lvconvert-repair-replace.sh -index 3d1cd66..cd17e0b 100644 ---- a/test/shell/lvconvert-repair-replace.sh -+++ b/test/shell/lvconvert-repair-replace.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2008 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2008,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -14,6 +14,8 @@ - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - aux prepare_vg 6 - aux lvmconf 'allocation/maximise_cling = 0' \ - 'allocation/mirror_logs_require_separate_pvs = 1' -diff --git a/test/shell/lvconvert-repair.sh b/test/shell/lvconvert-repair.sh -index 713c00f..06470c4 100644 ---- a/test/shell/lvconvert-repair.sh -+++ b/test/shell/lvconvert-repair.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2008-2013,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -12,6 +12,8 @@ - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - recreate_vg_() - { - vgremove -ff $vg -diff --git a/test/shell/lvconvert-twostep.sh b/test/shell/lvconvert-twostep.sh -index 4bd499e..7487d51 100644 ---- a/test/shell/lvconvert-twostep.sh -+++ b/test/shell/lvconvert-twostep.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2010 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2010,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -14,6 +14,8 @@ - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - aux prepare_vg 4 - - lvcreate -aey --type mirror -m 1 --mirrorlog disk --ignoremonitoring -L 1 -n mirror $vg -diff --git a/test/shell/lvcreate-operation.sh b/test/shell/lvcreate-operation.sh -index 3d4cf43..807f176 100644 ---- a/test/shell/lvcreate-operation.sh -+++ b/test/shell/lvcreate-operation.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2008 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2008,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -17,6 +17,8 @@ SKIP_WITH_LVMPOLLD=1 - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - cleanup_lvs() { - lvremove -ff $vg - (dm_table | not grep $vg) || \ -diff --git a/test/shell/snapshots-of-mirrors.sh b/test/shell/snapshots-of-mirrors.sh -index 5ab45dd..1f2c393 100644 ---- a/test/shell/snapshots-of-mirrors.sh -+++ b/test/shell/snapshots-of-mirrors.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2010 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2010,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -14,6 +14,8 @@ - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - aux prepare_vg 4 - - lvcreate -aey --type mirror -m 1 -L 10M --nosync -n lv $vg -diff --git a/test/shell/vgsplit-operation.sh b/test/shell/vgsplit-operation.sh -index 5927dfa..36b75f5 100644 ---- a/test/shell/vgsplit-operation.sh -+++ b/test/shell/vgsplit-operation.sh -@@ -1,6 +1,6 @@ - #!/usr/bin/env bash - --# Copyright (C) 2007 Red Hat, Inc. All rights reserved. -+# Copyright (C) 2007,2018 Red Hat, Inc. All rights reserved. - # - # This copyrighted material is made available to anyone wishing to use, - # modify, copy, or redistribute it subject to the terms and conditions -@@ -17,6 +17,8 @@ SKIP_WITH_LVMPOLLD=1 - - . lib/inittest - -+aux lvmconf "global/support_mirrored_mirror_log=1" -+ - COMM() { - LAST_TEST="$*" - } diff --git a/SOURCES/lvm2-2_03_03-lvmdbusd-Exit-daemon-when-unable-to-retrieve-state.patch b/SOURCES/lvm2-2_03_03-lvmdbusd-Exit-daemon-when-unable-to-retrieve-state.patch deleted file mode 100644 index fec5cb4..0000000 --- a/SOURCES/lvm2-2_03_03-lvmdbusd-Exit-daemon-when-unable-to-retrieve-state.patch +++ /dev/null @@ -1,71 +0,0 @@ - daemons/lvmdbusd/cfg.py | 10 ++++++++++ - daemons/lvmdbusd/fetch.py | 19 ++++++++++++++++++- - 2 files changed, 28 insertions(+), 1 deletion(-) - -diff --git a/daemons/lvmdbusd/cfg.py b/daemons/lvmdbusd/cfg.py -index 771909f..be497d0 100644 ---- a/daemons/lvmdbusd/cfg.py -+++ b/daemons/lvmdbusd/cfg.py -@@ -87,3 +87,13 @@ blackbox = None - - # RequestEntry ctor - create_request_entry = None -+ -+ -+def exit_daemon(): -+ """ -+ Exit the daemon cleanly -+ :return: -+ """ -+ if run and loop: -+ run.value = 0 -+ loop.quit() -diff --git a/daemons/lvmdbusd/fetch.py b/daemons/lvmdbusd/fetch.py -index 69a4aae..e8f3521 100644 ---- a/daemons/lvmdbusd/fetch.py -+++ b/daemons/lvmdbusd/fetch.py -@@ -14,6 +14,7 @@ from . import cfg - from .utils import MThreadRunner, log_debug, log_error - import threading - import queue -+import time - import traceback - - -@@ -82,6 +83,8 @@ class StateUpdate(object): - - @staticmethod - def update_thread(obj): -+ exception_count = 0 -+ - queued_requests = [] - while cfg.run.value != 0: - # noinspection PyBroadException -@@ -136,12 +139,26 @@ class StateUpdate(object): - # wake up if we get an exception - queued_requests = [] - -+ # We retrieved OK, clear exception count -+ exception_count = 0 -+ - except queue.Empty: - pass -- except Exception: -+ except Exception as e: - st = traceback.format_exc() - log_error("update_thread exception: \n%s" % st) - cfg.blackbox.dump() -+ exception_count += 1 -+ if exception_count >= 5: -+ for i in queued_requests: -+ i.set_result(e) -+ -+ log_error("Too many errors in update_thread, exiting daemon") -+ cfg.exit_daemon() -+ -+ else: -+ # Slow things down when encountering errors -+ time.sleep(1) - - def __init__(self): - self.lock = threading.RLock() diff --git a/SOURCES/lvm2-2_03_03-lvmdbusd-Handle-exported-VG-s.patch b/SOURCES/lvm2-2_03_03-lvmdbusd-Handle-exported-VG-s.patch deleted file mode 100644 index bb76ad8..0000000 --- a/SOURCES/lvm2-2_03_03-lvmdbusd-Handle-exported-VG-s.patch +++ /dev/null @@ -1,34 +0,0 @@ - daemons/lvmdbusd/cmdhandler.py | 3 ++- - daemons/lvmdbusd/lvm_shell_proxy.py.in | 5 ++++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/daemons/lvmdbusd/cmdhandler.py b/daemons/lvmdbusd/cmdhandler.py -index a9177c5..fde7f5e 100644 ---- a/daemons/lvmdbusd/cmdhandler.py -+++ b/daemons/lvmdbusd/cmdhandler.py -@@ -497,7 +497,8 @@ def lvm_full_report_json(): - ]) - - rc, out, err = call(cmd) -- if rc == 0: -+ # When we have an exported vg the exit code of lvs or fullreport will be 5 -+ if rc == 0 or rc == 5: - # With the current implementation, if we are using the shell then we - # are using JSON and JSON is returned back to us as it was parsed to - # figure out if we completed OK or not -diff --git a/daemons/lvmdbusd/lvm_shell_proxy.py.in b/daemons/lvmdbusd/lvm_shell_proxy.py.in -index 203de6f..b76b336 100644 ---- a/daemons/lvmdbusd/lvm_shell_proxy.py.in -+++ b/daemons/lvmdbusd/lvm_shell_proxy.py.in -@@ -220,7 +220,10 @@ class LVMShellProxy(object): - - # Parse the report to see what happened - if 'log' in report_json: -- if report_json['log'][-1:][0]['log_ret_code'] == '1': -+ ret_code = int(report_json['log'][-1:][0]['log_ret_code']) -+ # If we have an exported vg we get a log_ret_code == 5 when -+ # we do a 'fullreport' -+ if (ret_code == 1) or (ret_code == 5 and argv[0] == 'fullreport'): - rc = 0 - else: - error_msg = self.get_error_msg() diff --git a/SOURCES/lvm2-2_03_03-lvmlockd-Fix-arguments-when-built-without-sanlock.patch b/SOURCES/lvm2-2_03_03-lvmlockd-Fix-arguments-when-built-without-sanlock.patch deleted file mode 100644 index 26a6bf7..0000000 --- a/SOURCES/lvm2-2_03_03-lvmlockd-Fix-arguments-when-built-without-sanlock.patch +++ /dev/null @@ -1,25 +0,0 @@ - daemons/lvmlockd/lvmlockd-internal.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/daemons/lvmlockd/lvmlockd-internal.h b/daemons/lvmlockd/lvmlockd-internal.h -index d8048d8..a2280b8 100644 ---- a/daemons/lvmlockd/lvmlockd-internal.h -+++ b/daemons/lvmlockd/lvmlockd-internal.h -@@ -502,7 +502,7 @@ static inline int lm_init_vg_sanlock(char *ls_name, char *vg_name, uint32_t flag - return -1; - } - --static inline int lm_init_lv_sanlock(char *ls_name, char *vg_name, char *lv_name, char *vg_args, char *lv_args, int sector_size, int align_size, uint64_t free_offset) -+static inline int lm_init_lv_sanlock(char *ls_name, char *vg_name, char *lv_name, char *vg_args, char *lv_args, uint64_t free_offset) - { - return -1; - } -@@ -590,7 +590,7 @@ static inline int lm_is_running_sanlock(void) - return 0; - } - --static inline int lm_find_free_lock_sanlock(struct lockspace *ls, uint64_t *free_offset, int *sector_size, int *align_size) -+static inline int lm_find_free_lock_sanlock(struct lockspace *ls, uint64_t *free_offset) - { - return -1; - } diff --git a/SOURCES/lvm2-2_03_03-lvmlockd-fix-make-lockstart-wait.patch b/SOURCES/lvm2-2_03_03-lvmlockd-fix-make-lockstart-wait.patch deleted file mode 100644 index c9571aa..0000000 --- a/SOURCES/lvm2-2_03_03-lvmlockd-fix-make-lockstart-wait.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 3523651432864901f60d28b8ae3767218f4b39d3 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Wed, 16 Jan 2019 13:24:29 -0600 -Subject: [PATCH 5/5] lvmlockd: fix make lockstart wait - -when building without lvmlockd ---- - lib/locking/lvmlockd.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/locking/lvmlockd.h b/lib/locking/lvmlockd.h -index 1fbf765..e5ae331 100644 ---- a/lib/locking/lvmlockd.h -+++ b/lib/locking/lvmlockd.h -@@ -148,7 +148,7 @@ static inline int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_g - return 1; - } - --static inline int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init) -+static inline int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init, int *exists) - { - return 0; - } --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-lvmlockd-make-lockstart-wait-for-existing-start.patch b/SOURCES/lvm2-2_03_03-lvmlockd-make-lockstart-wait-for-existing-start.patch deleted file mode 100644 index b13dd48..0000000 --- a/SOURCES/lvm2-2_03_03-lvmlockd-make-lockstart-wait-for-existing-start.patch +++ /dev/null @@ -1,168 +0,0 @@ -From 887f6099e6f6b662df356e7d26102ff84aa0c901 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Wed, 16 Jan 2019 10:41:43 -0600 -Subject: [PATCH 4/5] lvmlockd: make lockstart wait for existing start - -If there are two independent scripts doing: - vgchange --lockstart vg - lvchange -ay vg/lv - -The first vgchange to do the lockstart will wait for -the lockstart to complete before returning. -The second vgchange to do the lockstart will see that -the start is already in progress (from the first) and -will do nothing. This means the second does not wait -for any lockstart to complete, and moves on to the -lvchange which may find the lockspace still starting -and fail. - -To fix this, make the vgchange lockstart command -wait for any lockstart's in progress to complete. ---- - daemons/lvmlockd/lvmlockd-core.c | 9 ++++++--- - lib/locking/lvmlockd.c | 12 +++++++++--- - lib/locking/lvmlockd.h | 2 +- - tools/vgchange.c | 5 ++++- - tools/vgcreate.c | 2 +- - 5 files changed, 21 insertions(+), 9 deletions(-) - -diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c -index a9ce6fc..e2d4595 100644 ---- a/daemons/lvmlockd/lvmlockd-core.c -+++ b/daemons/lvmlockd/lvmlockd-core.c -@@ -2742,6 +2742,9 @@ static int add_lockspace_thread(const char *ls_name, - if (ls2->thread_stop) { - log_debug("add_lockspace_thread %s exists and stopping", ls->name); - rv = -EAGAIN; -+ } else if (!ls2->create_fail && !ls2->create_done) { -+ log_debug("add_lockspace_thread %s exists and starting", ls->name); -+ rv = -ESTARTING; - } else { - log_debug("add_lockspace_thread %s exists", ls->name); - rv = -EEXIST; -@@ -2983,7 +2986,7 @@ static int count_lockspace_starting(uint32_t client_id) - - pthread_mutex_lock(&lockspaces_mutex); - list_for_each_entry(ls, &lockspaces, list) { -- if (ls->start_client_id != client_id) -+ if (client_id && (ls->start_client_id != client_id)) - continue; - - if (!ls->create_done && !ls->create_fail) { -@@ -3384,7 +3387,7 @@ static void *worker_thread_main(void *arg_in) - add_client_result(act); - - } else if (act->op == LD_OP_START_WAIT) { -- act->result = count_lockspace_starting(act->client_id); -+ act->result = count_lockspace_starting(0); - if (!act->result) - add_client_result(act); - else -@@ -3418,7 +3421,7 @@ static void *worker_thread_main(void *arg_in) - list_for_each_entry_safe(act, safe, &delayed_list, list) { - if (act->op == LD_OP_START_WAIT) { - log_debug("work delayed start_wait for client %u", act->client_id); -- act->result = count_lockspace_starting(act->client_id); -+ act->result = count_lockspace_starting(0); - if (!act->result) { - list_del(&act->list); - add_client_result(act); -diff --git a/lib/locking/lvmlockd.c b/lib/locking/lvmlockd.c -index 969a7fe..6168630 100644 ---- a/lib/locking/lvmlockd.c -+++ b/lib/locking/lvmlockd.c -@@ -1077,7 +1077,7 @@ void lockd_free_vg_final(struct cmd_context *cmd, struct volume_group *vg) - * that the VG lockspace being started is new. - */ - --int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init) -+int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init, int *exists) - { - char uuid[64] __attribute__((aligned(8))); - daemon_reply reply; -@@ -1152,6 +1152,12 @@ int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_i - log_debug("VG %s start error: already started", vg->name); - ret = 1; - break; -+ case -ESTARTING: -+ log_debug("VG %s start error: already starting", vg->name); -+ if (exists) -+ *exists = 1; -+ ret = 1; -+ break; - case -EARGS: - log_error("VG %s start failed: invalid parameters for %s", vg->name, vg->lock_type); - break; -@@ -2673,7 +2679,7 @@ int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_group *vg, int - * Depending on the problem that caused the rename to - * fail, it may make sense to not restart the VG here. - */ -- if (!lockd_start_vg(cmd, vg, 0)) -+ if (!lockd_start_vg(cmd, vg, 0, NULL)) - log_error("Failed to restart VG %s lockspace.", vg->name); - return 1; - } -@@ -2713,7 +2719,7 @@ int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_group *vg, int - } - } - -- if (!lockd_start_vg(cmd, vg, 1)) -+ if (!lockd_start_vg(cmd, vg, 1, NULL)) - log_error("Failed to start VG %s lockspace.", vg->name); - - return 1; -diff --git a/lib/locking/lvmlockd.h b/lib/locking/lvmlockd.h -index 0a6ea96..1fbf765 100644 ---- a/lib/locking/lvmlockd.h -+++ b/lib/locking/lvmlockd.h -@@ -63,7 +63,7 @@ int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_group *vg, int - - /* start and stop the lockspace for a vg */ - --int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init); -+int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_init, int *exists); - int lockd_stop_vg(struct cmd_context *cmd, struct volume_group *vg); - int lockd_start_wait(struct cmd_context *cmd); - -diff --git a/tools/vgchange.c b/tools/vgchange.c -index 0f9241c..f3d535c 100644 ---- a/tools/vgchange.c -+++ b/tools/vgchange.c -@@ -560,6 +560,7 @@ static int _vgchange_lock_start(struct cmd_context *cmd, struct volume_group *vg - { - const char *start_opt = arg_str_value(cmd, lockopt_ARG, NULL); - int auto_opt = 0; -+ int exists = 0; - int r; - - if (!vg_is_shared(vg)) -@@ -586,10 +587,12 @@ static int _vgchange_lock_start(struct cmd_context *cmd, struct volume_group *vg - } - - do_start: -- r = lockd_start_vg(cmd, vg, 0); -+ r = lockd_start_vg(cmd, vg, 0, &exists); - - if (r) - vp->lock_start_count++; -+ else if (exists) -+ vp->lock_start_count++; - if (!strcmp(vg->lock_type, "sanlock")) - vp->lock_start_sanlock = 1; - -diff --git a/tools/vgcreate.c b/tools/vgcreate.c -index 2a40bc7..b595349 100644 ---- a/tools/vgcreate.c -+++ b/tools/vgcreate.c -@@ -202,7 +202,7 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) - if (vg_is_shared(vg)) { - const char *start_opt = arg_str_value(cmd, lockopt_ARG, NULL); - -- if (!lockd_start_vg(cmd, vg, 1)) { -+ if (!lockd_start_vg(cmd, vg, 1, NULL)) { - log_error("Failed to start locking"); - goto out; - } --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-man-document-dD-attrs-for-VDO-lvs.patch b/SOURCES/lvm2-2_03_03-man-document-dD-attrs-for-VDO-lvs.patch deleted file mode 100644 index 571e56b..0000000 --- a/SOURCES/lvm2-2_03_03-man-document-dD-attrs-for-VDO-lvs.patch +++ /dev/null @@ -1,36 +0,0 @@ - man/lvs.8_end | 5 +++-- - man/lvs.8_pregen | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/man/lvs.8_end b/man/lvs.8_end -index 4f83516..6efc9cb 100644 ---- a/man/lvs.8_end -+++ b/man/lvs.8_end -@@ -6,8 +6,9 @@ Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin, - (O)rigin with merging snapshot, (r)aid, (R)aid without initial sync, - (s)napshot, merging (S)napshot, (p)vmove, (v)irtual, - mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device, --under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or --pool m(e)tadata or pool metadata spare. -+under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, -+v(d)o pool, v(D)o pool data, -+raid or pool m(e)tadata or pool metadata spare. - .IP 2 3 - Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only - volume -diff --git a/man/lvs.8_pregen b/man/lvs.8_pregen -index 9659b70..c92ba14 100644 ---- a/man/lvs.8_pregen -+++ b/man/lvs.8_pregen -@@ -519,8 +519,9 @@ Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin, - (O)rigin with merging snapshot, (r)aid, (R)aid without initial sync, - (s)napshot, merging (S)napshot, (p)vmove, (v)irtual, - mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device, --under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or --pool m(e)tadata or pool metadata spare. -+under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, -+v(d)o pool, v(D)o pool data, -+raid or pool m(e)tadata or pool metadata spare. - .IP 2 3 - Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only - volume diff --git a/SOURCES/lvm2-2_03_03-man-initial-man-page-for-VDO-support.patch b/SOURCES/lvm2-2_03_03-man-initial-man-page-for-VDO-support.patch deleted file mode 100644 index 2c1482b..0000000 --- a/SOURCES/lvm2-2_03_03-man-initial-man-page-for-VDO-support.patch +++ /dev/null @@ -1,273 +0,0 @@ - man/Makefile.in | 3 +- - man/lvmvdo.7_main | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 243 insertions(+), 1 deletion(-) - create mode 100644 man/lvmvdo.7_main - -diff --git a/man/Makefile.in b/man/Makefile.in -index e73f834..114e92b 100644 ---- a/man/Makefile.in -+++ b/man/Makefile.in -@@ -33,6 +33,7 @@ LVMCACHEMAN = lvmcache.7 - LVMTHINMAN = lvmthin.7 - LVMDBUSDMAN = lvmdbusd.8 - LVMRAIDMAN = lvmraid.7 -+LVMVDOMAN = lvmvdo.7 - - MAN5=lvm.conf.5 - MAN7=lvmsystemid.7 lvmreport.7 -@@ -96,7 +97,7 @@ else - endif - endif - --MAN7+=$(LVMCACHEMAN) $(LVMTHINMAN) $(LVMRAIDMAN) -+MAN7+=$(LVMCACHEMAN) $(LVMTHINMAN) $(LVMRAIDMAN) $(LVMVDOMAN) - MAN5DIR=$(mandir)/man5 - MAN7DIR=$(mandir)/man7 - MAN8DIR=$(mandir)/man8 -diff --git a/man/lvmvdo.7_main b/man/lvmvdo.7_main -new file mode 100644 -index 0000000..e789f7f ---- /dev/null -+++ b/man/lvmvdo.7_main -@@ -0,0 +1,241 @@ -+.TH "LVMVDO" "7" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" -+ -+.SH NAME -+lvmvdo \(em EXPERIMENTAL LVM Virtual Data Optimizer support -+ -+.SH DESCRIPTION -+ -+ -+VDO (which includes kvdo and vdo) is software that provides inline -+block-level deduplication, compression, and thin provisioning capabilities -+for primary storage. -+ -+Deduplication is a technique for reducing the consumption of storage -+resources by eliminating multiple copies of duplicate blocks. Compression -+takes the individual unique blocks and shrinks them with coding -+algorithms; these reduced blocks are then efficiently packed together into -+physical blocks. Thin provisioning manages the mapping from LBAs presented -+by VDO to where the data has actually been stored, and also eliminates any -+blocks of all zeroes. -+ -+With deduplication, instead of writing the same data more than once each -+duplicate block is detected and recorded as a reference to the original -+block. VDO maintains a mapping from logical block addresses (used by the -+storage layer above VDO) to physical block addresses (used by the storage -+layer under VDO). After deduplication, multiple logical block addresses -+may be mapped to the same physical block address; these are called shared -+blocks and are reference-counted by the software. -+ -+With VDO's compression, multiple blocks (or shared blocks) are compressed -+with the fast LZ4 algorithm, and binned together where possible so that -+multiple compressed blocks fit within a 4 KB block on the underlying -+storage. Mapping from LBA is to a physical block address and index within -+it for the desired compressed data. All compressed blocks are individually -+reference counted for correctness. -+ -+Block sharing and block compression are invisible to applications using -+the storage, which read and write blocks as they would if VDO were not -+present. When a shared block is overwritten, a new physical block is -+allocated for storing the new block data to ensure that other logical -+block addresses that are mapped to the shared physical block are not -+modified. -+ -+For usage of VDO with \fBlvm\fP(8) standard VDO userspace tools -+\fBvdoformat\fP(8) and currently non-standard kernel VDO module -+"\fIkvdo\fP" needs to be installed on the system. -+ -+The "\fIkvdo\fP" module implements fine-grained storage virtualization, -+thin provisioning, block sharing, and compression; -+the "\fIuds\fP" module provides memory-efficient duplicate -+identification. The userspace tools include \fBvdostats\fP(8) -+for extracting statistics from those volumes. -+ -+ -+.SH VDO Terms -+ -+.TP -+VDODataLV -+.br -+VDO data LV -+.br -+large hidden LV with suffix _vdata created in a VG. -+.br -+used by VDO target to store all data and metadata blocks. -+ -+.TP -+VDOPoolLV -+.br -+VDO pool LV -+.br -+maintains virtual for LV(s) stored in attached VDO data LV -+and it has same size. -+.br -+contains VDOLV(s) (currently supports only a single VDOLV). -+ -+.TP -+VDOLV -+.br -+VDO LV -+.br -+created from VDOPoolLV -+.br -+appears blank after creation -+ -+.SH VDO Usage -+ -+The primary methods for using VDO with lvm2: -+ -+.SS 1. Create VDOPoolLV with VDOLV -+ -+Create an VDOPoolLV that will holds VDO data togehther with -+virtual size VDOLV, that user can use. When the virtual size -+is not specified, then such LV is created with maximum size that -+always fits into data volume even if there cannot happen any -+deduplication and compression -+(i.e. it can hold uncompressible content of /dev/urandom). -+When the name of VDOPoolLV is not specified, it tales name from -+sequence of vpool0, vpool1 ... -+ -+Note: As the performance of TRIM/Discard operation is slow for large -+volumes of VDO type, please try to avoid sending discard requests unless -+necessary as it may take considerable amount of time to finish discard -+operation. -+ -+.nf -+.B lvcreate --type vdo -n VDOLV -L DataSize -V LargeVirtualSize VG/VDOPoolLV -+.B lvcreate --vdo -L DataSize VG -+.fi -+ -+.I Example -+.br -+.nf -+# lvcreate --type vdo -n vdo0 -L 10G -V 100G vg/vdopool0 -+# mkfs.ext4 -E nodiscard /dev/vg/vdo0 -+.fi -+ -+.SS 2. Create VDOPoolLV and convert existing LV into VDODataLV -+ -+Convert an already created/existing LV into a volume that can hold -+VDO data and metadata (a volume reference by VDOPoolLV). -+User will be prompted to confirm such conversion as it is \fBIRREVERSIBLY -+DESTROYING\fP content of such volume, as it's being immediatelly -+formated by \fBvdoformat\fP(8) as VDO pool data volume. User can -+specify virtual size of associated VDOLV with this VDOPoolLV. -+When the virtual size is not specified, it will set to the maximum size -+that can keep 100% uncompressible data there. -+ -+.nf -+.B lvconvert --type vdo-pool -n VDOLV -V VirtualSize VG/VDOPoolLV -+.B lvconvert --vdopool VG/VDOPoolLV -+.fi -+ -+.I Example -+.br -+.nf -+# lvconvert --type vdo-pool -n vdo0 -V10G vg/existinglv -+.fi -+ -+.SS 3. Change default setting used for creating VDOPoolLV -+ -+VDO allows to set large variety of option. Lots of these setting -+can be specified by lvm.conf or profile settings. User can prepare -+number of different profiles and just specify profile file name. -+Check output of \fBlvmconfig --type full\fP for detailed description -+of all individual vdo settings. -+ -+.I Example -+.br -+.nf -+# cat < vdo.profile -+allocation { -+ vdo_use_compression=1 -+ vdo_use_deduplication=1 -+ vdo_use_metadata_hints=1 -+ vdo_minimum_io_size=4096 -+ vdo_block_map_cache_size_mb=128 -+ vdo_block_map_period=16380 -+ vdo_check_point_frequency=0 -+ vdo_use_sparse_index=0 -+ vdo_index_memory_size_mb=256 -+ vdo_slab_size_mb=2048 -+ vdo_ack_threads=1 -+ vdo_bio_threads=1 -+ vdo_bio_rotation=64 -+ vdo_cpu_threads=2 -+ vdo_hash_zone_threads=1 -+ vdo_logical_threads=1 -+ vdo_physical_threads=1 -+ vdo_write_policy="auto" -+ vdo_max_discard=1 -+} -+EOF -+ -+# lvcreate --vdo -L10G --metadataprofile vdo.profile vg/vdopool0 -+# lvcreate --vdo -L10G --config 'allocation/vdo_cpu_threads=4' vg/vdopool1 -+.fi -+ -+.SS 4. Change compression and deduplication of VDOPoolLV -+ -+Disable or enable compression and deduplication for VDO pool LV -+(the volume that maintains all VDO LV(s) associated with it). -+ -+.B lvchange --compression [y|n] --deduplication [y|n] VG/VDOPoolLV -+ -+.I Example -+.br -+.nf -+# lvchange --compression n vg/vdpool0 -+# lvchange --deduplication y vg/vdpool1 -+.fi -+ -+.SS 4. Checking usage of VDOPoolLV -+ -+To quickly check how much data of VDOPoolLV are already consumed -+use \fBlvs\fP(8). Field Data% will report how much data occupies -+content of virtual data for VDOLV and how much space is already -+consumed with all the data and metadata blocks in VDOPoolLV. -+For a detailed description use \fBvdostats\fP(8) command. -+ -+Note: vdostats currently understands only /dev/mapper device names. -+ -+.I Example -+.br -+.nf -+# lvcreate --type vdo -L10G -V20G -n vdo0 vg/vdopool0 -+# mkfs.ext4 -E nodiscard /dev/vg/vdo0 -+# lvs -a vg -+ -+ LV VG Attr LSize Pool Origin Data% -+ vdo0 vg vwi-a-v--- 20.00g vdopool0 0.01 -+ vdopool0 vg dwi-ao---- 10.00g 30.16 -+ [vdopool0_vdata] vg Dwi-ao---- 10.00g -+ -+# vdostats --all /dev/mapper/vg-vdopool0 -+/dev/mapper/vg-vdopool0 : -+ version : 30 -+ release version : 133524 -+ data blocks used : 79 -+ ... -+ -+.fi -+ -+.SH VDO Topics -+ -+.br -+ -+\& -+ -+.SH SEE ALSO -+.BR lvm (8), -+.BR lvm.conf (5), -+.BR lvmconfig (8), -+.BR lvcreate (8), -+.BR lvconvert (8), -+.BR lvchange (8), -+.BR lvextend (8), -+.BR lvremove (8), -+.BR lvs (8), -+.BR vdo (8), -+.BR vdoformat (8) -+.BR vdostats (8) -+ diff --git a/SOURCES/lvm2-2_03_03-man-missed-zero-option-for-thin-pool-creation.patch b/SOURCES/lvm2-2_03_03-man-missed-zero-option-for-thin-pool-creation.patch deleted file mode 100644 index 5522f0e..0000000 --- a/SOURCES/lvm2-2_03_03-man-missed-zero-option-for-thin-pool-creation.patch +++ /dev/null @@ -1,40 +0,0 @@ - WHATS_NEW | 1 + - man/lvcreate.8_pregen | 1 + - tools/args.h | 1 + - 3 files changed, 3 insertions(+) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 6ccc090..002b5a3 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Restore missing man info lvcreate --zero for thin-pools. - Drop misleadning comment for metadata minimum_io_size for VDO segment. - Improve -lXXX%VG modifier which improves cache segment estimation. - Ensure migration_threshold for cache is at least 8 chunks. -diff --git a/man/lvcreate.8_pregen b/man/lvcreate.8_pregen -index 2a5e05d..ff68447 100644 ---- a/man/lvcreate.8_pregen -+++ b/man/lvcreate.8_pregen -@@ -2715,6 +2715,7 @@ answer yes. Use with extreme caution. - Controls zeroing of the first 4KiB of data in the new LV. - Default is \fBy\fP. - Snapshot COW volumes are always zeroed. -+For thin pools, this controls zeroing of provisioned blocks. - LV is not zeroed if the read only flag is set. - Warning: trying to mount an unzeroed LV can cause the system to hang. - .ad b -diff --git a/tools/args.h b/tools/args.h -index 414d7a8..723179d 100644 ---- a/tools/args.h -+++ b/tools/args.h -@@ -1463,6 +1463,7 @@ arg(zero_ARG, 'Z', "zero", bool_VAL, 0, 0, - "Controls zeroing of the first 4KiB of data in the new LV.\n" - "Default is \\fBy\\fP.\n" - "Snapshot COW volumes are always zeroed.\n" -+ "For thin pools, this controls zeroing of provisioned blocks.\n" - "LV is not zeroed if the read only flag is set.\n" - "Warning: trying to mount an unzeroed LV can cause the system to hang.\n" - "#pvcreate\n" diff --git a/SOURCES/lvm2-2_03_03-pvscan-autoactivate-a-VG-once.patch b/SOURCES/lvm2-2_03_03-pvscan-autoactivate-a-VG-once.patch deleted file mode 100644 index 65105ca..0000000 --- a/SOURCES/lvm2-2_03_03-pvscan-autoactivate-a-VG-once.patch +++ /dev/null @@ -1,602 +0,0 @@ -From e403c3953fe8664525ca85e2ecabbe13dc7a0ae7 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Thu, 21 Feb 2019 15:53:36 -0600 -Subject: [PATCH 3/5] pvscan: autoactivate a VG once - -When a VG has multiple PVs, and all those PVs come online -at the same time, concurrent pvscans for each PV will all -create the individual pvid files, and all will often see -the VG is now complete. This causes each of the pvscan -commands to think it should activate the VG, so there -are multiple activations of the same VG. The vg lock -serializes them, and only the first pvscan actually does -the activation, but there is still a lot of extra overhead -and time used by the other pvscans that attempt to -activate the already active VG. This can lead to a backlog -of pvscans and timeouts. - -To fix this, this adds a new /run/lvm/vgs_online/ dir that -works like the existing /run/lvm/pvs_online/ dir. Each pvscan -that wants to activate a VG will first try to exlusively create -the file vgs_online/. Only the first pvscan will -succeed, and that one will do the VG activation. The other -pvscans will find the vgname file exists and will not do the -activation step. - -When a PV goes offline, the vgs_online file for the corresponding -VG is removed. This allows the VG to be autoactivated again -when the PV comes online again. This requires that the vgname be -stored in the pvid files. ---- - test/shell/pvscan-autoactivate.sh | 39 ++++--- - test/shell/pvscan-cache.sh | 20 +++- - tools/pvscan.c | 214 ++++++++++++++++++++++++++++++++------ - 3 files changed, 226 insertions(+), 47 deletions(-) - -diff --git a/test/shell/pvscan-autoactivate.sh b/test/shell/pvscan-autoactivate.sh -index cd360e9..419fb9b 100644 ---- a/test/shell/pvscan-autoactivate.sh -+++ b/test/shell/pvscan-autoactivate.sh -@@ -14,14 +14,15 @@ SKIP_WITH_LVMPOLLD=1 - - RUNDIR="/run" - test -d "$RUNDIR" || RUNDIR="/var/run" --ONLINEDIR="$RUNDIR/lvm/pvs_online" -+PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online" -+VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online" - - # FIXME: kills logic for running system --_clear_online() { -+_clear_online_files() { - # wait till udev is finished - aux udev_wait -- rm -f "$ONLINEDIR"/* -- test -n "${1+varset}" || touch "$ONLINEDIR/foo" -+ rm -f "$PVS_ONLINE_DIR"/* -+ rm -f "$VGS_ONLINE_DIR"/* - } - - . lib/inittest -@@ -32,8 +33,9 @@ vgcreate $vg1 "$dev1" "$dev2" - lvcreate -n $lv1 -l 4 -a n $vg1 - - # the first pvscan scans all devs --test -d "$ONLINEDIR" || mkdir -p "$ONLINEDIR" --_clear_online nofoo -+test -d "$PVS_ONLINE_DIR" || mkdir -p "$PVS_ONLINE_DIR" -+test -d "$VGS_ONLINE_DIR" || mkdir -p "$VGS_ONLINE_DIR" -+_clear_online_files - - pvscan --cache -aay - check lv_field $vg1/$lv1 lv_active "active" -@@ -42,7 +44,7 @@ lvchange -an $vg1 - # the first pvscan scans all devs even when - # only one device is specified - --_clear_online nofoo -+_clear_online_files - - pvscan --cache -aay "$dev1" - check lv_field $vg1/$lv1 lv_active "active" -@@ -50,7 +52,8 @@ lvchange -an $vg1 - - # touch foo to disable first-pvscan case, - # then check pvscan with no args scans all --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache -aay - check lv_field $vg1/$lv1 lv_active "active" -@@ -60,7 +63,8 @@ lvchange -an $vg1 - # then check that vg is activated only after - # both devs appear separately - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache -aay "$dev1" - check lv_field $vg1/$lv1 lv_active "" -@@ -72,7 +76,8 @@ lvchange -an $vg1 - # then check that vg is activated when both - # devs appear together - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache -aay "$dev1" "$dev2" - check lv_field $vg1/$lv1 lv_active "active" -@@ -92,7 +97,8 @@ lvcreate -n $lv1 -l 4 -a n $vg1 - # touch foo to disable first-pvscan case, - # test case where dev with metadata appears first - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache -aay "$dev2" - check lv_field $vg1/$lv1 lv_active "" -@@ -104,7 +110,8 @@ lvchange -an $vg1 - # test case where dev without metadata - # appears first which triggers scanning all - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache -aay "$dev1" - check lv_field $vg1/$lv1 lv_active "active" -@@ -115,7 +122,7 @@ lvchange -an $vg1 - # dev without metadata is scanned, but - # first-pvscan case scans all devs - --_clear_online nofoo -+_clear_online_files - - pvscan --cache -aay "$dev1" - check lv_field $vg1/$lv1 lv_active "active" -@@ -125,7 +132,8 @@ lvchange -an $vg1 - # is online without the -aay option to - # activate until after they are online - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache "$dev1" - check lv_field $vg1/$lv1 lv_active "" -@@ -137,7 +145,8 @@ lvchange -an $vg1 - - # like previous - --_clear_online -+_clear_online_files -+touch "$RUNDIR/lvm/pvs_online/foo" - - pvscan --cache "$dev1" - check lv_field $vg1/$lv1 lv_active "" -diff --git a/test/shell/pvscan-cache.sh b/test/shell/pvscan-cache.sh -index c272c6c..e0576f9 100644 ---- a/test/shell/pvscan-cache.sh -+++ b/test/shell/pvscan-cache.sh -@@ -13,6 +13,18 @@ - SKIP_WITH_LVMLOCKD=1 - SKIP_WITH_LVMPOLLD=1 - -+RUNDIR="/run" -+test -d "$RUNDIR" || RUNDIR="/var/run" -+PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online" -+VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online" -+ -+_clear_online_files() { -+ # wait till udev is finished -+ aux udev_wait -+ rm -f "$PVS_ONLINE_DIR"/* -+ rm -f "$VGS_ONLINE_DIR"/* -+} -+ - . lib/inittest - - aux prepare_pvs 2 -@@ -35,9 +47,12 @@ check lv_exists $vg1 - check lv_field $vg1/$lv1 lv_active "" - - # Check that an LV cannot be activated by pvscan while VG is exported -+vgchange -an $vg1 -+_clear_online_files - vgexport $vg1 --not pvscan --cache -aay "$dev1" --not pvscan --cache -aay "$dev2" -+pvscan --cache -aay "$dev1" || true -+pvscan --cache -aay "$dev2" || true -+_clear_online_files - vgimport $vg1 - check lv_exists $vg1 - check lv_field $vg1/$lv1 lv_active "" -@@ -51,6 +66,7 @@ lvchange -an $vg1/$lv1 - # metadata which hasn't been updated for some - # time and also since the MDA is marked as ignored, - # it should really be *ignored*! -+_clear_online_files - pvchange --metadataignore y "$dev1" - aux disable_dev "$dev2" - pvscan --cache -diff --git a/tools/pvscan.c b/tools/pvscan.c -index df46e04..465b3e6 100644 ---- a/tools/pvscan.c -+++ b/tools/pvscan.c -@@ -36,6 +36,9 @@ struct pvscan_aa_params { - unsigned int activate_errors; - }; - -+ -+static const char *_pvs_online_dir = DEFAULT_RUN_DIR "/pvs_online"; -+static const char *_vgs_online_dir = DEFAULT_RUN_DIR "/vgs_online"; - static const char *_online_file = DEFAULT_RUN_DIR "/pvs_online_lock"; - static int _online_fd = -1; - -@@ -227,7 +230,51 @@ out: - return ret; - } - --static const char *_pvs_online_dir = DEFAULT_RUN_DIR "/pvs_online"; -+static char *_vgname_in_pvid_file_buf(char *buf) -+{ -+ char *p, *n; -+ -+ /* -+ * file contains: -+ * :\n -+ * vg:\n\0 -+ */ -+ -+ if (!(p = strchr(buf, '\n'))) -+ return NULL; -+ -+ p++; /* skip \n */ -+ -+ if (*p && !strncmp(p, "vg:", 3)) { -+ if ((n = strchr(p, '\n'))) -+ *n = '\0'; -+ return p + 3; -+ } -+ return NULL; -+} -+ -+#define MAX_PVID_FILE_SIZE 512 -+ -+/* -+ * When a PV goes offline, remove the vg online file for that VG -+ * (even if other PVs for the VG are still online). This means -+ * that the vg will be activated again when it becomes complete. -+ */ -+ -+static void _online_vg_file_remove(const char *vgname) -+{ -+ char path[PATH_MAX]; -+ -+ if (dm_snprintf(path, sizeof(path), "%s/%s", _vgs_online_dir, vgname) < 0) { -+ log_error("Path %s/%s is too long.", _vgs_online_dir, vgname); -+ return; -+ } -+ -+ log_debug("Unlink vg online: %s", path); -+ -+ if (unlink(path)) -+ log_sys_debug("unlink", path); -+} - - /* - * When a device goes offline we only know its major:minor, not its PVID. -@@ -240,8 +287,9 @@ static const char *_pvs_online_dir = DEFAULT_RUN_DIR "/pvs_online"; - static void _online_pvid_file_remove_devno(int major, int minor) - { - char path[PATH_MAX]; -- char buf[32]; -- char buf_in[32]; -+ char buf[MAX_PVID_FILE_SIZE]; -+ char buf_in[MAX_PVID_FILE_SIZE]; -+ char *vgname = NULL; - DIR *dir; - struct dirent *de; - int fd, rv; -@@ -267,6 +315,8 @@ static void _online_pvid_file_remove_devno(int major, int minor) - continue; - } - -+ memset(buf_in, 0, sizeof(buf_in)); -+ - rv = read(fd, buf_in, sizeof(buf_in)); - if (close(fd)) - log_sys_debug("close", path); -@@ -276,9 +326,16 @@ static void _online_pvid_file_remove_devno(int major, int minor) - } - - if (!strncmp(buf, buf_in, strlen(buf))) { -- log_debug("Unlink pv online %s %s", buf, path); -+ log_debug("Unlink pv online %s", path); - if (unlink(path)) - log_sys_debug("unlink", path); -+ -+ /* vgname points to an offset in buf_in */ -+ if ((vgname = _vgname_in_pvid_file_buf(buf_in))) -+ _online_vg_file_remove(vgname); -+ else -+ log_debug("No vgname in pvid file"); -+ - break; - } - } -@@ -286,13 +343,13 @@ static void _online_pvid_file_remove_devno(int major, int minor) - log_sys_debug("closedir", _pvs_online_dir); - } - --static void _online_pvid_files_remove(void) -+static void _online_files_remove(const char *dirpath) - { - char path[PATH_MAX]; - DIR *dir; - struct dirent *de; - -- if (!(dir = opendir(_pvs_online_dir))) -+ if (!(dir = opendir(dirpath))) - return; - - while ((de = readdir(dir))) { -@@ -300,22 +357,26 @@ static void _online_pvid_files_remove(void) - continue; - - memset(path, 0, sizeof(path)); -- snprintf(path, sizeof(path), "%s/%s", _pvs_online_dir, de->d_name); -+ snprintf(path, sizeof(path), "%s/%s", dirpath, de->d_name); - if (unlink(path)) - log_sys_debug("unlink", path); - } - if (closedir(dir)) -- log_sys_debug("closedir", _pvs_online_dir); -+ log_sys_debug("closedir", dirpath); - } - --static int _online_pvid_file_create(struct device *dev) -+static int _online_pvid_file_create(struct device *dev, const char *vgname) - { - char path[PATH_MAX]; -- char buf[32]; -+ char buf[MAX_PVID_FILE_SIZE]; - int major, minor; - int fd; - int rv; - int len; -+ int len1 = 0; -+ int len2 = 0; -+ -+ memset(buf, 0, sizeof(buf)); - - major = (int)MAJOR(dev->dev); - minor = (int)MINOR(dev->dev); -@@ -325,16 +386,26 @@ static int _online_pvid_file_create(struct device *dev) - return 0; - } - -- if ((len = dm_snprintf(buf, sizeof(buf), "%d:%d\n", major, minor)) < 0) { -- log_error("Device %d:%d is too long.", major, minor); -+ if ((len1 = dm_snprintf(buf, sizeof(buf), "%d:%d\n", major, minor)) < 0) { -+ log_error("Cannot create online pv file for %d:%d.", major, minor); - return 0; - } - -+ if (vgname) { -+ if ((len2 = dm_snprintf(buf + len1, sizeof(buf) - len1, "vg:%s\n", vgname)) < 0) { -+ log_warn("Incomplete online pv file for %d:%d vg %s.", major, minor, vgname); -+ /* can still continue without vgname */ -+ len2 = 0; -+ } -+ } -+ -+ len = len1 + len2; -+ - log_debug("Create pv online: %s %d:%d %s", path, major, minor, dev_name(dev)); - - fd = open(path, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); - if (fd < 0) { -- log_error("Failed to open %s: %d", path, errno); -+ log_error("Failed to open create %s: %d", path, errno); - return 0; - } - -@@ -377,20 +448,45 @@ static int _online_pvid_file_exists(const char *pvid) - return 0; - } - --static void _online_pvid_dir_setup(void) -+static void _online_dir_setup(void) - { - struct stat st; - int rv; - -+ if (!stat(DEFAULT_RUN_DIR, &st)) -+ goto do_pvs; -+ -+ log_debug("Creating run_dir."); -+ dm_prepare_selinux_context(DEFAULT_RUN_DIR, S_IFDIR); -+ rv = mkdir(DEFAULT_RUN_DIR, 0755); -+ dm_prepare_selinux_context(NULL, 0); -+ -+ if ((rv < 0) && stat(DEFAULT_RUN_DIR, &st)) -+ log_error("Failed to create %s %d", DEFAULT_RUN_DIR, errno); -+ -+do_pvs: - if (!stat(_pvs_online_dir, &st)) -- return; -+ goto do_vgs; - -+ log_debug("Creating pvs_online_dir."); - dm_prepare_selinux_context(_pvs_online_dir, S_IFDIR); -- rv = mkdir(_pvs_online_dir, 0777); -+ rv = mkdir(_pvs_online_dir, 0755); -+ dm_prepare_selinux_context(NULL, 0); -+ -+ if ((rv < 0) && stat(_pvs_online_dir, &st)) -+ log_error("Failed to create %s %d", _pvs_online_dir, errno); -+ -+do_vgs: -+ if (!stat(_vgs_online_dir, &st)) -+ return; -+ -+ log_debug("Creating vgs_online_dir."); -+ dm_prepare_selinux_context(_vgs_online_dir, S_IFDIR); -+ rv = mkdir(_vgs_online_dir, 0755); - dm_prepare_selinux_context(NULL, 0); - -- if (rv < 0) -- log_debug("Failed to create %s", _pvs_online_dir); -+ if ((rv < 0) && stat(_vgs_online_dir, &st)) -+ log_error("Failed to create %s %d", _vgs_online_dir, errno); - } - - static void _online_file_setup(void) -@@ -401,8 +497,10 @@ static void _online_file_setup(void) - if (!stat(_online_file, &st)) - return; - -- if (!(fp = fopen(_online_file, "w"))) -+ if (!(fp = fopen(_online_file, "w"))) { -+ log_error("Failed to create %s %d", _online_file, errno); - return; -+ } - if (fclose(fp)) - stack; - } -@@ -442,11 +540,13 @@ static int _online_pv_found(struct cmd_context *cmd, - * Create file named for pvid to record this PV is online. - */ - -- if (!_online_pvid_file_create(dev)) -+ if (!_online_pvid_file_create(dev, vg ? vg->name : NULL)) - return_0; - -- if (!vg || !found_vgnames) -+ if (!vg || !found_vgnames) { -+ log_print("pvscan[%d] PV %s online.", getpid(), dev_name(dev)); - return 1; -+ } - - /* - * Check if all the PVs for this VG are online. This is only -@@ -469,8 +569,13 @@ static int _online_pv_found(struct cmd_context *cmd, - * in the VG, which means the VG is not yet complete. - */ - -- if (pvids_not_online) -+ if (pvids_not_online) { -+ log_print("pvscan[%d] PV %s online, VG %s incomplete (need %d).", -+ getpid(), dev_name(dev), vg->name, pvids_not_online); - return 1; -+ } -+ -+ log_print("pvscan[%d] PV %s online, VG %s is complete.", getpid(), dev_name(dev), vg->name); - - /* - * When all PVIDs from the VG are online, then add vgname to -@@ -541,7 +646,7 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev, - log_debug("pvscan metadata from dev %s", dev_name(dev)); - - if (udev_dev_is_mpath_component(dev)) { -- log_debug("Ignore multipath component for pvscan."); -+ log_print("pvscan[%d] ignore multipath component %s.", getpid(), dev_name(dev)); - return 1; - } - -@@ -649,10 +754,37 @@ static int _pvscan_aa_single(struct cmd_context *cmd, const char *vg_name, - return ECMD_PROCESSED; - } - -+static int _online_vg_file_create(struct cmd_context *cmd, const char *vgname) -+{ -+ char path[PATH_MAX]; -+ int fd; -+ -+ if (dm_snprintf(path, sizeof(path), "%s/%s", _vgs_online_dir, vgname) < 0) { -+ log_error("Path %s/%s is too long.", _vgs_online_dir, vgname); -+ return 0; -+ } -+ -+ log_debug("Create vg online: %s", path); -+ -+ fd = open(path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); -+ if (fd < 0) { -+ log_debug("Failed to create %s: %d", path, errno); -+ return 0; -+ } -+ -+ /* We don't care about syncing, these files are not even persistent. */ -+ -+ if (close(fd)) -+ log_sys_debug("close", path); -+ -+ return 1; -+} -+ - static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, - struct dm_list *vgnames) - { - struct processing_handle *handle = NULL; -+ struct dm_str_list *sl, *sl2; - int ret; - - if (dm_list_empty(vgnames)) { -@@ -667,6 +799,27 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, - - handle->custom_handle = pp; - -+ /* -+ * For each complete vg that can be autoactivated, see if this -+ * particular pvscan command should activate the vg. There can be -+ * multiple concurrent pvscans for the same completed vg (when all the -+ * PVs for the VG appear at once), and we want only one of the pvscans -+ * to run the activation. The first to create the file will do it. -+ */ -+ dm_list_iterate_items_safe(sl, sl2, vgnames) { -+ if (!_online_vg_file_create(cmd, sl->str)) { -+ log_print("pvscan[%d] VG %s skip autoactivation.", getpid(), sl->str); -+ str_list_del(vgnames, sl->str); -+ continue; -+ } -+ log_print("pvscan[%d] VG %s run autoactivation.", getpid(), sl->str); -+ } -+ -+ if (dm_list_empty(vgnames)) { -+ destroy_processing_handle(cmd, handle); -+ return ECMD_PROCESSED; -+ } -+ - ret = process_each_vg(cmd, 0, NULL, NULL, vgnames, READ_FOR_UPDATE, 0, handle, _pvscan_aa_single); - - destroy_processing_handle(cmd, handle); -@@ -707,7 +860,7 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - return EINVALID_CMD_LINE; - } - -- _online_pvid_dir_setup(); -+ _online_dir_setup(); - _online_file_setup(); - - if (!lock_vol(cmd, VG_GLOBAL, LCK_VG_READ, NULL)) { -@@ -721,8 +874,8 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - if (!argc && !devno_args) { - _lock_online(LOCK_EX, 0); - log_verbose("pvscan all devices for requested refresh."); -- _online_pvid_files_remove(); -- /* identify complete vgs, and only activate those vgs */ -+ _online_files_remove(_pvs_online_dir); -+ _online_files_remove(_vgs_online_dir); - _online_pvscan_all_devs(cmd, complete_vgnames, NULL); - _unlock_online(); - goto activate; -@@ -750,16 +903,17 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - * In the non-init case, a VG with two PVs, where both PVs appear at once - * two parallel pvscans for each PV create the pvid files for each PV in - * parallel, then both pvscans see the vg has completed, and both pvscans -- * activate the VG in parallel. The activations should be serialized by -- * the VG lock. -+ * activate the VG in parallel. The first pvscan to create the vgname -+ * file in vgs_online will do the activation, any others will skip it. - */ - - _lock_online(LOCK_EX, 0); - - if (_online_pvid_files_missing()) { - log_verbose("pvscan all devices to initialize available PVs."); -- _online_pvid_files_remove(); -- /* identify complete vgs, and only activate those vgs */ -+ _online_files_remove(_pvs_online_dir); -+ _online_files_remove(_vgs_online_dir); -+ cmd->pvscan_cache_single = 1; - _online_pvscan_all_devs(cmd, complete_vgnames, NULL); - _unlock_online(); - goto activate; --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-pvscan-fix-autoactivation-from-concurrent-pvscans.patch b/SOURCES/lvm2-2_03_03-pvscan-fix-autoactivation-from-concurrent-pvscans.patch deleted file mode 100644 index 462121c..0000000 --- a/SOURCES/lvm2-2_03_03-pvscan-fix-autoactivation-from-concurrent-pvscans.patch +++ /dev/null @@ -1,276 +0,0 @@ -From 455dbd8444074aa235c284d0e3285410b9096401 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Thu, 21 Feb 2019 15:52:45 -0600 -Subject: [PATCH 2/5] pvscan: fix autoactivation from concurrent pvscans - -Use a file lock to ensure that only one pvscan will do -initialization of pvs_online, otherwise multiple concurrent -pvscans may all see an empty pvs_online directory and -do initialization. - -The pvscan that is doing initialization should also only -attempt to activate complete VGs. ---- - tools/pvscan.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++--------- - 1 file changed, 120 insertions(+), 21 deletions(-) - -diff --git a/tools/pvscan.c b/tools/pvscan.c -index 2a884df..df46e04 100644 ---- a/tools/pvscan.c -+++ b/tools/pvscan.c -@@ -19,6 +19,7 @@ - #include "lib/metadata/metadata.h" - - #include -+#include - - struct pvscan_params { - int new_pvs_found; -@@ -32,10 +33,61 @@ struct pvscan_params { - }; - - struct pvscan_aa_params { -- int refresh_all; - unsigned int activate_errors; - }; - -+static const char *_online_file = DEFAULT_RUN_DIR "/pvs_online_lock"; -+static int _online_fd = -1; -+ -+static int _lock_online(int mode, int nonblock) -+{ -+ int fd; -+ int op = mode; -+ int ret; -+ -+ if (nonblock) -+ op |= LOCK_NB; -+ -+ if (_online_fd != -1) { -+ log_warn("lock_online existing fd %d", _online_fd); -+ return 0; -+ } -+ -+ fd = open(_online_file, O_RDWR | S_IRUSR | S_IWUSR); -+ if (fd < 0) { -+ log_debug("lock_online open errno %d", errno); -+ return 0; -+ } -+ -+ ret = flock(fd, op); -+ if (!ret) { -+ _online_fd = fd; -+ return 1; -+ } -+ -+ if (close(fd)) -+ stack; -+ return 0; -+} -+ -+static void _unlock_online(void) -+{ -+ int ret; -+ -+ if (_online_fd == -1) { -+ log_warn("unlock_online no existing fd"); -+ return; -+ } -+ -+ ret = flock(_online_fd, LOCK_UN); -+ if (ret) -+ log_warn("unlock_online flock errno %d", errno); -+ -+ if (close(_online_fd)) -+ stack; -+ _online_fd = -1; -+} -+ - static int _pvscan_display_pv(struct cmd_context *cmd, - struct physical_volume *pv, - struct pvscan_params *params) -@@ -341,6 +393,20 @@ static void _online_pvid_dir_setup(void) - log_debug("Failed to create %s", _pvs_online_dir); - } - -+static void _online_file_setup(void) -+{ -+ FILE *fp; -+ struct stat st; -+ -+ if (!stat(_online_file, &st)) -+ return; -+ -+ if (!(fp = fopen(_online_file, "w"))) -+ return; -+ if (fclose(fp)) -+ stack; -+} -+ - static int _online_pvid_files_missing(void) - { - DIR *dir; -@@ -584,12 +650,12 @@ static int _pvscan_aa_single(struct cmd_context *cmd, const char *vg_name, - } - - static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, -- int all_vgs, struct dm_list *vgnames) -+ struct dm_list *vgnames) - { - struct processing_handle *handle = NULL; - int ret; - -- if (!all_vgs && dm_list_empty(vgnames)) { -+ if (dm_list_empty(vgnames)) { - log_debug("No VGs to autoactivate."); - return ECMD_PROCESSED; - } -@@ -601,11 +667,6 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, - - handle->custom_handle = pp; - -- if (all_vgs) { -- cmd->cname->flags |= ALL_VGS_IS_DEFAULT; -- pp->refresh_all = 1; -- } -- - ret = process_each_vg(cmd, 0, NULL, NULL, vgnames, READ_FOR_UPDATE, 0, handle, _pvscan_aa_single); - - destroy_processing_handle(cmd, handle); -@@ -617,7 +678,8 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - { - struct pvscan_aa_params pp = { 0 }; - struct dm_list single_devs; -- struct dm_list found_vgnames; -+ struct dm_list vgnames; -+ struct dm_list *complete_vgnames = NULL; - struct device *dev; - struct device_list *devl; - const char *pv_name; -@@ -628,12 +690,14 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - struct arg_value_group_list *current_group; - dev_t devno; - int do_activate = arg_is_set(cmd, activate_ARG); -- int all_vgs = 0; - int add_errors = 0; - int ret = ECMD_PROCESSED; - - dm_list_init(&single_devs); -- dm_list_init(&found_vgnames); -+ dm_list_init(&vgnames); -+ -+ if (do_activate) -+ complete_vgnames = &vgnames; - - if (arg_is_set(cmd, major_ARG) + arg_is_set(cmd, minor_ARG)) - devno_args = 1; -@@ -644,6 +708,7 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - } - - _online_pvid_dir_setup(); -+ _online_file_setup(); - - if (!lock_vol(cmd, VG_GLOBAL, LCK_VG_READ, NULL)) { - log_error("Unable to obtain global lock."); -@@ -654,19 +719,53 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - * Scan all devices when no args are given. - */ - if (!argc && !devno_args) { -- log_verbose("pvscan all devices."); -+ _lock_online(LOCK_EX, 0); -+ log_verbose("pvscan all devices for requested refresh."); - _online_pvid_files_remove(); -- _online_pvscan_all_devs(cmd, NULL, NULL); -- all_vgs = 1; -+ /* identify complete vgs, and only activate those vgs */ -+ _online_pvscan_all_devs(cmd, complete_vgnames, NULL); -+ _unlock_online(); - goto activate; - } - -+ /* -+ * Initialization case: -+ * lock_online ex -+ * if empty -+ * pvscan all -+ * create pvid files -+ * identify complete vgs -+ * unlock_online -+ * activate complete vgs -+ * -+ * Non-initialization case: -+ * lock_online ex -+ * if not empty -+ * unlock_unlock -+ * pvscan devs -+ * create pvid files -+ * identify complete vgs -+ * activate complete vgs -+ * -+ * In the non-init case, a VG with two PVs, where both PVs appear at once -+ * two parallel pvscans for each PV create the pvid files for each PV in -+ * parallel, then both pvscans see the vg has completed, and both pvscans -+ * activate the VG in parallel. The activations should be serialized by -+ * the VG lock. -+ */ -+ -+ _lock_online(LOCK_EX, 0); -+ - if (_online_pvid_files_missing()) { - log_verbose("pvscan all devices to initialize available PVs."); - _online_pvid_files_remove(); -- _online_pvscan_all_devs(cmd, NULL, NULL); -- all_vgs = 1; -+ /* identify complete vgs, and only activate those vgs */ -+ _online_pvscan_all_devs(cmd, complete_vgnames, NULL); -+ _unlock_online(); - goto activate; -+ } else { -+ log_verbose("pvscan only specific devices."); -+ _unlock_online(); - } - - if (argc || devno_args) { -@@ -743,7 +842,7 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - * Devices that exist and pass the lvmetad filter - * are online. - */ -- if (!_online_pvscan_one(cmd, dev, NULL, &found_vgnames, 0, &pvid_without_metadata)) -+ if (!_online_pvscan_one(cmd, dev, NULL, complete_vgnames, 0, &pvid_without_metadata)) - add_errors++; - } - } -@@ -794,7 +893,7 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - * Devices that exist and pass the lvmetad filter - * are online. - */ -- if (!_online_pvscan_one(cmd, devl->dev, NULL, &found_vgnames, 0, &pvid_without_metadata)) -+ if (!_online_pvscan_one(cmd, devl->dev, NULL, complete_vgnames, 0, &pvid_without_metadata)) - add_errors++; - } - } -@@ -809,10 +908,10 @@ activate: - * scan all devs and pick out the complete VG holding this - * device so we can then autoactivate that VG. - */ -- if (!dm_list_empty(&single_devs) && dm_list_empty(&found_vgnames) && -+ if (!dm_list_empty(&single_devs) && complete_vgnames && dm_list_empty(complete_vgnames) && - pvid_without_metadata && do_activate) { - log_verbose("pvscan all devices for PV without metadata: %s.", pvid_without_metadata); -- _online_pvscan_all_devs(cmd, &found_vgnames, &single_devs); -+ _online_pvscan_all_devs(cmd, complete_vgnames, &single_devs); - } - - /* -@@ -821,7 +920,7 @@ activate: - * list, and we can attempt to autoactivate LVs in the VG. - */ - if (do_activate) -- ret = _pvscan_aa(cmd, &pp, all_vgs, &found_vgnames); -+ ret = _pvscan_aa(cmd, &pp, complete_vgnames); - - out: - if (add_errors || pp.activate_errors) --- -1.8.3.1 - diff --git a/SOURCES/lvm2-2_03_03-scripts-lvm2-activation-generator-fix-lvmconfig-call.patch b/SOURCES/lvm2-2_03_03-scripts-lvm2-activation-generator-fix-lvmconfig-call.patch deleted file mode 100644 index 53f5a61..0000000 --- a/SOURCES/lvm2-2_03_03-scripts-lvm2-activation-generator-fix-lvmconfig-call.patch +++ /dev/null @@ -1,57 +0,0 @@ - WHATS_NEW | 1 + - scripts/generator-internals.c | 3 ++- - scripts/lvm2_activation_generator_systemd_red_hat.c | 15 ++++++++++----- - 3 files changed, 13 insertions(+), 6 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 002b5a3..4b68dbd 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Fix generator querying config options missing from lvm.conf. - Restore missing man info lvcreate --zero for thin-pools. - Drop misleadning comment for metadata minimum_io_size for VDO segment. - Improve -lXXX%VG modifier which improves cache segment estimation. -diff --git a/scripts/generator-internals.c b/scripts/generator-internals.c -index 9619e8c..7bab4f9 100644 ---- a/scripts/generator-internals.c -+++ b/scripts/generator-internals.c -@@ -170,7 +170,8 @@ static bool _parse_line(const char *line, struct config *cfg) - static bool _get_config(struct config *cfg, const char *lvmconfig_path) - { - static const char *_argv[] = { -- "lvmconfig", LVM_CONF_EVENT_ACTIVATION, LVM_CONF_USE_LVMPOLLD, NULL -+ "lvmconfig", "--type", "full", -+ LVM_CONF_EVENT_ACTIVATION, LVM_CONF_USE_LVMPOLLD, NULL - }; - - bool r = true; -diff --git a/scripts/lvm2_activation_generator_systemd_red_hat.c b/scripts/lvm2_activation_generator_systemd_red_hat.c -index 0e6c05a..99b5f22 100644 ---- a/scripts/lvm2_activation_generator_systemd_red_hat.c -+++ b/scripts/lvm2_activation_generator_systemd_red_hat.c -@@ -213,12 +213,17 @@ static bool _run(int argc, const char **argv) - if (!_parse_command_line(&gen, argc, argv)) - return false; - -- if (!_get_config(&gen.cfg, LVMCONFIG_PATH)) -- return false; -+ if (_get_config(&gen.cfg, LVMCONFIG_PATH)) { -+ if (gen.cfg.event_activation) -+ // If event_activation=1, pvscan --cache -aay does activation. -+ return true; -+ } - -- if (gen.cfg.event_activation) -- // If event_activation=1, pvscan --cache -aay does activation. -- return true; -+ /* -+ * Create the activation units if: -+ * - _get_config succeeded and event_activation=0 -+ * - _get_config failed, then this is a failsafe fallback -+ */ - - /* mark lvm2-activation.*.service as world-accessible */ - old_mask = umask(0022); diff --git a/SOURCES/lvm2-2_03_03-vdo-fix-archived-metadata-comment.patch b/SOURCES/lvm2-2_03_03-vdo-fix-archived-metadata-comment.patch deleted file mode 100644 index 0b65cfc..0000000 --- a/SOURCES/lvm2-2_03_03-vdo-fix-archived-metadata-comment.patch +++ /dev/null @@ -1,28 +0,0 @@ - WHATS_NEW | 1 + - lib/vdo/vdo.c | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 152fa5e..6ccc090 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,6 @@ - Version 2.03.03 - - ==================================== -+ Drop misleadning comment for metadata minimum_io_size for VDO segment. - Improve -lXXX%VG modifier which improves cache segment estimation. - Ensure migration_threshold for cache is at least 8 chunks. - Move VDO support towards V2 target (6.2) support. -diff --git a/lib/vdo/vdo.c b/lib/vdo/vdo.c -index c34eb93..ed051fc 100644 ---- a/lib/vdo/vdo.c -+++ b/lib/vdo/vdo.c -@@ -308,7 +308,7 @@ static int _vdo_pool_text_export(const struct lv_segment *seg, struct formatter - if (vtp->use_metadata_hints) - outf(f, "use_metadata_hints = 1"); - -- outsize(f, vtp->minimum_io_size, "minimum_io_size = %u", vtp->minimum_io_size); -+ outf(f, "minimum_io_size = %u", vtp->minimum_io_size); - - outsize(f, vtp->block_map_cache_size_mb * UINT64_C(2 * 1024), - "block_map_cache_size_mb = %u", vtp->block_map_cache_size_mb); diff --git a/SOURCES/lvm2-2_03_03-vdo-some-formating-updates.patch b/SOURCES/lvm2-2_03_03-vdo-some-formating-updates.patch deleted file mode 100644 index f7a1465..0000000 --- a/SOURCES/lvm2-2_03_03-vdo-some-formating-updates.patch +++ /dev/null @@ -1,61 +0,0 @@ - man/lvmvdo.7_main | 15 ++++++++------- - 1 file changed, 8 insertions(+), 7 deletions(-) - -diff --git a/man/lvmvdo.7_main b/man/lvmvdo.7_main -index e789f7f..9bd10ac 100644 ---- a/man/lvmvdo.7_main -+++ b/man/lvmvdo.7_main -@@ -5,7 +5,6 @@ lvmvdo \(em EXPERIMENTAL LVM Virtual Data Optimizer support - - .SH DESCRIPTION - -- - VDO (which includes kvdo and vdo) is software that provides inline - block-level deduplication, compression, and thin provisioning capabilities - for primary storage. -@@ -179,7 +178,9 @@ EOF - Disable or enable compression and deduplication for VDO pool LV - (the volume that maintains all VDO LV(s) associated with it). - -+.nf - .B lvchange --compression [y|n] --deduplication [y|n] VG/VDOPoolLV -+.fi - - .I Example - .br -@@ -196,7 +197,7 @@ content of virtual data for VDOLV and how much space is already - consumed with all the data and metadata blocks in VDOPoolLV. - For a detailed description use \fBvdostats\fP(8) command. - --Note: vdostats currently understands only /dev/mapper device names. -+Note: \fBvdostats\fP(8) currently understands only /dev/mapper device names. - - .I Example - .br -@@ -216,11 +217,9 @@ Note: vdostats currently understands only /dev/mapper device names. - release version : 133524 - data blocks used : 79 - ... -- - .fi - - .SH VDO Topics -- - .br - - \& -@@ -233,9 +232,11 @@ Note: vdostats currently understands only /dev/mapper device names. - .BR lvconvert (8), - .BR lvchange (8), - .BR lvextend (8), -+.BR lvreduce (8), -+.BR lvresize (8), - .BR lvremove (8), - .BR lvs (8), - .BR vdo (8), --.BR vdoformat (8) --.BR vdostats (8) -- -+.BR vdoformat (8), -+.BR vdostats (8), -+.BR mkfs (8) diff --git a/SOURCES/lvm2-2_03_03-vdo-update-vdo-profile.patch b/SOURCES/lvm2-2_03_03-vdo-update-vdo-profile.patch deleted file mode 100644 index d7dddf1..0000000 --- a/SOURCES/lvm2-2_03_03-vdo-update-vdo-profile.patch +++ /dev/null @@ -1,53 +0,0 @@ - conf/vdo-small.profile | 41 ++++++++++++++++++++--------------------- - 1 file changed, 20 insertions(+), 21 deletions(-) - -diff --git a/conf/vdo-small.profile b/conf/vdo-small.profile -index 0bd47b5..2044fc2 100644 ---- a/conf/vdo-small.profile -+++ b/conf/vdo-small.profile -@@ -1,25 +1,24 @@ - # Demo configuration for 'VDO' using less memory. --# -+# ~lvmconfig --type full | grep vdo - - allocation { -- vdo_use_compression = 1 -- vdo_use_deduplication = 1 -- vdo_emulate_512_sectors = 0 -- vdo_block_map_cache_size_mb = 128 -- vdo_block_map_period = 16380 -- vdo_check_point_frequency = 0 -- vdo_use_sparse_index = 0 -- vdo_index_memory_size_mb = 256 -- vdo_use_read_cache = 0 -- vdo_read_cache_size_mb = 0 -- vdo_slab_size_mb = 2048 -- -- vdo_ack_threads = 1 -- vdo_bio_threads = 1 -- vdo_bio_rotation = 64 -- vdo_cpu_threads = 2 -- vdo_hash_zone_threads = 1 -- vdo_logical_threads = 1 -- vdo_physical_threads = 1 -- vdo_write_policy = "auto" -+ vdo_use_compression=1 -+ vdo_use_deduplication=1 -+ vdo_use_metadata_hints=1 -+ vdo_minimum_io_size=4096 -+ vdo_block_map_cache_size_mb=128 -+ vdo_block_map_period=16380 -+ vdo_check_point_frequency=0 -+ vdo_use_sparse_index=0 -+ vdo_index_memory_size_mb=256 -+ vdo_slab_size_mb=2048 -+ vdo_ack_threads=1 -+ vdo_bio_threads=1 -+ vdo_bio_rotation=64 -+ vdo_cpu_threads=2 -+ vdo_hash_zone_threads=1 -+ vdo_logical_threads=1 -+ vdo_physical_threads=1 -+ vdo_write_policy="auto" -+ vdo_max_discard=1 - } diff --git a/SOURCES/lvm2-2_03_06-Fix-rounding-writes-up-to-sector-size.patch b/SOURCES/lvm2-2_03_06-Fix-rounding-writes-up-to-sector-size.patch new file mode 100644 index 0000000..b07c896 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-Fix-rounding-writes-up-to-sector-size.patch @@ -0,0 +1,281 @@ + lib/device/bcache.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++-- + lib/device/dev-io.c | 52 +++++++++++++++++++++++++++++++ + lib/device/device.h | 8 +++-- + lib/label/label.c | 30 ++++++++++++++---- + 4 files changed, 169 insertions(+), 10 deletions(-) + +diff --git a/lib/device/bcache.c b/lib/device/bcache.c +index 7b09353..04fbf35 100644 +--- a/lib/device/bcache.c ++++ b/lib/device/bcache.c +@@ -169,6 +169,7 @@ static bool _async_issue(struct io_engine *ioe, enum dir d, int fd, + sector_t offset; + sector_t nbytes; + sector_t limit_nbytes; ++ sector_t orig_nbytes; + sector_t extra_nbytes = 0; + + if (((uintptr_t) data) & e->page_mask) { +@@ -191,11 +192,41 @@ static bool _async_issue(struct io_engine *ioe, enum dir d, int fd, + return false; + } + ++ /* ++ * If the bcache block offset+len goes beyond where lvm is ++ * intending to write, then reduce the len being written ++ * (which is the bcache block size) so we don't write past ++ * the limit set by lvm. If after applying the limit, the ++ * resulting size is not a multiple of the sector size (512 ++ * or 4096) then extend the reduced size to be a multiple of ++ * the sector size (we don't want to write partial sectors.) ++ */ + if (offset + nbytes > _last_byte_offset) { + limit_nbytes = _last_byte_offset - offset; +- if (limit_nbytes % _last_byte_sector_size) ++ ++ if (limit_nbytes % _last_byte_sector_size) { + extra_nbytes = _last_byte_sector_size - (limit_nbytes % _last_byte_sector_size); + ++ /* ++ * adding extra_nbytes to the reduced nbytes (limit_nbytes) ++ * should make the final write size a multiple of the ++ * sector size. This should never result in a final size ++ * larger than the bcache block size (as long as the bcache ++ * block size is a multiple of the sector size). ++ */ ++ if (limit_nbytes + extra_nbytes > nbytes) { ++ log_warn("Skip extending write at %llu len %llu limit %llu extra %llu sector_size %llu", ++ (unsigned long long)offset, ++ (unsigned long long)nbytes, ++ (unsigned long long)limit_nbytes, ++ (unsigned long long)extra_nbytes, ++ (unsigned long long)_last_byte_sector_size); ++ extra_nbytes = 0; ++ } ++ } ++ ++ orig_nbytes = nbytes; ++ + if (extra_nbytes) { + log_debug("Limit write at %llu len %llu to len %llu rounded to %llu", + (unsigned long long)offset, +@@ -210,6 +241,22 @@ static bool _async_issue(struct io_engine *ioe, enum dir d, int fd, + (unsigned long long)limit_nbytes); + nbytes = limit_nbytes; + } ++ ++ /* ++ * This shouldn't happen, the reduced+extended ++ * nbytes value should never be larger than the ++ * bcache block size. ++ */ ++ if (nbytes > orig_nbytes) { ++ log_error("Invalid adjusted write at %llu len %llu adjusted %llu limit %llu extra %llu sector_size %llu", ++ (unsigned long long)offset, ++ (unsigned long long)orig_nbytes, ++ (unsigned long long)nbytes, ++ (unsigned long long)limit_nbytes, ++ (unsigned long long)extra_nbytes, ++ (unsigned long long)_last_byte_sector_size); ++ return false; ++ } + } + } + +@@ -403,6 +450,7 @@ static bool _sync_issue(struct io_engine *ioe, enum dir d, int fd, + uint64_t nbytes = len; + sector_t limit_nbytes = 0; + sector_t extra_nbytes = 0; ++ sector_t orig_nbytes = 0; + + if (offset > _last_byte_offset) { + log_error("Limit write at %llu len %llu beyond last byte %llu", +@@ -415,9 +463,30 @@ static bool _sync_issue(struct io_engine *ioe, enum dir d, int fd, + + if (offset + nbytes > _last_byte_offset) { + limit_nbytes = _last_byte_offset - offset; +- if (limit_nbytes % _last_byte_sector_size) ++ ++ if (limit_nbytes % _last_byte_sector_size) { + extra_nbytes = _last_byte_sector_size - (limit_nbytes % _last_byte_sector_size); + ++ /* ++ * adding extra_nbytes to the reduced nbytes (limit_nbytes) ++ * should make the final write size a multiple of the ++ * sector size. This should never result in a final size ++ * larger than the bcache block size (as long as the bcache ++ * block size is a multiple of the sector size). ++ */ ++ if (limit_nbytes + extra_nbytes > nbytes) { ++ log_warn("Skip extending write at %llu len %llu limit %llu extra %llu sector_size %llu", ++ (unsigned long long)offset, ++ (unsigned long long)nbytes, ++ (unsigned long long)limit_nbytes, ++ (unsigned long long)extra_nbytes, ++ (unsigned long long)_last_byte_sector_size); ++ extra_nbytes = 0; ++ } ++ } ++ ++ orig_nbytes = nbytes; ++ + if (extra_nbytes) { + log_debug("Limit write at %llu len %llu to len %llu rounded to %llu", + (unsigned long long)offset, +@@ -432,6 +501,22 @@ static bool _sync_issue(struct io_engine *ioe, enum dir d, int fd, + (unsigned long long)limit_nbytes); + nbytes = limit_nbytes; + } ++ ++ /* ++ * This shouldn't happen, the reduced+extended ++ * nbytes value should never be larger than the ++ * bcache block size. ++ */ ++ if (nbytes > orig_nbytes) { ++ log_error("Invalid adjusted write at %llu len %llu adjusted %llu limit %llu extra %llu sector_size %llu", ++ (unsigned long long)offset, ++ (unsigned long long)orig_nbytes, ++ (unsigned long long)nbytes, ++ (unsigned long long)limit_nbytes, ++ (unsigned long long)extra_nbytes, ++ (unsigned long long)_last_byte_sector_size); ++ return false; ++ } + } + + where = offset; +diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c +index 3fe2647..5fa0b7a 100644 +--- a/lib/device/dev-io.c ++++ b/lib/device/dev-io.c +@@ -250,6 +250,58 @@ static int _dev_discard_blocks(struct device *dev, uint64_t offset_bytes, uint64 + return 1; + } + ++int dev_get_direct_block_sizes(struct device *dev, unsigned int *physical_block_size, ++ unsigned int *logical_block_size) ++{ ++ int fd = dev->bcache_fd; ++ int do_close = 0; ++ unsigned int pbs = 0; ++ unsigned int lbs = 0; ++ ++ if (dev->physical_block_size || dev->logical_block_size) { ++ *physical_block_size = dev->physical_block_size; ++ *logical_block_size = dev->logical_block_size; ++ return 1; ++ } ++ ++ if (fd <= 0) { ++ if (!dev_open_readonly(dev)) ++ return 0; ++ fd = dev_fd(dev); ++ do_close = 1; ++ } ++ ++ /* ++ * BLKPBSZGET from kernel comment for blk_queue_physical_block_size: ++ * "the lowest possible sector size that the hardware can operate on ++ * without reverting to read-modify-write operations" ++ */ ++ if (ioctl(fd, BLKPBSZGET, &pbs)) { ++ stack; ++ pbs = 0; ++ } ++ ++ /* ++ * BLKSSZGET from kernel comment for blk_queue_logical_block_size: ++ * "the lowest possible block size that the storage device can address." ++ */ ++ if (ioctl(fd, BLKSSZGET, &lbs)) { ++ stack; ++ lbs = 0; ++ } ++ ++ dev->physical_block_size = pbs; ++ dev->logical_block_size = lbs; ++ ++ *physical_block_size = pbs; ++ *logical_block_size = lbs; ++ ++ if (do_close && !dev_close_immediate(dev)) ++ stack; ++ ++ return 1; ++} ++ + /*----------------------------------------------------------------- + * Public functions + *---------------------------------------------------------------*/ +diff --git a/lib/device/device.h b/lib/device/device.h +index 30e1e79..bb65f84 100644 +--- a/lib/device/device.h ++++ b/lib/device/device.h +@@ -67,8 +67,10 @@ struct device { + /* private */ + int fd; + int open_count; +- int phys_block_size; +- int block_size; ++ int phys_block_size; /* From either BLKPBSZGET or BLKSSZGET, don't use */ ++ int block_size; /* From BLKBSZGET, returns bdev->bd_block_size, likely set by fs, probably don't use */ ++ int physical_block_size; /* From BLKPBSZGET: lowest possible sector size that the hardware can operate on without reverting to read-modify-write operations */ ++ int logical_block_size; /* From BLKSSZGET: lowest possible block size that the storage device can address */ + int read_ahead; + int bcache_fd; + uint32_t flags; +@@ -132,6 +134,8 @@ void dev_size_seqno_inc(void); + * All io should use these routines. + */ + int dev_get_block_size(struct device *dev, unsigned int *phys_block_size, unsigned int *block_size); ++int dev_get_direct_block_sizes(struct device *dev, unsigned int *physical_block_size, ++ unsigned int *logical_block_size); + int dev_get_size(struct device *dev, uint64_t *size); + int dev_get_read_ahead(struct device *dev, uint32_t *read_ahead); + int dev_discard_blocks(struct device *dev, uint64_t offset_bytes, uint64_t size_bytes); +diff --git a/lib/label/label.c b/lib/label/label.c +index 4c21d97..72be5ec 100644 +--- a/lib/label/label.c ++++ b/lib/label/label.c +@@ -1472,16 +1472,34 @@ bool dev_set_bytes(struct device *dev, uint64_t start, size_t len, uint8_t val) + + void dev_set_last_byte(struct device *dev, uint64_t offset) + { +- unsigned int phys_block_size = 0; +- unsigned int block_size = 0; ++ unsigned int physical_block_size = 0; ++ unsigned int logical_block_size = 0; ++ unsigned int bs; + +- if (!dev_get_block_size(dev, &phys_block_size, &block_size)) { ++ if (!dev_get_direct_block_sizes(dev, &physical_block_size, &logical_block_size)) { + stack; +- /* FIXME ASSERT or regular error testing is missing */ +- return; ++ return; /* FIXME: error path ? */ ++ } ++ ++ if ((physical_block_size == 512) && (logical_block_size == 512)) ++ bs = 512; ++ else if ((physical_block_size == 4096) && (logical_block_size == 4096)) ++ bs = 4096; ++ else if ((physical_block_size == 512) || (logical_block_size == 512)) { ++ log_debug("Set last byte mixed block sizes physical %u logical %u using 512", ++ physical_block_size, logical_block_size); ++ bs = 512; ++ } else if ((physical_block_size == 4096) || (logical_block_size == 4096)) { ++ log_debug("Set last byte mixed block sizes physical %u logical %u using 4096", ++ physical_block_size, logical_block_size); ++ bs = 4096; ++ } else { ++ log_debug("Set last byte mixed block sizes physical %u logical %u using 512", ++ physical_block_size, logical_block_size); ++ bs = 512; + } + +- bcache_set_last_byte(scan_bcache, dev->bcache_fd, offset, phys_block_size); ++ bcache_set_last_byte(scan_bcache, dev->bcache_fd, offset, bs); + } + + void dev_unset_last_byte(struct device *dev) diff --git a/SOURCES/lvm2-2_03_06-Revert-lvmlockd-use-commonly-used-define-NOTIFYDBUS_.patch b/SOURCES/lvm2-2_03_06-Revert-lvmlockd-use-commonly-used-define-NOTIFYDBUS_.patch new file mode 100644 index 0000000..b04e096 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-Revert-lvmlockd-use-commonly-used-define-NOTIFYDBUS_.patch @@ -0,0 +1,54 @@ + daemons/lvmlockd/Makefile.in | 21 ++++++++++++++------- + daemons/lvmlockd/lvmlockd-core.c | 2 +- + 2 files changed, 15 insertions(+), 8 deletions(-) + +diff --git a/daemons/lvmlockd/Makefile.in b/daemons/lvmlockd/Makefile.in +index dca05b8..9c03401 100644 +--- a/daemons/lvmlockd/Makefile.in ++++ b/daemons/lvmlockd/Makefile.in +@@ -38,18 +38,25 @@ TARGETS = lvmlockd lvmlockctl + + include $(top_builddir)/make.tmpl + +-CFLAGS += $(EXTRA_EXEC_CFLAGS) $(SYSTEMD_CFLAGS) ++CFLAGS += $(EXTRA_EXEC_CFLAGS) + INCLUDES += -I$(top_srcdir)/libdaemon/server +-LDFLAGS += $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) +-LIBS += $(PTHREAD_LIBS) $(SYSTEMD_LIBS) ++LDFLAGS += -L$(top_builddir)/libdaemon/server $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) ++LIBS += $(RT_LIBS) $(DAEMON_LIBS) $(PTHREAD_LIBS) + +-lvmlockd: $(OBJECTS) $(top_builddir)/libdaemon/server/libdaemonserver.a $(INTERNAL_LIBS) ++ ++ifeq ($(USE_SD_NOTIFY),yes) ++ CFLAGS += $(shell pkg-config --cflags libsystemd) -DUSE_SD_NOTIFY ++ LIBS += $(shell pkg-config --libs libsystemd) ++endif ++ ++lvmlockd: $(OBJECTS) $(top_builddir)/libdaemon/client/libdaemonclient.a \ ++ $(top_builddir)/libdaemon/server/libdaemonserver.a + @echo " [CC] $@" +- $(Q) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $+ $(LOCK_LIBS) $(LIBS) ++ $(Q) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LOCK_LIBS) -ldaemonserver $(INTERNAL_LIBS) $(LIBS) + +-lvmlockctl: lvmlockctl.o $(INTERNAL_LIBS) ++lvmlockctl: lvmlockctl.o $(top_builddir)/libdaemon/client/libdaemonclient.a + @echo " [CC] $@" +- $(Q) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) ++ $(Q) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ lvmlockctl.o $(INTERNAL_LIBS) $(LIBS) + + install_lvmlockd: lvmlockd + @echo " [INSTALL] $<" +diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c +index 5609ccc..39275fb 100644 +--- a/daemons/lvmlockd/lvmlockd-core.c ++++ b/daemons/lvmlockd/lvmlockd-core.c +@@ -31,7 +31,7 @@ + #include + #include + +-#ifdef NOTIFYDBUS_SUPPORT ++#ifdef USE_SD_NOTIFY + #include + #endif + diff --git a/SOURCES/lvm2-2_03_06-WHATS_NEW-fix-large-physical-block-size.patch b/SOURCES/lvm2-2_03_06-WHATS_NEW-fix-large-physical-block-size.patch new file mode 100644 index 0000000..72b8c0b --- /dev/null +++ b/SOURCES/lvm2-2_03_06-WHATS_NEW-fix-large-physical-block-size.patch @@ -0,0 +1,15 @@ + WHATS_NEW | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/WHATS_NEW b/WHATS_NEW +index 3a58de5..cb693de 100644 +--- a/WHATS_NEW ++++ b/WHATS_NEW +@@ -1,3 +1,7 @@ ++Version 2.03.06 - ++================================ ++ Fix metadata writes from corrupting with large physical block size. ++ + Version 2.03.05 - 15th June 2019 + ================================ + Fix command definition for pvchange -a. diff --git a/SOURCES/lvm2-2_03_06-WHATS_NEW-vgcreate-vgextend-logical-block-size.patch b/SOURCES/lvm2-2_03_06-WHATS_NEW-vgcreate-vgextend-logical-block-size.patch new file mode 100644 index 0000000..06cf00a --- /dev/null +++ b/SOURCES/lvm2-2_03_06-WHATS_NEW-vgcreate-vgextend-logical-block-size.patch @@ -0,0 +1,14 @@ + WHATS_NEW | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/WHATS_NEW b/WHATS_NEW +index cb693de..a7ccd39 100644 +--- a/WHATS_NEW ++++ b/WHATS_NEW +@@ -1,5 +1,6 @@ + Version 2.03.06 - + ================================ ++ Prevent creating VGs with PVs with different logical block sizes. + Fix metadata writes from corrupting with large physical block size. + + Version 2.03.05 - 15th June 2019 diff --git a/SOURCES/lvm2-2_03_06-build-make-generate.patch b/SOURCES/lvm2-2_03_06-build-make-generate.patch new file mode 100644 index 0000000..eb6c4ac --- /dev/null +++ b/SOURCES/lvm2-2_03_06-build-make-generate.patch @@ -0,0 +1,135 @@ + conf/example.conf.in | 9 +++---- + man/lvconvert.8_pregen | 70 +++++++++++++++++++++++++++----------------------- + 2 files changed, 42 insertions(+), 37 deletions(-) + +diff --git a/conf/example.conf.in b/conf/example.conf.in +index b9cdf0c..ed6a3b6 100644 +--- a/conf/example.conf.in ++++ b/conf/example.conf.in +@@ -143,7 +143,7 @@ devices { + # + # Example + # Accept every block device: +- # filter = [ "a|.*/|" ] ++ # filter = [ "a|.*|" ] + # Reject the cdrom drive: + # filter = [ "r|/dev/cdrom|" ] + # Work with just loopback devices, e.g. for testing: +@@ -151,10 +151,10 @@ devices { + # Accept all loop devices and ide drives except hdc: + # filter = [ "a|loop|", "r|/dev/hdc|", "a|/dev/ide|", "r|.*|" ] + # Use anchors to be very specific: +- # filter = [ "a|^/dev/hda8$|", "r|.*/|" ] ++ # filter = [ "a|^/dev/hda8$|", "r|.*|" ] + # + # This configuration option has an automatic default value. +- # filter = [ "a|.*/|" ] ++ # filter = [ "a|.*|" ] + + # Configuration option devices/global_filter. + # Limit the block devices that are used by LVM system components. +@@ -164,7 +164,7 @@ devices { + # The syntax is the same as devices/filter. Devices rejected by + # global_filter are not opened by LVM. + # This configuration option has an automatic default value. +- # global_filter = [ "a|.*/|" ] ++ # global_filter = [ "a|.*|" ] + + # Configuration option devices/types. + # List of additional acceptable block device types. +@@ -1752,7 +1752,6 @@ activation { + # additional space for VG metadata. The --metadatasize option overrides + # this setting. + # This configuration option does not have a default value defined. +- # This configuration option has an automatic default value. + + # Configuration option metadata/pvmetadataignore. + # Ignore metadata areas on a new PV. +diff --git a/man/lvconvert.8_pregen b/man/lvconvert.8_pregen +index 7252f6f..846ea2d 100644 +--- a/man/lvconvert.8_pregen ++++ b/man/lvconvert.8_pregen +@@ -378,6 +378,44 @@ Convert LV to striped. + .RE + - + ++Convert LV to type mirror (also see type raid1), ++.br ++.P ++\fBlvconvert\fP \fB--type\fP \fBmirror\fP \fILV\fP ++.br ++.RS 4 ++.ad l ++[ \fB-m\fP|\fB--mirrors\fP [\fB+\fP|\fB-\fP]\fINumber\fP ] ++.ad b ++.br ++.ad l ++[ \fB-I\fP|\fB--stripesize\fP \fISize\fP[k|UNIT] ] ++.ad b ++.br ++.ad l ++[ \fB-R\fP|\fB--regionsize\fP \fISize\fP[m|UNIT] ] ++.ad b ++.br ++.ad l ++[ \fB-i\fP|\fB--interval\fP \fINumber\fP ] ++.ad b ++.br ++.ad l ++[ \fB--stripes\fP \fINumber\fP ] ++.ad b ++.br ++.ad l ++[ \fB--mirrorlog\fP \fBcore\fP|\fBdisk\fP ] ++.ad b ++.br ++[ COMMON_OPTIONS ] ++.RE ++.br ++.RS 4 ++[ \fIPV\fP ... ] ++.RE ++- ++ + Convert LV to raid or change raid layout + .br + (a specific raid level must be used, e.g. raid1). +@@ -1636,38 +1674,6 @@ For example, LVM_VG_NAME can generally be substituted for a required VG paramete + .SH ADVANCED USAGE + Alternate command forms, advanced command usage, and listing of all valid syntax for completeness. + .P +-Convert LV to type mirror (also see type raid1), +-.br +-(also see lvconvert --mirrors). +-.br +-.P +-\fBlvconvert\fP \fB--type\fP \fBmirror\fP \fILV\fP +-.br +-.RS 4 +-.ad l +-[ \fB-m\fP|\fB--mirrors\fP [\fB+\fP|\fB-\fP]\fINumber\fP ] +-.ad b +-.br +-.ad l +-[ \fB-R\fP|\fB--regionsize\fP \fISize\fP[m|UNIT] ] +-.ad b +-.br +-.ad l +-[ \fB-i\fP|\fB--interval\fP \fINumber\fP ] +-.ad b +-.br +-.ad l +-[ \fB--mirrorlog\fP \fBcore\fP|\fBdisk\fP ] +-.ad b +-.br +-[ COMMON_OPTIONS ] +-.RE +-.br +-.RS 4 +-[ \fIPV\fP ... ] +-.RE +-- +- + Change the region size of an LV. + .br + .P diff --git a/SOURCES/lvm2-2_03_06-cache-warn-and-prompt-for-writeback-with-cachevol.patch b/SOURCES/lvm2-2_03_06-cache-warn-and-prompt-for-writeback-with-cachevol.patch new file mode 100644 index 0000000..a101fd6 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-cache-warn-and-prompt-for-writeback-with-cachevol.patch @@ -0,0 +1,56 @@ + test/shell/cache-single-options.sh | 2 +- + tools/lvchange.c | 8 ++++++++ + tools/lvconvert.c | 8 ++++++++ + 3 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/test/shell/cache-single-options.sh b/test/shell/cache-single-options.sh +index da9cbba..6b71b2f 100644 +--- a/test/shell/cache-single-options.sh ++++ b/test/shell/cache-single-options.sh +@@ -228,7 +228,7 @@ lvconvert -y --type cache --cachevol $lv2 $vg/$lv1 + + lvchange -ay $vg/$lv1 + +-lvchange --cachemode writeback $vg/$lv1 ++lvchange -y --cachemode writeback $vg/$lv1 + + check lv_field $vg/$lv1 cachemode "writeback" + +diff --git a/tools/lvchange.c b/tools/lvchange.c +index 7bdf997..92c6524 100644 +--- a/tools/lvchange.c ++++ b/tools/lvchange.c +@@ -635,6 +635,14 @@ static int _lvchange_cache(struct cmd_context *cmd, + if (!get_cache_params(cmd, &chunk_size, &format, &mode, &name, &settings)) + goto_out; + ++ if (seg_is_cache(seg) && lv_is_cache_vol(seg->pool_lv) && (mode == CACHE_MODE_WRITEBACK)) { ++ log_warn("WARNING: repairing a damaged cachevol is not yet possible."); ++ log_warn("WARNING: cache mode writethrough is suggested for safe operation."); ++ if (!arg_count(cmd, yes_ARG) && ++ yes_no_prompt("Continue using writeback without repair?") == 'n') ++ goto_out; ++ } ++ + if ((mode != CACHE_MODE_UNSELECTED) && + (mode != setting_seg->cache_mode) && + lv_is_cache(lv)) { +diff --git a/tools/lvconvert.c b/tools/lvconvert.c +index 24db8d2..ebc2243 100644 +--- a/tools/lvconvert.c ++++ b/tools/lvconvert.c +@@ -3401,6 +3401,14 @@ static int _cache_vol_attach(struct cmd_context *cmd, + if (!cache_vol_set_params(cmd, cache_lv, lv_fast, poolmetadatasize, chunk_size, cache_metadata_format, cache_mode, policy_name, policy_settings)) + goto_out; + ++ if (cache_mode == CACHE_MODE_WRITEBACK) { ++ log_warn("WARNING: repairing a damaged cachevol is not yet possible."); ++ log_warn("WARNING: cache mode writethrough is suggested for safe operation."); ++ if (!arg_count(cmd, yes_ARG) && ++ yes_no_prompt("Continue using writeback without repair?") == 'n') ++ goto_out; ++ } ++ + /* + * lv/cache_lv keeps the same lockd lock it had before, the lock for + * lv_fast is freed, and lv_corig has no lock. diff --git a/SOURCES/lvm2-2_03_06-config-Fix-default-option-which-makes-no-sense.patch b/SOURCES/lvm2-2_03_06-config-Fix-default-option-which-makes-no-sense.patch new file mode 100644 index 0000000..0872a06 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-config-Fix-default-option-which-makes-no-sense.patch @@ -0,0 +1,16 @@ + lib/config/config_settings.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h +index 70fb36d..f14f0b8 100644 +--- a/lib/config/config_settings.h ++++ b/lib/config/config_settings.h +@@ -1694,7 +1694,7 @@ cfg(metadata_vgmetadatacopies_CFG, "vgmetadatacopies", metadata_CFG_SECTION, CFG + "and allows you to control which metadata areas are used at the\n" + "individual PV level using pvchange --metadataignore y|n.\n") + +-cfg_runtime(metadata_pvmetadatasize_CFG, "pvmetadatasize", metadata_CFG_SECTION, CFG_DEFAULT_COMMENTED | CFG_DEFAULT_UNDEFINED, CFG_TYPE_INT, vsn(1, 0, 0), 0, NULL, ++cfg_runtime(metadata_pvmetadatasize_CFG, "pvmetadatasize", metadata_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_INT, vsn(1, 0, 0), 0, NULL, + "The default size of the metadata area in units of 512 byte sectors.\n" + "The metadata area begins at an offset of the page size from the start\n" + "of the device. The first PE is by default at 1 MiB from the start of\n" diff --git a/SOURCES/lvm2-2_03_06-config-remove-filter-typo.patch b/SOURCES/lvm2-2_03_06-config-remove-filter-typo.patch new file mode 100644 index 0000000..11698e0 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-config-remove-filter-typo.patch @@ -0,0 +1,38 @@ + lib/config/config_settings.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h +index 3113fe1..70fb36d 100644 +--- a/lib/config/config_settings.h ++++ b/lib/config/config_settings.h +@@ -288,7 +288,7 @@ cfg_array(devices_preferred_names_CFG, "preferred_names", devices_CFG_SECTION, C + "preferred_names = [ \"^/dev/mpath/\", \"^/dev/mapper/mpath\", \"^/dev/[hs]d\" ]\n" + "#\n") + +-cfg_array(devices_filter_CFG, "filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#Sa|.*/|", vsn(1, 0, 0), NULL, 0, NULL, ++cfg_array(devices_filter_CFG, "filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#Sa|.*|", vsn(1, 0, 0), NULL, 0, NULL, + "Limit the block devices that are used by LVM commands.\n" + "This is a list of regular expressions used to accept or reject block\n" + "device path names. Each regex is delimited by a vertical bar '|'\n" +@@ -306,7 +306,7 @@ cfg_array(devices_filter_CFG, "filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENT + "#\n" + "Example\n" + "Accept every block device:\n" +- "filter = [ \"a|.*/|\" ]\n" ++ "filter = [ \"a|.*|\" ]\n" + "Reject the cdrom drive:\n" + "filter = [ \"r|/dev/cdrom|\" ]\n" + "Work with just loopback devices, e.g. for testing:\n" +@@ -314,10 +314,10 @@ cfg_array(devices_filter_CFG, "filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENT + "Accept all loop devices and ide drives except hdc:\n" + "filter = [ \"a|loop|\", \"r|/dev/hdc|\", \"a|/dev/ide|\", \"r|.*|\" ]\n" + "Use anchors to be very specific:\n" +- "filter = [ \"a|^/dev/hda8$|\", \"r|.*/|\" ]\n" ++ "filter = [ \"a|^/dev/hda8$|\", \"r|.*|\" ]\n" + "#\n") + +-cfg_array(devices_global_filter_CFG, "global_filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#Sa|.*/|", vsn(2, 2, 98), NULL, 0, NULL, ++cfg_array(devices_global_filter_CFG, "global_filter", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#Sa|.*|", vsn(2, 2, 98), NULL, 0, NULL, + "Limit the block devices that are used by LVM system components.\n" + "Because devices/filter may be overridden from the command line, it is\n" + "not suitable for system-wide device filtering, e.g. udev.\n" diff --git a/SOURCES/lvm2-2_03_06-configure-Fix-setting-of-CLDFLAGS-default.patch b/SOURCES/lvm2-2_03_06-configure-Fix-setting-of-CLDFLAGS-default.patch new file mode 100644 index 0000000..c1521e1 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-configure-Fix-setting-of-CLDFLAGS-default.patch @@ -0,0 +1,66 @@ + configure | 6 +++--- + configure.ac | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/configure b/configure +index ff3a59b..4c84765 100755 +--- a/configure ++++ b/configure +@@ -3077,7 +3077,7 @@ if test -z "$CFLAGS"; then : + fi + case "$host_os" in + linux*) +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"} -Wl,--version-script,.export.sym" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"} -Wl,--version-script,.export.sym" + # equivalent to -rdynamic + ELDFLAGS="-Wl,--export-dynamic" + # FIXME Generate list and use --dynamic-list=.dlopen.sym +@@ -3098,7 +3098,7 @@ case "$host_os" in + ;; + darwin*) + CFLAGS="$CFLAGS -no-cpp-precomp -fno-common" +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"}" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"}" + ELDFLAGS= + CLDWHOLEARCHIVE="-all_load" + CLDNOWHOLEARCHIVE= +@@ -3111,7 +3111,7 @@ case "$host_os" in + BLKDEACTIVATE=no + ;; + *) +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"}" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"}" + ;; + esac + +diff --git a/configure.ac b/configure.ac +index 1e45c0e..9c82773 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -30,7 +30,7 @@ AC_CANONICAL_TARGET([]) + AS_IF([test -z "$CFLAGS"], [COPTIMISE_FLAG="-O2"]) + case "$host_os" in + linux*) +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"} -Wl,--version-script,.export.sym" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"} -Wl,--version-script,.export.sym" + # equivalent to -rdynamic + ELDFLAGS="-Wl,--export-dynamic" + # FIXME Generate list and use --dynamic-list=.dlopen.sym +@@ -51,7 +51,7 @@ case "$host_os" in + ;; + darwin*) + CFLAGS="$CFLAGS -no-cpp-precomp -fno-common" +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"}" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"}" + ELDFLAGS= + CLDWHOLEARCHIVE="-all_load" + CLDNOWHOLEARCHIVE= +@@ -64,7 +64,7 @@ case "$host_os" in + BLKDEACTIVATE=no + ;; + *) +- CLDFLAGS="${CLDFLAGS:"$LDFLAGS"}" ++ CLDFLAGS="${CLDFLAGS-"$LDFLAGS"}" + ;; + esac + diff --git a/SOURCES/lvm2-2_03_06-cov-check-for-socket_path-being-set.patch b/SOURCES/lvm2-2_03_06-cov-check-for-socket_path-being-set.patch new file mode 100644 index 0000000..4633f41 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-cov-check-for-socket_path-being-set.patch @@ -0,0 +1,16 @@ + libdaemon/server/daemon-server.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c +index 9dd0017..2df4e89 100644 +--- a/libdaemon/server/daemon-server.c ++++ b/libdaemon/server/daemon-server.c +@@ -690,7 +690,7 @@ void daemon_start(daemon_state s) + out: + /* If activated by systemd, do not unlink the socket - systemd takes care of that! */ + if (!_systemd_activation && s.socket_fd >= 0) +- if (unlink(s.socket_path)) ++ if (s.socket_path && unlink(s.socket_path)) + perror("unlink error"); + + if (s.socket_fd >= 0) diff --git a/SOURCES/lvm2-2_03_06-cov-ensure-cname-exists-before-derefering-it.patch b/SOURCES/lvm2-2_03_06-cov-ensure-cname-exists-before-derefering-it.patch new file mode 100644 index 0000000..a790836 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-cov-ensure-cname-exists-before-derefering-it.patch @@ -0,0 +1,34 @@ + tools/command.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/command.c b/tools/command.c +index 724040e..2e69eff 100644 +--- a/tools/command.c ++++ b/tools/command.c +@@ -1935,7 +1935,7 @@ void print_usage(struct command *cmd, int longhelp, int desc_first) + * see print_common_options_cmd() + */ + +- if ((cname->variants > 1) && cname->common_options[opt_enum]) ++ if (cname && (cname->variants > 1) && cname->common_options[opt_enum]) + continue; + + printf("\n\t["); +@@ -1975,7 +1975,7 @@ void print_usage(struct command *cmd, int longhelp, int desc_first) + * see print_common_options_cmd() + */ + +- if ((cname->variants > 1) && cname->common_options[opt_enum]) ++ if (cname && (cname->variants > 1) && cname->common_options[opt_enum]) + continue; + + printf("\n\t["); +@@ -3438,7 +3438,7 @@ static int _print_man(char *name, char *des_file, int secondary) + + if (!prev_cmd || strcmp(prev_cmd->name, cmd->name)) { + printf(".SH NAME\n"); +- if (cname->desc) ++ if (cname && cname->desc) + printf("%s - %s\n", lvmname, cname->desc); + else + printf("%s\n", lvmname); diff --git a/SOURCES/lvm2-2_03_06-dmeventd-avoid-bail-out-preventing-repair-in-raid-pl.patch b/SOURCES/lvm2-2_03_06-dmeventd-avoid-bail-out-preventing-repair-in-raid-pl.patch new file mode 100644 index 0000000..001d2e0 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-dmeventd-avoid-bail-out-preventing-repair-in-raid-pl.patch @@ -0,0 +1,30 @@ + daemons/dmeventd/plugins/raid/dmeventd_raid.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +diff --git a/daemons/dmeventd/plugins/raid/dmeventd_raid.c b/daemons/dmeventd/plugins/raid/dmeventd_raid.c +index aa2b578..3431f1e 100644 +--- a/daemons/dmeventd/plugins/raid/dmeventd_raid.c ++++ b/daemons/dmeventd/plugins/raid/dmeventd_raid.c +@@ -76,16 +76,12 @@ static int _process_raid_event(struct dso_state *state, char *params, const char + } + + if (dead) { +- if (status->insync_regions < status->total_regions) { +- if (!state->warned) { +- state->warned = 1; +- log_warn("WARNING: waiting for resynchronization to finish " +- "before initiating repair on RAID device %s.", device); +- } +- +- goto out; /* Not yet done syncing with accessible devices */ +- } +- ++ /* ++ * Use the first event to run a repair ignoring any additonal ones. ++ * ++ * We presume lvconvert to do pre-repair ++ * checks to avoid bloat in this plugin. ++ */ + if (state->failed) + goto out; /* already reported */ + diff --git a/SOURCES/lvm2-2_03_06-enable-full-md-component-detection-at-the-right-time.patch b/SOURCES/lvm2-2_03_06-enable-full-md-component-detection-at-the-right-time.patch new file mode 100644 index 0000000..c27d18d --- /dev/null +++ b/SOURCES/lvm2-2_03_06-enable-full-md-component-detection-at-the-right-time.patch @@ -0,0 +1,151 @@ + lib/device/dev-cache.c | 19 +++++++++++++++++++ + lib/device/dev-cache.h | 3 +++ + lib/device/dev-md.c | 6 +++--- + lib/label/label.c | 27 ++++++++++++++------------- + tools/pvscan.c | 7 +++++++ + 5 files changed, 46 insertions(+), 16 deletions(-) + +diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c +index 1492181..980dd3c 100644 +--- a/lib/device/dev-cache.c ++++ b/lib/device/dev-cache.c +@@ -15,6 +15,7 @@ + + #include "base/memory/zalloc.h" + #include "lib/misc/lib.h" ++#include "lib/device/dev-type.h" + #include "lib/datastruct/btree.h" + #include "lib/config/config.h" + #include "lib/commands/toolcontext.h" +@@ -1634,3 +1635,21 @@ const char *dev_name(const struct device *dev) + return (dev && dev->aliases.n) ? dm_list_item(dev->aliases.n, struct dm_str_list)->str : + unknown_device_name(); + } ++ ++bool dev_cache_has_md_with_end_superblock(struct dev_types *dt) ++{ ++ struct btree_iter *iter = btree_first(_cache.devices); ++ struct device *dev; ++ ++ while (iter) { ++ dev = btree_get_data(iter); ++ ++ if (dev_is_md_with_end_superblock(dt, dev)) ++ return true; ++ ++ iter = btree_next(iter); ++ } ++ ++ return false; ++} ++ +diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h +index 8a1c277..46c86c2 100644 +--- a/lib/device/dev-cache.h ++++ b/lib/device/dev-cache.h +@@ -17,6 +17,7 @@ + #define _LVM_DEV_CACHE_H + + #include "lib/device/device.h" ++#include "lib/device/dev-type.h" + #include "lib/misc/lvm-wrappers.h" + + struct cmd_context; +@@ -71,4 +72,6 @@ void dev_reset_error_count(struct cmd_context *cmd); + + void dev_cache_failed_path(struct device *dev, const char *path); + ++bool dev_cache_has_md_with_end_superblock(struct dev_types *dt); ++ + #endif +diff --git a/lib/device/dev-md.c b/lib/device/dev-md.c +index 08143b7..9d0a363 100644 +--- a/lib/device/dev-md.c ++++ b/lib/device/dev-md.c +@@ -302,12 +302,12 @@ static int _md_sysfs_attribute_scanf(struct dev_types *dt, + return ret; + + if (!(fp = fopen(path, "r"))) { +- log_sys_error("fopen", path); ++ log_debug("_md_sysfs_attribute_scanf fopen failed %s", path); + return ret; + } + + if (!fgets(buffer, sizeof(buffer), fp)) { +- log_sys_error("fgets", path); ++ log_debug("_md_sysfs_attribute_scanf fgets failed %s", path); + goto out; + } + +@@ -449,7 +449,7 @@ int dev_is_md_with_end_superblock(struct dev_types *dt, struct device *dev) + + if (_md_sysfs_attribute_scanf(dt, dev, attribute, + "%s", &version_string) != 1) +- return -1; ++ return 0; + + log_very_verbose("Device %s %s is %s.", + dev_name(dev), attribute, version_string); +diff --git a/lib/label/label.c b/lib/label/label.c +index a8d87ec..4c21d97 100644 +--- a/lib/label/label.c ++++ b/lib/label/label.c +@@ -901,6 +901,20 @@ int label_scan(struct cmd_context *cmd) + dev_cache_scan(); + + /* ++ * If we know that there will be md components with an end ++ * superblock, then enable the full md filter before label ++ * scan begins. FIXME: we could skip the full md check on ++ * devs that are not identified as PVs, but then we'd need ++ * to do something other than using the standard md filter. ++ */ ++ if (cmd->md_component_detection && !cmd->use_full_md_check && ++ !strcmp(cmd->md_component_checks, "auto") && ++ dev_cache_has_md_with_end_superblock(cmd->dev_types)) { ++ log_debug("Enable full md component check."); ++ cmd->use_full_md_check = 1; ++ } ++ ++ /* + * Set up the iterator that is needed to step through each device in + * dev cache. + */ +@@ -938,19 +952,6 @@ int label_scan(struct cmd_context *cmd) + bcache_invalidate_fd(scan_bcache, dev->bcache_fd); + _scan_dev_close(dev); + } +- +- /* +- * When md devices exist that use the old superblock at the +- * end of the device, then in order to detect and filter out +- * the component devices of those md devs, we enable the full +- * md filter which scans both the start and the end of every +- * device. This doubles the amount of scanning i/o, which we +- * want to avoid. FIXME: this forces start+end scanning of +- * every device, but it would be more efficient to limit the +- * end scan only to PVs. +- */ +- if (dev_is_md_with_end_superblock(cmd->dev_types, dev)) +- cmd->use_full_md_check = 1; + }; + dev_iter_destroy(iter); + +diff --git a/tools/pvscan.c b/tools/pvscan.c +index db813ad..0a91add 100644 +--- a/tools/pvscan.c ++++ b/tools/pvscan.c +@@ -938,6 +938,13 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) + /* Creates a list of dev names from /dev, sysfs, etc; does not read any. */ + dev_cache_scan(); + ++ if (cmd->md_component_detection && !cmd->use_full_md_check && ++ !strcmp(cmd->md_component_checks, "auto") && ++ dev_cache_has_md_with_end_superblock(cmd->dev_types)) { ++ log_debug("Enable full md component check."); ++ cmd->use_full_md_check = 1; ++ } ++ + /* + * For each device command arg (from either position or --major/--minor), + * decide if that device is being added to the system (a dev node exists diff --git a/SOURCES/lvm2-2_03_06-exported-vg-handling.patch b/SOURCES/lvm2-2_03_06-exported-vg-handling.patch new file mode 100644 index 0000000..d263822 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-exported-vg-handling.patch @@ -0,0 +1,629 @@ + lib/commands/toolcontext.h | 1 + + lib/metadata/metadata-exported.h | 1 - + lib/metadata/metadata.c | 42 ++++++++++++++++++++++---------- + tools/command.c | 1 + + tools/commands.h | 29 +++++++++++----------- + tools/lvmcmdline.c | 2 ++ + tools/pvchange.c | 7 +----- + tools/pvresize.c | 7 +----- + tools/toollib.c | 52 +++++++++++++++++++++++++++++++--------- + tools/tools.h | 2 ++ + tools/vgchange.c | 22 ++++------------- + tools/vgck.c | 3 --- + tools/vgimport.c | 6 ++--- + tools/vgimportclone.c | 4 ++-- + tools/vgreduce.c | 5 ++-- + tools/vgremove.c | 3 --- + tools/vgrename.c | 3 +-- + tools/vgsplit.c | 12 ++++++++-- + 18 files changed, 115 insertions(+), 87 deletions(-) + +diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h +index 6e4530c..488752c 100644 +--- a/lib/commands/toolcontext.h ++++ b/lib/commands/toolcontext.h +@@ -148,6 +148,7 @@ struct cmd_context { + unsigned unknown_system_id:1; + unsigned include_historical_lvs:1; /* also process/report/display historical LVs */ + unsigned record_historical_lvs:1; /* record historical LVs */ ++ unsigned include_exported_vgs:1; + unsigned include_foreign_vgs:1; /* report/display cmds can reveal foreign VGs */ + unsigned include_shared_vgs:1; /* report/display cmds can reveal lockd VGs */ + unsigned include_active_foreign_vgs:1; /* cmd should process foreign VGs with active LVs */ +diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h +index 9029d3f..77b971b 100644 +--- a/lib/metadata/metadata-exported.h ++++ b/lib/metadata/metadata-exported.h +@@ -181,7 +181,6 @@ + #define MIRROR_SKIP_INIT_SYNC 0x00000010U /* skip initial sync */ + + /* vg_read and vg_read_for_update flags */ +-#define READ_ALLOW_EXPORTED 0x00020000U + #define READ_OK_NOTFOUND 0x00040000U + #define READ_WARN_INCONSISTENT 0x00080000U + #define READ_FOR_UPDATE 0x00100000U /* A meta-flag, useful with toollib for_each_* functions. */ +diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c +index 039a7d6..dc1b501 100644 +--- a/lib/metadata/metadata.c ++++ b/lib/metadata/metadata.c +@@ -593,9 +593,6 @@ int vg_remove_check(struct volume_group *vg) + return 0; + } + +- if (!vg_check_status(vg, EXPORTED_VG)) +- return 0; +- + lv_count = vg_visible_lvs(vg); + + if (lv_count) { +@@ -3709,12 +3706,6 @@ uint32_t vg_bad_status_bits(const struct volume_group *vg, uint64_t status) + /* Return because other flags are considered undefined. */ + return FAILED_CLUSTERED; + +- if ((status & EXPORTED_VG) && +- vg_is_exported(vg)) { +- log_error("Volume group %s is exported", vg->name); +- failure |= FAILED_EXPORTED; +- } +- + if ((status & LVM_WRITE) && + !(vg->status & LVM_WRITE)) { + log_error("Volume group %s is read-only", vg->name); +@@ -3733,7 +3724,7 @@ uint32_t vg_bad_status_bits(const struct volume_group *vg, uint64_t status) + /** + * vg_check_status - check volume group status flags and log error + * @vg - volume group to check status flags +- * @status - specific status flags to check (e.g. EXPORTED_VG) ++ * @status - specific status flags to check + */ + int vg_check_status(const struct volume_group *vg, uint64_t status) + { +@@ -3914,6 +3905,28 @@ static int _access_vg_systemid(struct cmd_context *cmd, struct volume_group *vg) + return 0; + } + ++static int _access_vg_exported(struct cmd_context *cmd, struct volume_group *vg) ++{ ++ if (!vg_is_exported(vg)) ++ return 1; ++ ++ if (cmd->include_exported_vgs) ++ return 1; ++ ++ /* ++ * Some commands want the error printed by vg_read, others by ignore_vg. ++ * Those using ignore_vg may choose to skip the error. ++ */ ++ if (cmd->vg_read_print_access_error) { ++ log_error("Volume group %s is exported", vg->name); ++ return 0; ++ } ++ ++ /* Silently ignore exported vgs. */ ++ ++ return 0; ++} ++ + /* + * Test the validity of a VG handle returned by vg_read() or vg_read_for_update(). + */ +@@ -4883,8 +4896,7 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const + goto_bad; + } + +- if (writing && !(read_flags & READ_ALLOW_EXPORTED) && vg_is_exported(vg)) { +- log_error("Volume group %s is exported", vg->name); ++ if (!_access_vg_exported(cmd, vg)) { + failure |= FAILED_EXPORTED; + goto_bad; + } +@@ -4895,6 +4907,12 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const + goto_bad; + } + ++ if (writing && !(vg->status & LVM_WRITE)) { ++ log_error("Volume group %s is read-only", vg->name); ++ failure |= FAILED_READ_ONLY; ++ goto_bad; ++ } ++ + if (!cmd->handles_missing_pvs && (missing_pv_dev || missing_pv_flag) && writing) { + log_error("Cannot change VG %s while PVs are missing.", vg->name); + log_error("See vgreduce --removemissing and vgextend --restoremissing."); +diff --git a/tools/command.c b/tools/command.c +index bdd18d6..724040e 100644 +--- a/tools/command.c ++++ b/tools/command.c +@@ -137,6 +137,7 @@ static inline int configtype_arg(struct cmd_context *cmd __attribute__((unused)) + #define GET_VGNAME_FROM_OPTIONS 0x00001000 + #define CAN_USE_ONE_SCAN 0x00002000 + #define ALLOW_HINTS 0x00004000 ++#define ALLOW_EXPORTED 0x00008000 + + + /* create foo_CMD enums for command def ID's in command-lines.in */ +diff --git a/tools/commands.h b/tools/commands.h +index 4006fab..c1670ae 100644 +--- a/tools/commands.h ++++ b/tools/commands.h +@@ -35,7 +35,7 @@ xx(help, + + xx(fullreport, + "Display full report", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | ALLOW_HINTS) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | ALLOW_HINTS | ALLOW_EXPORTED) + + xx(lastlog, + "Display last command's log report", +@@ -71,7 +71,7 @@ xx(lvmconfig, + + xx(lvmdiskscan, + "List devices that may be used as physical volumes", +- PERMITTED_READ_ONLY | ENABLE_ALL_DEVS) ++ PERMITTED_READ_ONLY | ENABLE_ALL_DEVS | ALLOW_EXPORTED) + + xx(lvmsadc, + "Collect activity data", +@@ -115,7 +115,7 @@ xx(pvresize, + + xx(pvck, + "Check metadata on physical volumes", +- LOCKD_VG_SH) ++ LOCKD_VG_SH | ALLOW_EXPORTED) + + xx(pvcreate, + "Initialize physical volume(s) for use by LVM", +@@ -127,7 +127,7 @@ xx(pvdata, + + xx(pvdisplay, + "Display various attributes of physical volume(s)", +- PERMITTED_READ_ONLY | ENABLE_ALL_DEVS | ENABLE_DUPLICATE_DEVS | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS) ++ PERMITTED_READ_ONLY | ENABLE_ALL_DEVS | ENABLE_DUPLICATE_DEVS | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS | ALLOW_EXPORTED) + + /* ALL_VGS_IS_DEFAULT is for polldaemon to find pvmoves in-progress using process_each_vg. */ + +@@ -145,11 +145,11 @@ xx(pvremove, + + xx(pvs, + "Display information about physical volumes", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_ALL_DEVS | ENABLE_DUPLICATE_DEVS | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_ALL_DEVS | ENABLE_DUPLICATE_DEVS | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS | ALLOW_EXPORTED) + + xx(pvscan, + "List all physical volumes", +- PERMITTED_READ_ONLY | LOCKD_VG_SH) ++ PERMITTED_READ_ONLY | LOCKD_VG_SH | ALLOW_EXPORTED) + + xx(segtypes, + "List available segment types", +@@ -165,11 +165,11 @@ xx(tags, + + xx(vgcfgbackup, + "Backup volume group configuration(s)", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | ALLOW_EXPORTED) + + xx(vgcfgrestore, + "Restore volume group configuration", +- 0) ++ ALLOW_EXPORTED) + + xx(vgchange, + "Change volume group attributes", +@@ -189,7 +189,7 @@ xx(vgcreate, + + xx(vgdisplay, + "Display volume group information", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS | ALLOW_EXPORTED) + + xx(vgexport, + "Unregister volume group(s) from the system", +@@ -201,10 +201,11 @@ xx(vgextend, + + xx(vgimport, + "Register exported volume group with system", +- ALL_VGS_IS_DEFAULT) ++ ALL_VGS_IS_DEFAULT | ALLOW_EXPORTED) + + xx(vgimportclone, +- "Import a VG from cloned PVs", 0) ++ "Import a VG from cloned PVs", ++ ALLOW_EXPORTED) + + xx(vgmerge, + "Merge volume groups", +@@ -224,15 +225,15 @@ xx(vgremove, + + xx(vgrename, + "Rename a volume group", +- ALLOW_UUID_AS_NAME) ++ ALLOW_UUID_AS_NAME | ALLOW_EXPORTED) + + xx(vgs, + "Display information about volume groups", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | CAN_USE_ONE_SCAN | ALLOW_HINTS | ALLOW_EXPORTED) + + xx(vgscan, + "Search for all volume groups", +- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH) ++ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | ALLOW_EXPORTED) + + xx(vgsplit, + "Move physical volumes into a new or existing volume group", +diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c +index 3fec702..30f9d81 100644 +--- a/tools/lvmcmdline.c ++++ b/tools/lvmcmdline.c +@@ -2315,6 +2315,8 @@ static int _get_current_settings(struct cmd_context *cmd) + if (cmd->cname->flags & CAN_USE_ONE_SCAN) + cmd->can_use_one_scan = 1; + ++ cmd->include_exported_vgs = (cmd->cname->flags & ALLOW_EXPORTED) ? 1 : 0; ++ + cmd->scan_lvs = find_config_tree_bool(cmd, devices_scan_lvs_CFG, NULL); + + /* +diff --git a/tools/pvchange.c b/tools/pvchange.c +index f37fd91..1ece34a 100644 +--- a/tools/pvchange.c ++++ b/tools/pvchange.c +@@ -35,11 +35,6 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg, + + params->total++; + +- if (vg && vg_is_exported(vg)) { +- log_error("Volume group %s is exported", vg->name); +- goto bad; +- } +- + /* + * The primary location of this check is in vg_write(), but it needs + * to be copied here to prevent the pv_write() which is called before +@@ -239,7 +234,7 @@ int pvchange(struct cmd_context *cmd, int argc, char **argv) + + clear_hint_file(cmd); + +- ret = process_each_pv(cmd, argc, argv, NULL, 0, READ_FOR_UPDATE | READ_ALLOW_EXPORTED, handle, _pvchange_single); ++ ret = process_each_pv(cmd, argc, argv, NULL, 0, READ_FOR_UPDATE, handle, _pvchange_single); + + log_print_unless_silent("%d physical volume%s changed / %d physical volume%s not changed", + params.done, params.done == 1 ? "" : "s", +diff --git a/tools/pvresize.c b/tools/pvresize.c +index c7e750d..2c7f543 100644 +--- a/tools/pvresize.c ++++ b/tools/pvresize.c +@@ -36,11 +36,6 @@ static int _pvresize_single(struct cmd_context *cmd, + } + params->total++; + +- if (vg && vg_is_exported(vg)) { +- log_error("Volume group %s is exported", vg->name); +- return ECMD_FAILED; +- } +- + /* + * Needed to change a property on an orphan PV. + * i.e. the global lock is only needed for orphans. +@@ -93,7 +88,7 @@ int pvresize(struct cmd_context *cmd, int argc, char **argv) + + handle->custom_handle = ¶ms; + +- ret = process_each_pv(cmd, argc, argv, NULL, 0, READ_FOR_UPDATE | READ_ALLOW_EXPORTED, handle, _pvresize_single); ++ ret = process_each_pv(cmd, argc, argv, NULL, 0, READ_FOR_UPDATE, handle, _pvresize_single); + + log_print_unless_silent("%d physical volume(s) resized or updated / %d physical volume(s) " + "not resized", params.done, params.total - params.done); +diff --git a/tools/toollib.c b/tools/toollib.c +index 506ad2d..b2313f8 100644 +--- a/tools/toollib.c ++++ b/tools/toollib.c +@@ -223,6 +223,17 @@ static int _ignore_vg(struct cmd_context *cmd, + } + } + ++ if (read_error & FAILED_EXPORTED) { ++ if (arg_vgnames && str_list_match_item(arg_vgnames, vg_name)) { ++ log_error("Volume group %s is exported", vg_name); ++ return 1; ++ } else { ++ read_error &= ~FAILED_EXPORTED; /* Check for other errors */ ++ log_verbose("Skipping exported volume group %s", vg_name); ++ *skip = 1; ++ } ++ } ++ + /* + * Commands that operate on "all vgs" shouldn't be bothered by + * skipping a foreign VG, and the command shouldn't fail when +@@ -3032,11 +3043,6 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, + dm_list_init(&final_lvs); + dm_list_init(&found_arg_lvnames); + +- if (!vg_check_status(vg, EXPORTED_VG)) { +- ret_max = ECMD_FAILED; +- goto_out; +- } +- + if (tags_in && !dm_list_empty(tags_in)) + tags_supplied = 1; + +@@ -4161,6 +4167,7 @@ static int _process_pvs_in_vg(struct cmd_context *cmd, + int process_all_pvs, + int process_all_devices, + int skip, ++ uint32_t error_flags, + struct processing_handle *handle, + process_single_pv_fn_t process_single_pv) + { +@@ -4216,21 +4223,42 @@ static int _process_pvs_in_vg(struct cmd_context *cmd, + } + + process_pv = process_all_pvs; ++ dil = NULL; + + /* Remove each arg_devices entry as it is processed. */ + +- if (!process_pv && !dm_list_empty(arg_devices) && +- (dil = _device_list_find_dev(arg_devices, pv->dev))) { +- process_pv = 1; +- _device_list_remove(arg_devices, dil->dev); ++ if (arg_devices && !dm_list_empty(arg_devices)) { ++ if ((dil = _device_list_find_dev(arg_devices, pv->dev))) ++ _device_list_remove(arg_devices, dil->dev); + } + ++ if (!process_pv && dil) ++ process_pv = 1; ++ + if (!process_pv && !dm_list_empty(arg_tags) && + str_list_match_list(arg_tags, &pv->tags, NULL)) + process_pv = 1; + + process_pv = process_pv && select_match_pv(cmd, handle, vg, pv) && _select_matches(handle); + ++ /* ++ * The command has asked to process a specific PV ++ * named on the command line, but the VG containing ++ * that PV cannot be accessed. In this case report ++ * and return an error. If the inaccessible PV is ++ * not explicitly named on the command line, it is ++ * silently skipped. ++ */ ++ if (process_pv && skip && dil && error_flags) { ++ if (error_flags & FAILED_EXPORTED) ++ log_error("Cannot use PV %s in exported VG %s.", pv_name, vg->name); ++ if (error_flags & FAILED_SYSTEMID) ++ log_error("Cannot use PV %s in foreign VG %s.", pv_name, vg->name); ++ if (error_flags & (FAILED_LOCK_TYPE | FAILED_LOCK_MODE)) ++ log_error("Cannot use PV %s in shared VG %s.", pv_name, vg->name); ++ ret_max = ECMD_FAILED; ++ } ++ + if (process_pv) { + if (skip) + log_verbose("Skipping PV %s in VG %s.", pv_name, vg->name); +@@ -4352,6 +4380,8 @@ static int _process_pvs_in_vgs(struct cmd_context *cmd, uint32_t read_flags, + + log_debug("Processing PVs in VG %s", vg_name); + ++ error_flags = 0; ++ + vg = vg_read(cmd, vg_name, vg_uuid, read_flags, lockd_state, &error_flags, &error_vg); + if (_ignore_vg(cmd, error_flags, error_vg, vg_name, NULL, read_flags, &skip, ¬found)) { + stack; +@@ -4359,7 +4389,7 @@ static int _process_pvs_in_vgs(struct cmd_context *cmd, uint32_t read_flags, + report_log_ret_code(ret_max); + if (!skip) + goto endvg; +- /* Drop through to eliminate a clustered VG's PVs from the devices list */ ++ /* Drop through to eliminate unmpermitted PVs from the devices list */ + } + if (notfound) + goto endvg; +@@ -4370,7 +4400,7 @@ static int _process_pvs_in_vgs(struct cmd_context *cmd, uint32_t read_flags, + */ + + ret = _process_pvs_in_vg(cmd, vg ? vg : error_vg, all_devices, arg_devices, arg_tags, +- process_all_pvs, process_all_devices, skip, ++ process_all_pvs, process_all_devices, skip, error_flags, + handle, process_single_pv); + if (ret != ECMD_PROCESSED) + stack; +diff --git a/tools/tools.h b/tools/tools.h +index 69132a5..b78c471 100644 +--- a/tools/tools.h ++++ b/tools/tools.h +@@ -136,6 +136,8 @@ struct arg_value_group_list { + #define CAN_USE_ONE_SCAN 0x00002000 + /* Command can use hints file */ + #define ALLOW_HINTS 0x00004000 ++/* Command can access exported vg. */ ++#define ALLOW_EXPORTED 0x00008000 + + + void usage(const char *name); +diff --git a/tools/vgchange.c b/tools/vgchange.c +index a17f456..1ef94d6 100644 +--- a/tools/vgchange.c ++++ b/tools/vgchange.c +@@ -630,13 +630,6 @@ static int _vgchange_single(struct cmd_context *cmd, const char *vg_name, + { detachprofile_ARG, &_vgchange_profile }, + }; + +- if (vg_is_exported(vg)) { +- if (cmd->command->command_enum == vgchange_monitor_CMD) +- return ECMD_PROCESSED; +- log_error("Volume group \"%s\" is exported", vg_name); +- return ECMD_FAILED; +- } +- + /* + * FIXME: DEFAULT_BACKGROUND_POLLING should be "unspecified". + * If --poll is explicitly provided use it; otherwise polling +@@ -982,11 +975,6 @@ static int _vgchange_locktype_single(struct cmd_context *cmd, const char *vg_nam + struct volume_group *vg, + struct processing_handle *handle) + { +- if (vg_is_exported(vg)) { +- log_error("Volume group \"%s\" is exported", vg_name); +- return ECMD_FAILED; +- } +- + if (!archive(vg)) + return_ECMD_FAILED; + +@@ -1145,11 +1133,14 @@ int vgchange_lock_start_stop_cmd(struct cmd_context *cmd, int argc, char **argv) + + /* Disable the lockd_gl in process_each_vg. */ + cmd->lockd_gl_disable = 1; ++ } else { ++ /* If the VG was started when it was exported, allow it to be stopped. */ ++ cmd->include_exported_vgs = 1; + } + + handle->custom_handle = &vp; + +- ret = process_each_vg(cmd, argc, argv, NULL, NULL, READ_ALLOW_EXPORTED, 0, handle, &_vgchange_lock_start_stop_single); ++ ret = process_each_vg(cmd, argc, argv, NULL, NULL, 0, 0, handle, &_vgchange_lock_start_stop_single); + + /* Wait for lock-start ops that were initiated in vgchange_lockstart. */ + +@@ -1178,11 +1169,6 @@ static int _vgchange_systemid_single(struct cmd_context *cmd, const char *vg_nam + struct volume_group *vg, + struct processing_handle *handle) + { +- if (vg_is_exported(vg)) { +- log_error("Volume group \"%s\" is exported", vg_name); +- return ECMD_FAILED; +- } +- + if (!archive(vg)) + return_ECMD_FAILED; + +diff --git a/tools/vgck.c b/tools/vgck.c +index 90fc5a3..46ad594 100644 +--- a/tools/vgck.c ++++ b/tools/vgck.c +@@ -71,9 +71,6 @@ static int vgck_single(struct cmd_context *cmd __attribute__((unused)), + struct volume_group *vg, + struct processing_handle *handle __attribute__((unused))) + { +- if (!vg_check_status(vg, EXPORTED_VG)) +- return_ECMD_FAILED; +- + if (!vg_validate(vg)) + return_ECMD_FAILED; + +diff --git a/tools/vgimport.c b/tools/vgimport.c +index 26c6363..0d8b0f2 100644 +--- a/tools/vgimport.c ++++ b/tools/vgimport.c +@@ -87,8 +87,6 @@ int vgimport(struct cmd_context *cmd, int argc, char **argv) + cmd->handles_missing_pvs = 1; + } + +- return process_each_vg(cmd, argc, argv, NULL, NULL, +- READ_FOR_UPDATE | READ_ALLOW_EXPORTED, +- 0, NULL, +- &_vgimport_single); ++ return process_each_vg(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE, ++ 0, NULL, &_vgimport_single); + } +diff --git a/tools/vgimportclone.c b/tools/vgimportclone.c +index a3af841..be01861 100644 +--- a/tools/vgimportclone.c ++++ b/tools/vgimportclone.c +@@ -235,7 +235,7 @@ int vgimportclone(struct cmd_context *cmd, int argc, char **argv) + + log_debug("Finding devices to import."); + cmd->cname->flags |= ENABLE_DUPLICATE_DEVS; +- process_each_pv(cmd, argc, argv, NULL, 0, READ_ALLOW_EXPORTED, handle, _vgimportclone_pv_single); ++ process_each_pv(cmd, argc, argv, NULL, 0, 0, handle, _vgimportclone_pv_single); + + if (vp.found_args != argc) { + log_error("Failed to find all devices."); +@@ -342,7 +342,7 @@ retry_name: + + clear_hint_file(cmd); + +- ret = process_each_vg(cmd, 0, NULL, vp.old_vgname, NULL, READ_FOR_UPDATE | READ_ALLOW_EXPORTED, 0, handle, _vgimportclone_vg_single); ++ ret = process_each_vg(cmd, 0, NULL, vp.old_vgname, NULL, READ_FOR_UPDATE, 0, handle, _vgimportclone_vg_single); + + unlock_vg(cmd, NULL, vp.new_vgname); + out: +diff --git a/tools/vgreduce.c b/tools/vgreduce.c +index bc1f5b6..b001ccb 100644 +--- a/tools/vgreduce.c ++++ b/tools/vgreduce.c +@@ -135,7 +135,7 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, + { + int r; + +- if (!vg_check_status(vg, EXPORTED_VG | LVM_WRITE | RESIZEABLE_VG)) ++ if (!vg_check_status(vg, LVM_WRITE | RESIZEABLE_VG)) + return ECMD_FAILED; + + r = vgreduce_single(cmd, vg, pv, 1); +@@ -250,8 +250,7 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv) + + init_ignore_suspended_devices(1); + +- process_each_vg(cmd, 0, NULL, vg_name, NULL, +- READ_FOR_UPDATE | READ_ALLOW_EXPORTED, ++ process_each_vg(cmd, 0, NULL, vg_name, NULL, READ_FOR_UPDATE, + 0, handle, &_vgreduce_repair_single); + + if (vp.already_consistent) { +diff --git a/tools/vgremove.c b/tools/vgremove.c +index 23640f6..8f73297 100644 +--- a/tools/vgremove.c ++++ b/tools/vgremove.c +@@ -42,9 +42,6 @@ static int _vgremove_single(struct cmd_context *cmd, const char *vg_name, + unsigned lv_count, missing; + int ret; + +- if (!vg_check_status(vg, EXPORTED_VG)) +- return_ECMD_FAILED; +- + lv_count = vg_visible_lvs(vg); + + if (lv_count) { +diff --git a/tools/vgrename.c b/tools/vgrename.c +index 4735e8b..8b76d0b 100644 +--- a/tools/vgrename.c ++++ b/tools/vgrename.c +@@ -233,8 +233,7 @@ int vgrename(struct cmd_context *cmd, int argc, char **argv) + + handle->custom_handle = &vp; + +- ret = process_each_vg(cmd, 0, NULL, vg_name_old, NULL, +- READ_FOR_UPDATE | READ_ALLOW_EXPORTED, ++ ret = process_each_vg(cmd, 0, NULL, vg_name_old, NULL, READ_FOR_UPDATE, + 0, handle, _vgrename_single); + + /* Needed if process_each_vg returns error before calling _single. */ +diff --git a/tools/vgsplit.c b/tools/vgsplit.c +index 61cb13b..1bcc308 100644 +--- a/tools/vgsplit.c ++++ b/tools/vgsplit.c +@@ -665,8 +665,16 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv) + if (!test_mode()) { + unlock_vg(cmd, NULL, vg_name_to); + release_vg(vg_to); +- vg_to = vg_read_for_update(cmd, vg_name_to, NULL, +- READ_ALLOW_EXPORTED, 0); ++ ++ /* ++ * This command uses the exported vg flag internally, but ++ * exported VGs are not allowed to be split from the command ++ * level, so ALLOW_EXPORTED is not set in commands.h. ++ */ ++ cmd->include_exported_vgs = 1; ++ ++ vg_to = vg_read_for_update(cmd, vg_name_to, NULL, 0, 0); ++ + if (vg_read_error(vg_to)) { + log_error("Volume group \"%s\" became inconsistent: " + "please fix manually", vg_name_to); diff --git a/SOURCES/lvm2-2_03_06-increase-soft-open-file-limit.patch b/SOURCES/lvm2-2_03_06-increase-soft-open-file-limit.patch new file mode 100644 index 0000000..8d762de --- /dev/null +++ b/SOURCES/lvm2-2_03_06-increase-soft-open-file-limit.patch @@ -0,0 +1,89 @@ + lib/label/label.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +diff --git a/lib/label/label.c b/lib/label/label.c +index 72be5ec..09bbb92 100644 +--- a/lib/label/label.c ++++ b/lib/label/label.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + + /* FIXME Allow for larger labels? Restricted to single sector currently */ + +@@ -867,6 +868,57 @@ static void _free_hints(struct dm_list *hints) + } + + /* ++ * We don't know how many of num_devs will be PVs that we need to ++ * keep open, but if it's greater than the soft limit, then we'll ++ * need the soft limit raised, so do that before starting. ++ * ++ * If opens approach the raised soft/hard limit while scanning, then ++ * we could also attempt to raise the soft/hard limits during the scan. ++ */ ++ ++#define BASE_FD_COUNT 32 /* Number of open files we want apart from devs */ ++ ++static void _prepare_open_file_limit(struct cmd_context *cmd, unsigned int num_devs) ++{ ++ struct rlimit old, new; ++ unsigned int want = num_devs + BASE_FD_COUNT; ++ int rv; ++ ++ rv = prlimit(0, RLIMIT_NOFILE, NULL, &old); ++ if (rv < 0) { ++ log_debug("Checking fd limit for num_devs %u failed %d", num_devs, errno); ++ return; ++ } ++ ++ log_debug("Checking fd limit for num_devs %u want %u soft %lld hard %lld", ++ num_devs, want, (long long)old.rlim_cur, (long long)old.rlim_max); ++ ++ /* Current soft limit is enough */ ++ if (old.rlim_cur > want) ++ return; ++ ++ /* Soft limit already raised to max */ ++ if (old.rlim_cur == old.rlim_max) ++ return; ++ ++ /* Raise soft limit up to hard/max limit */ ++ new.rlim_cur = old.rlim_max; ++ new.rlim_max = old.rlim_max; ++ ++ log_debug("Setting fd limit for num_devs %u soft %lld hard %lld", ++ num_devs, (long long)new.rlim_cur, (long long)new.rlim_max); ++ ++ rv = prlimit(0, RLIMIT_NOFILE, &new, &old); ++ if (rv < 0) { ++ if (errno == EPERM) ++ log_warn("WARNING: permission error setting open file limit for scanning %u devices.", num_devs); ++ else ++ log_warn("WARNING: cannot set open file limit for scanning %u devices.", num_devs); ++ return; ++ } ++} ++ ++/* + * Scan devices on the system to discover which are LVM devices. + * Info about the LVM devices (PVs) is saved in lvmcache in a + * basic/summary form (info/vginfo structs). The vg_read phase +@@ -984,6 +1036,15 @@ int label_scan(struct cmd_context *cmd) + log_debug("Will scan %d devices skip %d", dm_list_size(&scan_devs), dm_list_size(&all_devs)); + + /* ++ * If the total number of devices exceeds the soft open file ++ * limit, then increase the soft limit to the hard/max limit ++ * in case the number of PVs in scan_devs (it's only the PVs ++ * which we want to keep open) is higher than the current ++ * soft limit. ++ */ ++ _prepare_open_file_limit(cmd, dm_list_size(&scan_devs)); ++ ++ /* + * Do the main scan. + */ + _scan_list(cmd, cmd->filter, &scan_devs, NULL); diff --git a/SOURCES/lvm2-2_03_06-lvconvert-allow-stripes-stripesize-in-mirror-convers.patch b/SOURCES/lvm2-2_03_06-lvconvert-allow-stripes-stripesize-in-mirror-convers.patch new file mode 100644 index 0000000..c669bf2 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-lvconvert-allow-stripes-stripesize-in-mirror-convers.patch @@ -0,0 +1,22 @@ + tools/command-lines.in | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/tools/command-lines.in b/tools/command-lines.in +index 73a1e64..f914650 100644 +--- a/tools/command-lines.in ++++ b/tools/command-lines.in +@@ -343,13 +343,11 @@ DESC: Convert LV to striped. + RULE: all not lv_is_locked lv_is_pvmove + + lvconvert --type mirror LV +-OO: --mirrors SNumber, --regionsize RegionSize, --interval Number, --mirrorlog MirrorLog, OO_LVCONVERT ++OO: --mirrors SNumber, --stripes_long Number, --stripesize SizeKB, --regionsize RegionSize, --interval Number, --mirrorlog MirrorLog, OO_LVCONVERT + OP: PV ... + ID: lvconvert_raid_types + DESC: Convert LV to type mirror (also see type raid1), +-DESC: (also see lvconvert --mirrors). + RULE: all not lv_is_locked lv_is_pvmove +-FLAGS: SECONDARY_SYNTAX + + # When LV is already raid, this changes the raid layout + # (changing layout of raid0 and raid1 not allowed.) diff --git a/SOURCES/lvm2-2_03_06-md-component-detection-for-differing-PV-and-device-s.patch b/SOURCES/lvm2-2_03_06-md-component-detection-for-differing-PV-and-device-s.patch new file mode 100644 index 0000000..02f6f35 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-md-component-detection-for-differing-PV-and-device-s.patch @@ -0,0 +1,51 @@ + lib/metadata/metadata.c | 26 ++++++++++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c +index dc1b501..f7eeb52 100644 +--- a/lib/metadata/metadata.c ++++ b/lib/metadata/metadata.c +@@ -3504,19 +3504,41 @@ static void _set_pv_device(struct format_instance *fid, + struct physical_volume *pv) + { + char buffer[64] __attribute__((aligned(8))); ++ struct cmd_context *cmd = fid->fmt->cmd; ++ struct device *dev; + uint64_t size; + +- if (!(pv->dev = lvmcache_device_from_pvid(fid->fmt->cmd, &pv->id, &pv->label_sector))) { ++ if (!(dev = lvmcache_device_from_pvid(cmd, &pv->id, &pv->label_sector))) { + if (!id_write_format(&pv->id, buffer, sizeof(buffer))) + buffer[0] = '\0'; + +- if (fid->fmt->cmd && !fid->fmt->cmd->pvscan_cache_single) ++ if (cmd && !cmd->pvscan_cache_single) + log_warn("WARNING: Couldn't find device with uuid %s.", buffer); + else + log_debug_metadata("Couldn't find device with uuid %s.", buffer); + } + + /* ++ * If the device and PV are not the size, it's a clue that we might ++ * be reading an MD component (but not necessarily). Skip this check: ++ * . if md component detection is disabled ++ * . if we are already doing full a md check in label scan ++ * . if md_component_checks is auto, not none (full means use_full_md_check is set) ++ */ ++ if (dev && (pv->size != dev->size) && cmd && ++ cmd->md_component_detection && ++ !cmd->use_full_md_check && ++ !strcmp(cmd->md_component_checks, "auto")) { ++ if (dev_is_md_component(dev, NULL, 1)) { ++ log_warn("WARNING: device %s is an md component, not setting device for PV.", ++ dev_name(dev)); ++ dev = NULL; ++ } ++ } ++ ++ pv->dev = dev; ++ ++ /* + * A previous command wrote the VG while this dev was missing, so + * the MISSING flag was included in the PV. + */ diff --git a/SOURCES/lvm2-2_03_06-metadata-include-description-with-command-in-metadat.patch b/SOURCES/lvm2-2_03_06-metadata-include-description-with-command-in-metadat.patch new file mode 100644 index 0000000..e035826 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-metadata-include-description-with-command-in-metadat.patch @@ -0,0 +1,115 @@ + lib/format_text/export.c | 4 ++-- + lib/format_text/format-text.c | 27 ++++++++++++++++++++++++++- + lib/metadata/metadata.h | 1 - + lib/metadata/vg.h | 1 + + test/shell/metadata.sh | 4 ++++ + 5 files changed, 33 insertions(+), 4 deletions(-) + +diff --git a/lib/format_text/export.c b/lib/format_text/export.c +index 841e06d..2a3f844 100644 +--- a/lib/format_text/export.c ++++ b/lib/format_text/export.c +@@ -1086,7 +1086,7 @@ size_t text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf) + return r; + } + +-size_t export_vg_to_buffer(struct volume_group *vg, char **buf) ++static size_t _export_vg_to_buffer(struct volume_group *vg, char **buf) + { + return text_vg_export_raw(vg, "", buf); + } +@@ -1096,7 +1096,7 @@ struct dm_config_tree *export_vg_to_config_tree(struct volume_group *vg) + char *buf = NULL; + struct dm_config_tree *vg_cft; + +- if (!export_vg_to_buffer(vg, &buf)) { ++ if (!_export_vg_to_buffer(vg, &buf)) { + log_error("Could not format metadata for VG %s.", vg->name); + return NULL; + } +diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c +index 13b2c66..6873f19 100644 +--- a/lib/format_text/format-text.c ++++ b/lib/format_text/format-text.c +@@ -493,6 +493,29 @@ static struct volume_group *_vg_read_precommit_raw(struct format_instance *fid, + return vg; + } + ++#define MAX_DESC_LEN 2048 ++ ++static char *_build_desc_write(struct cmd_context *cmd, struct volume_group *vg) ++{ ++ size_t len = strlen(cmd->cmd_line) + 32; ++ char *desc; ++ ++ if (len > MAX_DESC_LEN) ++ len = MAX_DESC_LEN; ++ ++ if (!(desc = zalloc(len))) ++ return_NULL; ++ ++ vg->write_count++; ++ ++ if (vg->write_count == 1) ++ dm_snprintf(desc, len, "Write from %s.", cmd->cmd_line); ++ else ++ dm_snprintf(desc, len, "Write[%u] from %s.", vg->write_count, cmd->cmd_line); ++ ++ return desc; ++} ++ + /* + * VG metadata updates: + * +@@ -576,9 +599,11 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg, + new_buf = fidtc->raw_metadata_buf; + new_size = fidtc->raw_metadata_buf_size; + } else { +- new_size = text_vg_export_raw(vg, "", &new_buf); ++ char *desc = _build_desc_write(fid->fmt->cmd, vg); ++ new_size = text_vg_export_raw(vg, desc, &new_buf); + fidtc->raw_metadata_buf = new_buf; + fidtc->raw_metadata_buf_size = new_size; ++ free(desc); + } + + if (!new_size || !new_buf) { +diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h +index 63ee4a6..2fc0015 100644 +--- a/lib/metadata/metadata.h ++++ b/lib/metadata/metadata.h +@@ -473,7 +473,6 @@ void lv_calculate_readahead(const struct logical_volume *lv, uint32_t *read_ahea + /* + * For internal metadata caching. + */ +-size_t export_vg_to_buffer(struct volume_group *vg, char **buf); + struct dm_config_tree *export_vg_to_config_tree(struct volume_group *vg); + struct volume_group *import_vg_from_config_tree(const struct dm_config_tree *cft, + struct format_instance *fid); +diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h +index 6e89b33..2e21461 100644 +--- a/lib/metadata/vg.h ++++ b/lib/metadata/vg.h +@@ -42,6 +42,7 @@ struct volume_group { + struct lvmcache_vginfo *vginfo; + uint32_t seqno; /* Metadata sequence number */ + unsigned skip_validate_lock_args : 1; ++ uint32_t write_count; /* count the number of vg_write calls */ + + /* + * The parsed committed (on-disk) copy of this VG; is NULL if this VG is committed +diff --git a/test/shell/metadata.sh b/test/shell/metadata.sh +index a86bc0b..f5d6483 100644 +--- a/test/shell/metadata.sh ++++ b/test/shell/metadata.sh +@@ -26,6 +26,10 @@ pvcreate --metadatacopies 0 "$dev5" + vgcreate $SHARED "$vg" "${DEVICES[@]}" + lvcreate -n $lv -l 1 -i5 -I256 $vg + ++pvck --dump metadata "$dev1" > meta1 ++grep "description = " meta1 > desc1 ++grep "Write from lvcreate" desc1 ++ + pvchange -x n "$dev1" + pvchange -x y "$dev1" + vgchange -a n $vg diff --git a/SOURCES/lvm2-2_03_06-pvck-fix-looping-dump-metadata_all.patch b/SOURCES/lvm2-2_03_06-pvck-fix-looping-dump-metadata_all.patch new file mode 100644 index 0000000..43b5c0b --- /dev/null +++ b/SOURCES/lvm2-2_03_06-pvck-fix-looping-dump-metadata_all.patch @@ -0,0 +1,17 @@ + tools/pvck.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/pvck.c b/tools/pvck.c +index 3437164..af2dd8e 100644 +--- a/tools/pvck.c ++++ b/tools/pvck.c +@@ -395,6 +395,9 @@ static int _dump_meta_all(struct device *dev, const char *tofile, + search_offset = meta_offset + meta_size; + + search_next: ++ if (search_wrapped && (search_offset >= meta_offset + meta_size)) ++ goto done; ++ + if (search_offset > mda_size) { + if (search_wrapped) + goto done; diff --git a/SOURCES/lvm2-2_03_06-pvscan-fix-PV-online-when-device-has-a-different-siz.patch b/SOURCES/lvm2-2_03_06-pvscan-fix-PV-online-when-device-has-a-different-siz.patch new file mode 100644 index 0000000..ae06be5 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-pvscan-fix-PV-online-when-device-has-a-different-siz.patch @@ -0,0 +1,61 @@ + tools/pvscan.c | 40 ++++++++++------------------------------ + 1 file changed, 10 insertions(+), 30 deletions(-) + +diff --git a/tools/pvscan.c b/tools/pvscan.c +index d41345f..db813ad 100644 +--- a/tools/pvscan.c ++++ b/tools/pvscan.c +@@ -621,6 +621,16 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev, + set_pv_devices(baton.fid, baton.vg); + } + ++ /* This check repeated because set_pv_devices can do new md check. */ ++ if (dev->flags & DEV_IS_MD_COMPONENT) { ++ log_print("pvscan[%d] PV %s ignore MD component, ignore metadata.", getpid(), dev_name(dev)); ++ if (baton.vg) ++ release_vg(baton.vg); ++ else ++ fmt->ops->destroy_instance(baton.fid); ++ return 1; ++ } ++ + if (baton.vg && vg_is_shared(baton.vg)) { + log_print("pvscan[%d] PV %s ignore shared VG.", getpid(), dev_name(dev)); + release_vg(baton.vg); +@@ -638,36 +648,6 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev, + return 1; + } + +- /* +- * Do not consider a device online (for purposes of autoactivation) +- * if its size does not match the PV size recorded in the metadata. +- * It may mean that it's not the correct dev for the PV, e.g. it +- * could be an md component device that's not been filtered. +- */ +- if (baton.vg && cmd->check_pv_dev_sizes) { +- struct pv_list *pvl; +- uint64_t dev_size = 0; +- uint64_t meta_pv_size = 0; +- +- dm_list_iterate_items(pvl, &baton.vg->pvs) { +- if (pvl->pv->dev != dev) +- continue; +- +- if (!dev_get_size(dev, &dev_size)) +- stack; +- meta_pv_size = pv_size(pvl->pv); +- break; +- } +- +- if (dev_size != meta_pv_size) { +- log_print("pvscan[%d] PV %s ignore for size %llu not matching device %llu.", +- getpid(), dev_name(dev), +- (unsigned long long)meta_pv_size, (unsigned long long)dev_size); +- release_vg(baton.vg); +- return 1; +- } +- } +- + ret = _online_pv_found(cmd, dev, dev_args, baton.vg, found_vgnames); + + /* diff --git a/SOURCES/lvm2-2_03_06-test-Fix-unbound-variable.patch b/SOURCES/lvm2-2_03_06-test-Fix-unbound-variable.patch new file mode 100644 index 0000000..a7a1efe --- /dev/null +++ b/SOURCES/lvm2-2_03_06-test-Fix-unbound-variable.patch @@ -0,0 +1,28 @@ + test/lib/aux.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/test/lib/aux.sh b/test/lib/aux.sh +index 09ef9ed..0cc26a4 100644 +--- a/test/lib/aux.sh ++++ b/test/lib/aux.sh +@@ -1387,17 +1387,17 @@ version_at_least() { + IFS=".-" read -r major minor revision <<< "$1" + shift + +- test -z "$1" && return 0 ++ test -z "${1:-}" && return 0 + test -n "$major" || return 1 + test "$major" -gt "$1" && return 0 + test "$major" -eq "$1" || return 1 + +- test -z "$2" && return 0 ++ test -n "$2" || return 0 + test -n "$minor" || return 1 + test "$minor" -gt "$2" && return 0 + test "$minor" -eq "$2" || return 1 + +- test -z "$3" && return 0 ++ test -n "$3" || return 0 + test "$revision" -ge "$3" 2>/dev/null || return 1 + } + # diff --git a/SOURCES/lvm2-2_03_06-test-Remove-now-useless-clvmd-test.patch b/SOURCES/lvm2-2_03_06-test-Remove-now-useless-clvmd-test.patch new file mode 100644 index 0000000..7fbe161 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-test-Remove-now-useless-clvmd-test.patch @@ -0,0 +1,83 @@ + test/shell/clvmd-restart.sh | 73 --------------------------------------------- + 1 file changed, 73 deletions(-) + delete mode 100644 test/shell/clvmd-restart.sh + +diff --git a/test/shell/clvmd-restart.sh b/test/shell/clvmd-restart.sh +deleted file mode 100644 +index 7e3257a..0000000 +--- a/test/shell/clvmd-restart.sh ++++ /dev/null +@@ -1,73 +0,0 @@ +-#!/usr/bin/env bash +- +-# Copyright (C) 2011-2015 Red Hat, Inc. All rights reserved. +-# +-# This copyrighted material is made available to anyone wishing to use, +-# modify, copy, or redistribute it subject to the terms and conditions +-# of the GNU General Public License v.2. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +- +-# set before test's clvmd is started, so it's passed in environ +-export LVM_CLVMD_BINARY=clvmd +-export LVM_BINARY=lvm +- +-SKIP_WITH_LVMLOCKD=1 +-SKIP_WITHOUT_CLVMD=1 +-SKIP_WITH_LVMPOLLD=1 +- +-. lib/inittest +- +-# only clvmd based test, skip otherwise +-read -r LOCAL_CLVMD < LOCAL_CLVMD +- +-# TODO read from build, for now hardcoded +-CLVMD_SOCKET="/var/run/lvm/clvmd.sock" +- +-restart_clvmd_() { +- "$LVM_CLVMD_BINARY" -S +- ls -la "$CLVMD_SOCKET" || true +- +- for i in $(seq 1 20) ; do +- test -S "$CLVMD_SOCKET" && break +- sleep .1 +- done +- # restarted clvmd has the same PID (no fork, only execvp) +- NEW_LOCAL_CLVMD=$(pgrep clvmd) +- test "$LOCAL_CLVMD" -eq "$NEW_LOCAL_CLVMD" +-} +- +-aux prepare_vg +- +-lvcreate -an --zero n -n $lv1 -l1 $vg +-lvcreate -an --zero n -n $lv2 -l1 $vg +-lvcreate -l1 $vg +- +-lvchange -aey $vg/$lv1 +-lvchange -aey $vg/$lv2 +- +-restart_clvmd_ +- +-# try restart once more +-restart_clvmd_ +- +-# FIXME: Hmm - how could we test exclusivity is preserved in singlenode ? +-lvchange -an $vg/$lv1 +-lvchange -aey $vg/$lv1 +-lvcreate -s -l3 -n snap $vg/$lv1 +- +-"$LVM_CLVMD_BINARY" -R +- +-vgchange -an $vg +- +-# Test what happens after 'reboot' +-kill "$LOCAL_CLVMD" +-while test -e "$CLVMD_PIDFILE"; do echo -n .; sleep .1; done # wait for the pid removal +-aux prepare_clvmd +- +-vgchange -ay $vg +-lvremove -f $vg/snap +- +-vgremove -ff $vg diff --git a/SOURCES/lvm2-2_03_06-tests-Fix-unbound-variable.patch b/SOURCES/lvm2-2_03_06-tests-Fix-unbound-variable.patch new file mode 100644 index 0000000..3ad7672 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-Fix-unbound-variable.patch @@ -0,0 +1,28 @@ + test/lib/aux.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/test/lib/aux.sh b/test/lib/aux.sh +index 0cc26a4..e3f624c 100644 +--- a/test/lib/aux.sh ++++ b/test/lib/aux.sh +@@ -1387,17 +1387,17 @@ version_at_least() { + IFS=".-" read -r major minor revision <<< "$1" + shift + +- test -z "${1:-}" && return 0 ++ test -n "${1:-}" || return 0 + test -n "$major" || return 1 + test "$major" -gt "$1" && return 0 + test "$major" -eq "$1" || return 1 + +- test -n "$2" || return 0 ++ test -n "${2:-}" || return 0 + test -n "$minor" || return 1 + test "$minor" -gt "$2" && return 0 + test "$minor" -eq "$2" || return 1 + +- test -n "$3" || return 0 ++ test -n "${3:-}" || return 0 + test "$revision" -ge "$3" 2>/dev/null || return 1 + } + # diff --git a/SOURCES/lvm2-2_03_06-tests-accept-also-value-512.patch b/SOURCES/lvm2-2_03_06-tests-accept-also-value-512.patch new file mode 100644 index 0000000..b2610ac --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-accept-also-value-512.patch @@ -0,0 +1,17 @@ + test/shell/lvchange-cache.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/test/shell/lvchange-cache.sh b/test/shell/lvchange-cache.sh +index ab7c8b0..93c8c3b 100644 +--- a/test/shell/lvchange-cache.sh ++++ b/test/shell/lvchange-cache.sh +@@ -88,7 +88,8 @@ grep 'random_threshold=4' out + else + # When MQ is emulated by SMQ policy it does not hold settings. + # So just skip testing of param changes when sequential_threshold=0 +-grep 'sequential_threshold=0' out ++# or some older kernel instancies show also value 512 ++grep 'sequential_threshold=0' out || grep 'sequential_threshold=512' out + fi + + fi # have_cache 1 5 0 diff --git a/SOURCES/lvm2-2_03_06-tests-add-exported.sh.patch b/SOURCES/lvm2-2_03_06-tests-add-exported.sh.patch new file mode 100644 index 0000000..3002bad --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-add-exported.sh.patch @@ -0,0 +1,217 @@ + test/shell/exported.sh | 207 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 207 insertions(+) + create mode 100644 test/shell/exported.sh + +diff --git a/test/shell/exported.sh b/test/shell/exported.sh +new file mode 100644 +index 0000000..b6d17ce +--- /dev/null ++++ b/test/shell/exported.sh +@@ -0,0 +1,207 @@ ++#!/usr/bin/env bash ++ ++# Copyright (C) 2008-2013,2018 Red Hat, Inc. All rights reserved. ++# ++# This copyrighted material is made available to anyone wishing to use, ++# modify, copy, or redistribute it subject to the terms and conditions ++# of the GNU General Public License v.2. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software Foundation, ++# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++. lib/inittest ++ ++# Check what is and is not permitted on an exported VG/PV ++ ++aux prepare_devs 3 ++get_devs ++ ++vgcreate $vg1 "$dev1" ++vgcreate $vg2 "$dev2" ++ ++lvcreate -l1 -n $lv1 -an $vg1 ++lvcreate -l1 -n $lv2 -an $vg2 ++ ++vgchange --addtag aa $vg1 ++lvchange --addtag bb $vg1/$lv1 ++ ++# vgexport only when no lvs are active ++lvchange -ay $vg1/$lv1 ++not vgexport $vg1 ++lvchange -an $vg1/$lv1 ++ ++vgexport $vg1 ++ ++lvm fullreport |tee out ++grep $vg1 out ++ ++lvm fullreport $vg1 |tee out ++grep $vg1 out ++ ++not lvchange -ay $vg1 ++not lvchange -ay $vg1/$lv1 ++not lvchange --addtag bar $vg1/$lv1 ++not lvchange --monitor y $vg1/$lv1 ++ ++not lvconvert --type mirror $vg1/$lv1 ++ ++not lvcreate -l1 $vg1 ++ ++not lvdisplay $vg1 ++ ++lvdisplay 2>&1|tee out ++not grep $vg1 out ++ ++not lvextend -l+1 $vg1/$lv1 ++ ++lvmdiskscan 2>&1|tee foo ++grep "$dev1" foo ++ ++not lvreduce -l-1 $vg1/$lv1 ++ ++not lvremove $vg1 ++not lvremove $vg1/$lv1 ++ ++not lvrename $vg1 $lv1 $lv2 ++ ++not lvresize --size 1M $vg1/$lv1 ++ ++not lvs $vg1 ++ ++lvs 2>&1|tee out ++not grep $vg1 out ++ ++lvscan 2>&1|tee out ++not grep $vg1 out ++ ++not pvchange --addtag cc "$dev1" ++pvs -o+tags "$dev1" 2>&1|tee out ++grep "$dev1" out ++not grep cc out ++ ++pvs -osize "$dev1" > before ++not pvresize --setphysicalvolumesize 100M "$dev1" ++pvs -osize "$dev1" > after ++diff before after ++ ++pvck "$dev1" ++pvck --dump headers "$dev1" > out ++grep "label_header at 512" out ++ ++not pvcreate "$dev1" ++ ++pvdisplay "$dev1" 2>&1|tee out ++grep "$dev1" out ++ ++not pvmove "$dev1" ++ ++not pvremove "$dev1" ++ ++pvs "$dev1" 2>&1|tee out ++grep "$dev1" out ++ ++pvscan 2>&1|tee out ++grep "$dev1" out ++ ++pvscan --cache 2>&1|tee out ++grep "$dev1" out ++ ++vgcfgbackup $vg1 ++ ++vgcfgrestore $vg1 ++ ++not vgchange -ay $vg1 ++not vgchange --addtag asdf $vg1 ++not vgchange --monitor y $vg1 ++ ++not vgck $vg1 ++ ++not vgcreate $vg1 "$dev3" ++ ++vgdisplay $vg1 2>&1|tee out ++grep $vg1 out ++ ++not vgexport $vg1 ++ ++vgexport $vg2 ++not lvcreate -l1 -n $lv3 -an $vg2 ++vgimport $vg2 ++lvcreate -l1 -n $lv3 -an $vg2 ++lvremove $vg2/$lv3 ++ ++not vgextend $vg1 "$dev3" ++ ++not vgmerge $vg1 $vg2 ++ ++not vgmknodes $vg1 ++ ++not vgreduce --removemissing $vg1 ++ ++not vgremove $vg1 ++ ++vgrename $vg1 $vg3 ++vgrename $vg3 $vg1 ++ ++vgs $vg1 2>&1|tee out ++grep $vg1 out ++ ++vgscan 2>&1|tee out ++grep $vg1 out ++ ++# pvscan --cache tracks online state of exported PVs, ++# but autoactivation should not activate LVs. ++pvscan --cache -aay "$dev1" ++vgimport $vg1 ++check inactive $vg1 $lv1 ++vgexport $vg1 ++ ++# using a tag does not give access to exported vg ++lvchange -ay @foo ++vgimport $vg1 ++check inactive $vg1 $lv1 ++vgexport $vg1 ++ ++# using select does not give access to exported vg ++lvchange -ay --select lvname=$lv1 ++vgimport $vg1 ++check inactive $vg1 $lv1 ++vgexport $vg1 ++ ++# tag or select do not work with vgremove on exported vg ++vgremove @foo ++vgs $vg1 ++vgremove --select vgname=$vg1 ++vgs $vg1 ++ ++# exported vg is skipped without error when not named ++vgchange -ay ++vgimport $vg1 ++check inactive $vg1 $lv1 ++vgexport $vg1 ++ ++# exported vg is skipped without error when not named ++vgchange --addtag newtag ++vgs -o tags $vg1 > out ++not grep newtag out ++vgchange --deltag aa ++vgs -o tags $vg1 > out ++grep aa out ++ ++# exported vg is skipped without error when not named ++vgchange --monitor y ++vgchange --monitor n ++ ++vgimport $vg1 ++vgextend $vg1 "$dev3" ++vgexport $vg1 ++ ++not vgreduce $vg1 "$dev3" ++ ++not vgsplit $vg1 "$vg3" "$dev3" ++ ++# For vgimportclone see vgimportclone.sh ++ ++vgimport $vg1 ++vgremove -ff $vg1 ++vgremove -ff $vg2 diff --git a/SOURCES/lvm2-2_03_06-tests-add-settle-wait-before-issue-remove.patch b/SOURCES/lvm2-2_03_06-tests-add-settle-wait-before-issue-remove.patch new file mode 100644 index 0000000..26cf3a9 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-add-settle-wait-before-issue-remove.patch @@ -0,0 +1,15 @@ + test/shell/fsadm-crypt.sh | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/test/shell/fsadm-crypt.sh b/test/shell/fsadm-crypt.sh +index 9377e89..4b8fc4e 100644 +--- a/test/shell/fsadm-crypt.sh ++++ b/test/shell/fsadm-crypt.sh +@@ -83,6 +83,7 @@ export LVM_BINARY + test ! -d "$mount_dir" && mkdir "$mount_dir" + + crypt_close() { ++ aux udev_wait + cryptsetup remove "$1" + if [ "$?" -eq 0 -a -n "$DROP_SYMLINK" ]; then + rm -f "$DM_DEV_DIR/mapper/$1" diff --git a/SOURCES/lvm2-2_03_06-tests-allow-mixed-block-sizes.patch b/SOURCES/lvm2-2_03_06-tests-allow-mixed-block-sizes.patch new file mode 100644 index 0000000..b44cd94 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-allow-mixed-block-sizes.patch @@ -0,0 +1,54 @@ + test/shell/allow-mixed-block-sizes.sh | 44 +++++++++++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + create mode 100644 test/shell/allow-mixed-block-sizes.sh + +diff --git a/test/shell/allow-mixed-block-sizes.sh b/test/shell/allow-mixed-block-sizes.sh +new file mode 100644 +index 0000000..1803256 +--- /dev/null ++++ b/test/shell/allow-mixed-block-sizes.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++ ++# Copyright (C) 2019 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 ++ ++dd if=/dev/zero of=loopa bs=$((1024*1024)) count=2 2> /dev/null ++dd if=/dev/zero of=loopb bs=$((1024*1024)) count=2 2> /dev/null ++LOOP1=$(losetup -f loopa --sector-size 4096 --show) ++LOOP2=$(losetup -f loopb --show) ++ ++echo $LOOP1 ++echo $LOOP2 ++ ++aux extend_filter "a|$LOOP1|" ++aux extend_filter "a|$LOOP2|" ++ ++not vgcreate --config 'devices {allow_mixed_block_sizes=0 scan="/dev"}' $vg $LOOP1 $LOOP2 ++vgcreate --config 'devices {allow_mixed_block_sizes=1 scan="/dev"}' $vg $LOOP1 $LOOP2 ++vgs --config 'devices {allow_mixed_block_sizes=1 scan="/dev"}' $vg ++ ++wipefs -a $LOOP1 ++wipefs -a $LOOP2 ++ ++vgcreate --config 'devices {allow_mixed_block_sizes=1 scan="/dev"}' $vg $LOOP1 ++vgs --config 'devices {allow_mixed_block_sizes=1 scan="/dev"}' $vg ++not vgextend --config 'devices {allow_mixed_block_sizes=0 scan="/dev"}' $vg $LOOP2 ++vgextend --config 'devices {allow_mixed_block_sizes=1 scan="/dev"}' $vg $LOOP2 ++ ++losetup -d $LOOP1 ++losetup -d $LOOP2 ++rm loopa ++rm loopb ++ diff --git a/SOURCES/lvm2-2_03_06-tests-extend-lvm-on-md.patch b/SOURCES/lvm2-2_03_06-tests-extend-lvm-on-md.patch new file mode 100644 index 0000000..f7720b7 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-extend-lvm-on-md.patch @@ -0,0 +1,357 @@ + test/shell/lvm-on-md.sh | 257 ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 237 insertions(+), 20 deletions(-) + +diff --git a/test/shell/lvm-on-md.sh b/test/shell/lvm-on-md.sh +index 22cbee8..c848083 100644 +--- a/test/shell/lvm-on-md.sh ++++ b/test/shell/lvm-on-md.sh +@@ -42,7 +42,7 @@ aux lvmconf 'devices/obtain_device_list_from_udev = 0' + + aux extend_filter_LVMTEST "a|/dev/md|" + +-aux prepare_devs 2 ++aux prepare_devs 3 + + # create 2 disk MD raid1 array + # by default using metadata format 1.0 with data at the end of device +@@ -55,6 +55,9 @@ pvdev=$(< MD_DEV_PV) + + vgcreate $vg "$mddev" + ++PVIDMD=`pvs $mddev --noheading -o uuid | tr -d - | awk '{print $1}'` ++echo $PVIDMD ++ + lvcreate -n $lv1 -l 2 $vg + lvcreate -n $lv2 -l 2 -an $vg + +@@ -87,7 +90,8 @@ pvs > out + not grep "$dev1" out + not grep "$dev2" out + +-pvs -vvvv ++pvs 2>&1|tee out ++not grep "Not using device" out + + # should not activate from the md legs + not vgchange -ay $vg +@@ -105,42 +109,62 @@ _clear_online_files + pvscan --cache -aay "$dev1" + pvscan --cache -aay "$dev2" + ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ + # should not show an active lv + rm out + lvs -o active $vg |tee out || true + not grep "active" out + +-# start the md dev + mdadm --assemble "$mddev" "$dev1" "$dev2" + aux udev_wait + +-# Now that the md dev is online, pvs can see it +-# and check for components even if +-# md_component_checks is "start" (which disables +-# most default end-of-device scans) +-aux lvmconf 'devices/md_component_checks = "start"' +- + not pvs "$dev1" + not pvs "$dev2" + pvs > out + not grep "$dev1" out + not grep "$dev2" out + ++lvs $vg ++vgchange -an $vg ++ ++# should not activate from the md legs ++_clear_online_files ++pvscan --cache -aay "$dev1" ++pvscan --cache -aay "$dev2" ++ ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++# should not show an active lv ++rm out ++lvs -o active $vg |tee out || true ++not grep "active" out + + vgchange -ay $vg + + check lv_field $vg/$lv1 lv_active "active" + + vgchange -an $vg ++ ++_clear_online_files ++pvscan --cache -aay "$mddev" ++ ++ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++lvs -o active $vg |tee out || true ++grep "active" out ++ ++vgchange -an $vg ++ + aux udev_wait + + vgremove -f $vg + + aux cleanup_md_dev + +-# Put this setting back to the default +-aux lvmconf 'devices/md_component_checks = "auto"' +- + # create 2 disk MD raid0 array + # by default using metadata format 1.0 with data at the end of device + # When a raid0 md array is stopped, the components will not look like +@@ -154,7 +178,8 @@ pvdev=$(< MD_DEV_PV) + + vgcreate $vg "$mddev" + +-lvs $vg ++PVIDMD=`pvs $mddev --noheading -o uuid | tr -d - | awk '{print $1}'` ++echo $PVIDMD + + lvcreate -n $lv1 -l 2 $vg + lvcreate -n $lv2 -l 2 -an $vg +@@ -188,7 +213,8 @@ pvs > out + not grep "$dev1" out + not grep "$dev2" out + +-pvs -vvvv ++pvs 2>&1|tee out ++not grep "Not using device" out + + # should not activate from the md legs + not vgchange -ay $vg +@@ -206,6 +232,9 @@ _clear_online_files + pvscan --cache -aay "$dev1" + pvscan --cache -aay "$dev2" + ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ + # should not show an active lv + rm out + lvs -o active $vg |tee out || true +@@ -215,23 +244,211 @@ not grep "active" out + mdadm --assemble "$mddev" "$dev1" "$dev2" + aux udev_wait + +-# Now that the md dev is online, pvs can see it +-# and check for components even if +-# md_component_checks is "start" (which disables +-# most default end-of-device scans) +-aux lvmconf 'devices/md_component_checks = "start"' ++not pvs "$dev1" ++not pvs "$dev2" ++pvs > out ++not grep "$dev1" out ++not grep "$dev2" out ++ ++lvs $vg ++vgchange -an $vg ++ ++# should not activate from the md legs ++_clear_online_files ++pvscan --cache -aay "$dev1" ++pvscan --cache -aay "$dev2" ++ ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++# should not show an active lv ++rm out ++lvs -o active $vg |tee out || true ++not grep "active" out ++ ++vgchange -ay $vg ++ ++check lv_field $vg/$lv1 lv_active "active" ++ ++vgchange -an $vg ++ ++_clear_online_files ++pvscan --cache -aay "$mddev" ++ ++ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++lvs -o active $vg |tee out || true ++grep "active" out ++ ++vgchange -an $vg ++ ++aux udev_wait ++ ++vgremove -f $vg ++ ++aux cleanup_md_dev ++ ++# Repeat tests using the default config settings ++ ++aux lvmconf 'devices/hints = "all"' ++aux lvmconf 'devices/obtain_device_list_from_udev = 1' ++ ++# create 2 disk MD raid0 array ++# by default using metadata format 1.0 with data at the end of device ++# When a raid0 md array is stopped, the components will not look like ++# duplicate PVs as they do with raid1. ++aux prepare_md_dev 0 64 2 "$dev1" "$dev2" ++ ++cat /proc/mdstat ++ ++mddev=$(< MD_DEV) ++pvdev=$(< MD_DEV_PV) ++ ++# Create an unused PV so that there is at least one PV in the hints ++# when the MD dev is stopped. If there are no PVs, the hints are ++# empty, and the code falls back to scanning all, and we do not end ++# up testing the code with hints actively used. ++pvcreate "$dev3" ++ ++vgcreate $vg "$mddev" ++ ++PVIDMD=`pvs $mddev --noheading -o uuid | tr -d - | awk '{print $1}'` ++echo $PVIDMD ++ ++lvcreate -n $lv1 -l 2 $vg ++lvcreate -n $lv2 -l 2 -an $vg ++ ++lvchange -ay $vg/$lv2 ++check lv_field $vg/$lv1 lv_active "active" ++ ++# lvm does not show md components as PVs ++pvs "$mddev" ++not pvs "$dev1" ++not pvs "$dev2" ++pvs > out ++not grep "$dev1" out ++not grep "$dev2" out ++ ++grep "$mddev" /run/lvm/hints ++grep "$dev3" /run/lvm/hints ++not grep "$dev1" /run/lvm/hints ++not grep "$dev2" /run/lvm/hints ++ ++sleep 1 ++ ++vgchange -an $vg ++sleep 1 ++ ++# When the md device is started, lvm will see that and know to ++# scan for md components, so stop the md device to remove this ++# advantage so we will test the fallback detection. ++mdadm --stop "$mddev" ++aux udev_wait ++ ++# A WARNING indicating duplicate PVs is printed by 'pvs' in this ++# case. It's printed during the scan, but after the scan, the ++# md component detection is run on the devs and they are dropped ++# when we see they are md components. So, we ignore the warning ++# containing the word duplicate, and look for the "Not using device" ++# message, which shouldn't appear, as it would indicate that ++# we didn't drop the md components. ++# FIXME: we should avoid printing the premature warning indicating ++# duplicate PVs which are eventually recognized as md components ++# and dropped. ++pvs 2>&1|tee out1 ++grep -v WARNING out1 > out2 ++not grep "Not using device" out2 ++not grep "$mddev" out2 ++not grep "$dev1" out2 ++not grep "$dev2" out2 ++grep "$dev3" out2 ++cat /run/lvm/hints ++ ++pvs 2>&1|tee out1 ++grep -v WARNING out1 > out2 ++not grep "Not using device" out2 ++not grep "$mddev" out2 ++not grep "$dev1" out2 ++not grep "$dev2" out2 ++grep "$dev3" out2 ++cat /run/lvm/hints + ++# The md components should still be detected and excluded. + not pvs "$dev1" + not pvs "$dev2" + pvs > out + not grep "$dev1" out + not grep "$dev2" out ++grep "$dev3" out + +-vgchange -ay $vg 2>&1 |tee out ++# should not activate from the md legs ++not vgchange -ay $vg ++ ++# should not show an active lv ++rm out ++lvs -o active $vg |tee out || true ++not grep "active" out ++ ++# should not allow updating vg ++not lvcreate -l1 $vg ++ ++# should not activate from the md legs ++_clear_online_files ++pvscan --cache -aay "$dev1" ++pvscan --cache -aay "$dev2" ++ ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++# should not show an active lv ++rm out ++lvs -o active $vg |tee out || true ++not grep "active" out ++ ++# start the md dev ++mdadm --assemble "$mddev" "$dev1" "$dev2" ++aux udev_wait ++ ++not pvs "$dev1" ++not pvs "$dev2" ++pvs > out ++not grep "$dev1" out ++not grep "$dev2" out ++ ++lvs $vg ++vgchange -an $vg ++ ++# should not activate from the md legs ++_clear_online_files ++pvscan --cache -aay "$dev1" ++pvscan --cache -aay "$dev2" ++ ++not ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++not ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++# should not show an active lv ++rm out ++lvs -o active $vg |tee out || true ++not grep "active" out ++ ++vgchange -ay $vg + + check lv_field $vg/$lv1 lv_active "active" + + vgchange -an $vg ++ ++_clear_online_files ++pvscan --cache -aay "$mddev" ++ ++ls "$RUNDIR/lvm/pvs_online/$PVIDMD" ++ls "$RUNDIR/lvm/vgs_online/$vg" ++ ++lvs -o active $vg |tee out || true ++grep "active" out ++ ++vgchange -an $vg ++ + aux udev_wait + + vgremove -f $vg diff --git a/SOURCES/lvm2-2_03_06-tests-fix-ra-checking.patch b/SOURCES/lvm2-2_03_06-tests-fix-ra-checking.patch new file mode 100644 index 0000000..9a5b976 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-fix-ra-checking.patch @@ -0,0 +1,52 @@ + test/shell/lvcreate-usage.sh | 14 ++++++++++---- + test/shell/read-ahead.sh | 6 +++++- + 2 files changed, 15 insertions(+), 5 deletions(-) + +diff --git a/test/shell/lvcreate-usage.sh b/test/shell/lvcreate-usage.sh +index 6d42401..ca8694e 100644 +--- a/test/shell/lvcreate-usage.sh ++++ b/test/shell/lvcreate-usage.sh +@@ -175,15 +175,21 @@ check lv_field $vg/$lv2 lv_kernel_read_ahead "0" + lvcreate -L 8 -n $lv3 --readahead 8k $vg + check lv_field $vg/$lv3 lv_read_ahead "8.00k" + check lv_field $vg/$lv3 lv_kernel_read_ahead "8.00k" +-lvcreate -L 8 -n $lv4 --readahead auto $vg ++lvcreate -L 8 -n $lv4 --readahead auto $vg "$dev1" + check lv_field $vg/$lv4 lv_read_ahead "auto" +-check lv_field $vg/$lv4 lv_kernel_read_ahead "128.00k" ++# figure RA value of a PV origin device ++DEVICE=$(dmsetup deps -o blkdevname "$dev1" | sed -e "s,.*:\ (\(.*\)),/dev/\1,") ++RASZ=$(( $(blockdev --getra "$DEVICE" ) / 2 )) ++SZ="$RASZ.00k" ++test "$RASZ" -ge 128 || SZ="128.00k" ++check lv_field $vg/$lv4 lv_kernel_read_ahead "$SZ" --units k + lvcreate -L 8 -n $lv5 -i2 --stripesize 16k --readahead auto $vg + check lv_field $vg/$lv5 lv_read_ahead "auto" +-check lv_field $vg/$lv5 lv_kernel_read_ahead "128.00k" ++check lv_field $vg/$lv5 lv_kernel_read_ahead "$SZ" --units k + lvcreate -L 8 -n $lv6 -i2 --stripesize 128k --readahead auto $vg + check lv_field $vg/$lv6 lv_read_ahead "auto" +-check lv_field $vg/$lv6 lv_kernel_read_ahead "512.00k" ++test "$RASZ" -ge 512 || SZ="512.00k" ++check lv_field $vg/$lv6 lv_kernel_read_ahead "$SZ" --units k + lvremove -ff $vg + + # +diff --git a/test/shell/read-ahead.sh b/test/shell/read-ahead.sh +index 60e5912..53cc572 100644 +--- a/test/shell/read-ahead.sh ++++ b/test/shell/read-ahead.sh +@@ -35,8 +35,12 @@ lvremove -ff $vg + #COMM "read ahead is properly inherited from underlying PV" + blockdev --setra 768 "$dev1" + vgscan ++DEVICE=$(dmsetup deps -o blkdevname "$dev1" | sed -e "s,.*:\ (\(.*\)),/dev/\1,") ++RASZ=$(blockdev --getra "$DEVICE") ++SZ=$RASZ ++test "$RASZ" -ge 768 || SZ=768 + lvcreate -n $lv -L4m $vg "$dev1" +-test "$(blockdev --getra "$DM_DEV_DIR/$vg/$lv")" -eq 768 ++test "$(blockdev --getra "$DM_DEV_DIR/$vg/$lv")" -eq "$SZ" + lvremove -ff $vg + + # Check default, active/inactive values for read_ahead / kernel_read_ahead diff --git a/SOURCES/lvm2-2_03_06-tests-for-cluster-testing-we-always-need-exclusive-m.patch b/SOURCES/lvm2-2_03_06-tests-for-cluster-testing-we-always-need-exclusive-m.patch new file mode 100644 index 0000000..4b125f7 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-for-cluster-testing-we-always-need-exclusive-m.patch @@ -0,0 +1,16 @@ + test/shell/lvconvert-mirror-split.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/shell/lvconvert-mirror-split.sh b/test/shell/lvconvert-mirror-split.sh +index 40720a4..00291ec 100644 +--- a/test/shell/lvconvert-mirror-split.sh ++++ b/test/shell/lvconvert-mirror-split.sh +@@ -20,7 +20,7 @@ aux prepare_vg 3 + # Mirror split tests + ########################################### + # 3-way to 2-way/linear +-lvcreate --type mirror -m 2 -l 2 -n $lv1 $vg ++lvcreate -aey --type mirror -m 2 -l 2 -n $lv1 $vg + aux wait_for_sync $vg $lv1 + lvconvert --splitmirrors 1 -n $lv2 -vvvv $vg/$lv1 + diff --git a/SOURCES/lvm2-2_03_06-tests-large-physical-sector-size.patch b/SOURCES/lvm2-2_03_06-tests-large-physical-sector-size.patch new file mode 100644 index 0000000..9d0bc45 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-large-physical-sector-size.patch @@ -0,0 +1,53 @@ + test/shell/large-physical-sector-size.sh | 43 ++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + create mode 100644 test/shell/large-physical-sector-size.sh + +diff --git a/test/shell/large-physical-sector-size.sh b/test/shell/large-physical-sector-size.sh +new file mode 100644 +index 0000000..891f409 +--- /dev/null ++++ b/test/shell/large-physical-sector-size.sh +@@ -0,0 +1,43 @@ ++#!/usr/bin/env bash ++ ++# Copyright (C) 2019 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 ++ ++LOGICAL_BLOCK_SIZE=4096 ++ ++# PHYSICAL_BLOCK_SIZE is set with physblk_exp which ++# shifts the logical block size value. ++ ++# 4096 << 9 = 2MB physical block size ++PHYSICAL_BLOCK_SHIFT=9 ++ ++aux prepare_scsi_debug_dev 256 sector_size=$LOGICAL_BLOCK_SIZE physblk_exp=$PHYSICAL_BLOCK_SHIFT ++ ++check sysfs "$(< SCSI_DEBUG_DEV)" queue/logical_block_size "$LOGICAL_BLOCK_SIZE" ++ ++aux prepare_pvs 1 256 ++ ++get_devs ++ ++vgcreate $SHARED $vg "$dev1" ++ ++for i in `seq 1 40`; do lvcreate -an -l1 $vg; done; ++ ++lvs $vg ++ ++lvremove -y $vg ++ ++vgremove $vg ++ ++aux cleanup_scsi_debug_dev diff --git a/SOURCES/lvm2-2_03_06-tests-lvm-on-md-use-variable-run-dir.patch b/SOURCES/lvm2-2_03_06-tests-lvm-on-md-use-variable-run-dir.patch new file mode 100644 index 0000000..670f2d2 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-lvm-on-md-use-variable-run-dir.patch @@ -0,0 +1,48 @@ + test/shell/lvm-on-md.sh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/test/shell/lvm-on-md.sh b/test/shell/lvm-on-md.sh +index c848083..2877ea2 100644 +--- a/test/shell/lvm-on-md.sh ++++ b/test/shell/lvm-on-md.sh +@@ -16,6 +16,7 @@ RUNDIR="/run" + test -d "$RUNDIR" || RUNDIR="/var/run" + PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online" + VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online" ++HINTS="$RUNDIR/lvm/hints" + + _clear_online_files() { + # wait till udev is finished +@@ -330,10 +331,10 @@ pvs > out + not grep "$dev1" out + not grep "$dev2" out + +-grep "$mddev" /run/lvm/hints +-grep "$dev3" /run/lvm/hints +-not grep "$dev1" /run/lvm/hints +-not grep "$dev2" /run/lvm/hints ++grep "$mddev" $HINTS ++grep "$dev3" $HINTS ++not grep "$dev1" $HINTS ++not grep "$dev2" $HINTS + + sleep 1 + +@@ -363,7 +364,7 @@ not grep "$mddev" out2 + not grep "$dev1" out2 + not grep "$dev2" out2 + grep "$dev3" out2 +-cat /run/lvm/hints ++cat $HINTS + + pvs 2>&1|tee out1 + grep -v WARNING out1 > out2 +@@ -372,7 +373,7 @@ not grep "$mddev" out2 + not grep "$dev1" out2 + not grep "$dev2" out2 + grep "$dev3" out2 +-cat /run/lvm/hints ++cat $HINTS + + # The md components should still be detected and excluded. + not pvs "$dev1" diff --git a/SOURCES/lvm2-2_03_06-tests-open-file-limit.patch b/SOURCES/lvm2-2_03_06-tests-open-file-limit.patch new file mode 100644 index 0000000..1154167 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-open-file-limit.patch @@ -0,0 +1,56 @@ + test/shell/open-file-limit.sh | 46 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + create mode 100644 test/shell/open-file-limit.sh + +diff --git a/test/shell/open-file-limit.sh b/test/shell/open-file-limit.sh +new file mode 100644 +index 0000000..87b0f7e +--- /dev/null ++++ b/test/shell/open-file-limit.sh +@@ -0,0 +1,46 @@ ++#!/bin/bash ++# Copyright (C) 2014 Red Hat, Inc. All rights reserved. ++# ++# This copyrighted material is made available to anyone wishing to use, ++# modify, copy, or redistribute it subject to the terms and conditions ++# of the GNU General Public License v.2. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software Foundation, ++# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++# Test scan_lvs config setting ++ ++SKIP_WITH_LVMPOLLD=1 ++SKIP_WITH_LVMLOCKD=1 ++ ++. lib/inittest ++ ++aux lvmconf 'devices/pv_min_size = 1024' ++ ++aux prepare_devs 200 1 ++ ++for i in $(seq 1 200); do ++ pvcreate "$DM_DEV_DIR/mapper/${PREFIX}pv$i" ++done ++ ++pvs > out ++test "$(grep pv out | wc -l)" -eq 200 ++ ++# Set the soft limit to 100 fd's when 200 PVs need to be open. ++# This requires lvm to increase its soft limit in order to ++# process all the PVs. ++# Test this with and without udev providing device lists. ++ ++aux lvmconf 'devices/obtain_device_list_from_udev = 0' ++ ++prlimit --nofile=100: pvs > out ++ ++test "$(grep pv out | wc -l)" -eq 200 ++ ++aux lvmconf 'devices/obtain_device_list_from_udev = 1' ++ ++prlimit --nofile=100: pvs > out ++ ++test "$(grep pv out | wc -l)" -eq 200 ++ diff --git a/SOURCES/lvm2-2_03_06-tests-pvscan-autoactivate-test-unmatching-dev-and-PV.patch b/SOURCES/lvm2-2_03_06-tests-pvscan-autoactivate-test-unmatching-dev-and-PV.patch new file mode 100644 index 0000000..71ef6f7 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-pvscan-autoactivate-test-unmatching-dev-and-PV.patch @@ -0,0 +1,46 @@ + test/shell/pvscan-autoactivate.sh | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +diff --git a/test/shell/pvscan-autoactivate.sh b/test/shell/pvscan-autoactivate.sh +index d674dc5..d79a7e3 100644 +--- a/test/shell/pvscan-autoactivate.sh ++++ b/test/shell/pvscan-autoactivate.sh +@@ -27,7 +27,7 @@ _clear_online_files() { + + . lib/inittest + +-aux prepare_pvs 8 ++aux prepare_devs 8 16 + + vgcreate $vg1 "$dev1" "$dev2" + lvcreate -n $lv1 -l 4 -a n $vg1 +@@ -209,3 +209,29 @@ pvscan --cache -aay + check lv_field $vg3/$lv1 lv_active "active" + lvchange -an $vg3 + ++# Test event activation when PV and dev size don't match ++ ++vgremove -ff $vg3 ++ ++pvremove "$dev8" ++pvcreate -y --setphysicalvolumesize 8M "$dev8" ++ ++PVID8=`pvs $dev8 --noheading -o uuid | tr -d - | awk '{print $1}'` ++echo $PVID8 ++ ++vgcreate $vg3 "$dev8" ++lvcreate -l1 -n $lv1 $vg3 ++check lv_field $vg3/$lv1 lv_active "active" ++vgchange -an $vg3 ++check lv_field $vg3/$lv1 lv_active "" ++ ++_clear_online_files ++ ++pvscan --cache -aay "$dev8" ++check lv_field $vg3/$lv1 lv_active "active" ++ls "$RUNDIR/lvm/pvs_online/$PVID8" ++ls "$RUNDIR/lvm/vgs_online/$vg3" ++vgchange -an $vg3 ++ ++vgremove -ff $vg3 ++ diff --git a/SOURCES/lvm2-2_03_06-tests-replaces-grep-q-usage.patch b/SOURCES/lvm2-2_03_06-tests-replaces-grep-q-usage.patch new file mode 100644 index 0000000..bcb090f --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-replaces-grep-q-usage.patch @@ -0,0 +1,70 @@ + test/lib/aux.sh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/test/lib/aux.sh b/test/lib/aux.sh +index e3f624c..81e8f91 100644 +--- a/test/lib/aux.sh ++++ b/test/lib/aux.sh +@@ -26,7 +26,7 @@ expect_failure() { + check_daemon_in_builddir() { + # skip if we don't have our own deamon... + if test -z "${installed_testsuite+varset}"; then +- (which "$1" 2>/dev/null | grep -q "$abs_builddir") || skip "$1 is not in executed path." ++ (which "$1" 2>/dev/null | grep "$abs_builddir" >/dev/null ) || skip "$1 is not in executed path." + fi + rm -f debug.log strace.log + } +@@ -167,7 +167,7 @@ prepare_clvmd() { + + test -e "$DM_DEV_DIR/control" || dmsetup table >/dev/null # create control node + # skip if singlenode is not compiled in +- (clvmd --help 2>&1 | grep "Available cluster managers" | grep -q "singlenode") || \ ++ (clvmd --help 2>&1 | grep "Available cluster managers" | grep "singlenode" >/dev/null) || \ + skip "Compiled clvmd does not support singlenode for testing." + + # lvmconf "activation/monitoring = 1" +@@ -531,7 +531,7 @@ teardown() { + dm_table | not grep -E -q "$vg|$vg1|$vg2|$vg3|$vg4" || { + # Avoid activation of dmeventd if there is no pid + cfg=$(test -s LOCAL_DMEVENTD || echo "--config activation{monitoring=0}") +- if dm_info suspended,name | grep -q "^Suspended:.*$PREFIX" ; then ++ if dm_info suspended,name | grep "^Suspended:.*$PREFIX" >/dev/null ; then + echo "## skipping vgremove, suspended devices detected." + else + vgremove -ff "$cfg" \ +@@ -662,7 +662,7 @@ prepare_scsi_debug_dev() { + + # Skip test if scsi_debug module is unavailable or is already in use + modprobe --dry-run scsi_debug || skip +- lsmod | not grep -q scsi_debug || skip ++ lsmod | not grep scsi_debug >/dev/null || skip + + # Create the scsi_debug device and determine the new scsi device's name + # NOTE: it will _never_ make sense to pass num_tgts param; +@@ -1447,7 +1447,7 @@ driver_at_least() { + } + + have_thin() { +- lvm segtypes 2>/dev/null | grep -q thin$ || { ++ lvm segtypes 2>/dev/null | grep thin$ >/dev/null || { + echo "Thin is not built-in." >&2 + return 1 + } +@@ -1471,7 +1471,7 @@ have_thin() { + } + + have_vdo() { +- lvm segtypes 2>/dev/null | grep -q vdo$ || { ++ lvm segtypes 2>/dev/null | grep vdo$ >/dev/null || { + echo "VDO is not built-in." >&2 + return 1 + } +@@ -1507,7 +1507,7 @@ have_raid4 () { + } + + have_cache() { +- lvm segtypes 2>/dev/null | grep -q cache$ || { ++ lvm segtypes 2>/dev/null | grep cache$ >/dev/null || { + echo "Cache is not built-in." >&2 + return 1 + } diff --git a/SOURCES/lvm2-2_03_06-tests-simplify-some-var-settings.patch b/SOURCES/lvm2-2_03_06-tests-simplify-some-var-settings.patch new file mode 100644 index 0000000..5a1e36e --- /dev/null +++ b/SOURCES/lvm2-2_03_06-tests-simplify-some-var-settings.patch @@ -0,0 +1,192 @@ + test/lib/aux.sh | 2 +- + test/shell/discards-thin.sh | 2 -- + test/shell/lvconvert-thin.sh | 2 -- + test/shell/lvcreate-large-raid10.sh | 1 - + test/shell/lvcreate-large.sh | 2 -- + test/shell/pvcreate-operation-md.sh | 3 +-- + test/shell/pvcreate-restore.sh | 2 -- + test/shell/pvremove-thin.sh | 2 -- + test/shell/scan-lvs.sh | 4 +--- + test/shell/snapshot-remove-dmsetup.sh | 2 -- + test/shell/snapshot-usage-exa.sh | 2 -- + test/shell/snapshot-usage.sh | 2 -- + test/shell/vgsplit-stacked.sh | 2 -- + 13 files changed, 3 insertions(+), 25 deletions(-) + +diff --git a/test/lib/aux.sh b/test/lib/aux.sh +index 81e8f91..32d5a0b 100644 +--- a/test/lib/aux.sh ++++ b/test/lib/aux.sh +@@ -1164,7 +1164,7 @@ devices/default_data_alignment = 1 + devices/dir = "$DM_DEV_DIR" + devices/filter = "a|.*|" + devices/global_filter = [ "a|$DM_DEV_DIR/mapper/${PREFIX}.*pv[0-9_]*$|", "r|.*|" ] +-devices/md_component_detection = 0 ++devices/md_component_detection = 0 + devices/scan = "$DM_DEV_DIR" + devices/sysfs_scan = 1 + devices/write_cache_state = 0 +diff --git a/test/shell/discards-thin.sh b/test/shell/discards-thin.sh +index 3564a87..f27d4c3 100644 +--- a/test/shell/discards-thin.sh ++++ b/test/shell/discards-thin.sh +@@ -25,8 +25,6 @@ export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false} + # + aux have_thin 1 1 0 || skip + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux prepare_vg 2 64 + get_devs + +diff --git a/test/shell/lvconvert-thin.sh b/test/shell/lvconvert-thin.sh +index 731c45b..1f8d2ed 100644 +--- a/test/shell/lvconvert-thin.sh ++++ b/test/shell/lvconvert-thin.sh +@@ -17,8 +17,6 @@ export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false} + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + prepare_lvs() { + lvremove -f $vg + lvcreate -L10M -n $lv1 $vg +diff --git a/test/shell/lvcreate-large-raid10.sh b/test/shell/lvcreate-large-raid10.sh +index 1ad09aa..a46be37 100644 +--- a/test/shell/lvcreate-large-raid10.sh ++++ b/test/shell/lvcreate-large-raid10.sh +@@ -20,7 +20,6 @@ SKIP_WITH_LVMPOLLD=1 + # FIXME update test to make something useful on <16T + aux can_use_16T || skip + aux have_raid 1 3 0 || skip +-aux lvmconf 'devices/scan_lvs = 1' + + aux prepare_vg 5 + +diff --git a/test/shell/lvcreate-large.sh b/test/shell/lvcreate-large.sh +index b1cb0b0..473b0ed 100644 +--- a/test/shell/lvcreate-large.sh ++++ b/test/shell/lvcreate-large.sh +@@ -17,8 +17,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + # FIXME update test to make something useful on <16T + aux can_use_16T || skip + +diff --git a/test/shell/pvcreate-operation-md.sh b/test/shell/pvcreate-operation-md.sh +index 11f0887..4b51932 100644 +--- a/test/shell/pvcreate-operation-md.sh ++++ b/test/shell/pvcreate-operation-md.sh +@@ -22,8 +22,7 @@ test -f /proc/mdstat && grep -q raid0 /proc/mdstat || \ + modprobe raid0 || skip + + aux lvmconf 'devices/md_component_detection = 1' +-aux extend_filter_LVMTEST +-aux extend_filter "a|/dev/md.*|" ++aux extend_filter_LVMTEST "a|/dev/md|" + + aux prepare_devs 2 + +diff --git a/test/shell/pvcreate-restore.sh b/test/shell/pvcreate-restore.sh +index 789f45c..d0b46eb 100644 +--- a/test/shell/pvcreate-restore.sh ++++ b/test/shell/pvcreate-restore.sh +@@ -15,8 +15,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux prepare_vg 4 + + lvcreate --type snapshot -s -L10 -n $lv1 $vg --virtualsize 2T +diff --git a/test/shell/pvremove-thin.sh b/test/shell/pvremove-thin.sh +index 84a2a55..9859b6c 100644 +--- a/test/shell/pvremove-thin.sh ++++ b/test/shell/pvremove-thin.sh +@@ -18,8 +18,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux prepare_vg + + aux have_thin 1 8 0 || skip +diff --git a/test/shell/scan-lvs.sh b/test/shell/scan-lvs.sh +index 8e8a77d..f49bf4d 100644 +--- a/test/shell/scan-lvs.sh ++++ b/test/shell/scan-lvs.sh +@@ -15,10 +15,9 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + ++# Sets 'scan_lvs = 1' + aux extend_filter_LVMTEST + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux prepare_pvs 1 + + vgcreate $SHARED $vg1 "$dev1" +@@ -44,4 +43,3 @@ lvchange -an "$vg1/$lv1" + lvremove "$vg1/$lv1" + + vgremove $vg1 +- +diff --git a/test/shell/snapshot-remove-dmsetup.sh b/test/shell/snapshot-remove-dmsetup.sh +index 916aec9..19411ce 100644 +--- a/test/shell/snapshot-remove-dmsetup.sh ++++ b/test/shell/snapshot-remove-dmsetup.sh +@@ -17,8 +17,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + which mkfs.ext2 || skip + + aux prepare_vg 5 +diff --git a/test/shell/snapshot-usage-exa.sh b/test/shell/snapshot-usage-exa.sh +index f537f0d..5d666bf 100644 +--- a/test/shell/snapshot-usage-exa.sh ++++ b/test/shell/snapshot-usage-exa.sh +@@ -18,8 +18,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux can_use_16T || skip + + aux prepare_pvs 1 +diff --git a/test/shell/snapshot-usage.sh b/test/shell/snapshot-usage.sh +index 5cfdae6..bcfa16a 100644 +--- a/test/shell/snapshot-usage.sh ++++ b/test/shell/snapshot-usage.sh +@@ -17,8 +17,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + MKFS=mkfs.ext2 + which $MKFS || skip + +diff --git a/test/shell/vgsplit-stacked.sh b/test/shell/vgsplit-stacked.sh +index 09af3f7..331ee8e 100644 +--- a/test/shell/vgsplit-stacked.sh ++++ b/test/shell/vgsplit-stacked.sh +@@ -15,8 +15,6 @@ SKIP_WITH_LVMPOLLD=1 + + . lib/inittest + +-aux lvmconf 'devices/scan_lvs = 1' +- + aux extend_filter_LVMTEST + aux prepare_pvs 3 + diff --git a/SOURCES/lvm2-2_03_06-udev-do-not-overwrite-ID_MODEL-in-69-dm-lvm-metad.ru.patch b/SOURCES/lvm2-2_03_06-udev-do-not-overwrite-ID_MODEL-in-69-dm-lvm-metad.ru.patch new file mode 100644 index 0000000..3e9cfbf --- /dev/null +++ b/SOURCES/lvm2-2_03_06-udev-do-not-overwrite-ID_MODEL-in-69-dm-lvm-metad.ru.patch @@ -0,0 +1,15 @@ + udev/69-dm-lvm-metad.rules.in | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/udev/69-dm-lvm-metad.rules.in b/udev/69-dm-lvm-metad.rules.in +index 2ff8ddc..d510064 100644 +--- a/udev/69-dm-lvm-metad.rules.in ++++ b/udev/69-dm-lvm-metad.rules.in +@@ -110,7 +110,6 @@ LABEL="systemd_background" + # other | X | X | X | | X + ACTION!="remove", ENV{LVM_PV_GONE}=="1", RUN+="(BINDIR)/systemd-run (LVM_EXEC)/lvm pvscan --cache $major:$minor", GOTO="lvm_end" + ENV{SYSTEMD_ALIAS}="/dev/block/$major:$minor" +-ENV{ID_MODEL}="LVM PV $env{ID_FS_UUID_ENC} on /dev/$name" + ENV{SYSTEMD_WANTS}+="lvm2-pvscan@$major:$minor.service" + GOTO="lvm_end" + diff --git a/SOURCES/lvm2-2_03_06-udev-remove-unsupported-OPTIONS-event_timeout-rule.patch b/SOURCES/lvm2-2_03_06-udev-remove-unsupported-OPTIONS-event_timeout-rule.patch new file mode 100644 index 0000000..dcab367 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-udev-remove-unsupported-OPTIONS-event_timeout-rule.patch @@ -0,0 +1,28 @@ + WHATS_NEW | 1 + + udev/11-dm-lvm.rules.in | 2 -- + 2 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/WHATS_NEW b/WHATS_NEW +index a7ccd39..63c3c27 100644 +--- a/WHATS_NEW ++++ b/WHATS_NEW +@@ -1,5 +1,6 @@ + Version 2.03.06 - + ================================ ++ Remove unsupported OPTIONS+="event_timeout" udev rule from 11-dm-lvm.rules. + Prevent creating VGs with PVs with different logical block sizes. + Fix metadata writes from corrupting with large physical block size. + +diff --git a/udev/11-dm-lvm.rules.in b/udev/11-dm-lvm.rules.in +index 91cb991..7c58994 100644 +--- a/udev/11-dm-lvm.rules.in ++++ b/udev/11-dm-lvm.rules.in +@@ -37,8 +37,6 @@ ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", ENV{DM_NOSCAN}=="1", ENV{DM_UDEV_DISABLE_OTHE + + ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end" + +-OPTIONS+="event_timeout=180" +- + # Do not create symlinks for inappropriate subdevices. + ENV{DM_LV_NAME}=="pvmove?*|?*_vorigin", GOTO="lvm_disable" + ENV{DM_LV_LAYER}=="?*", GOTO="lvm_disable" diff --git a/SOURCES/lvm2-2_03_06-vgchange-don-t-fail-monitor-command-if-vg-is-exporte.patch b/SOURCES/lvm2-2_03_06-vgchange-don-t-fail-monitor-command-if-vg-is-exporte.patch new file mode 100644 index 0000000..f65f0dd --- /dev/null +++ b/SOURCES/lvm2-2_03_06-vgchange-don-t-fail-monitor-command-if-vg-is-exporte.patch @@ -0,0 +1,16 @@ + tools/vgchange.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/vgchange.c b/tools/vgchange.c +index d6d4f91..a17f456 100644 +--- a/tools/vgchange.c ++++ b/tools/vgchange.c +@@ -631,6 +631,8 @@ static int _vgchange_single(struct cmd_context *cmd, const char *vg_name, + }; + + if (vg_is_exported(vg)) { ++ if (cmd->command->command_enum == vgchange_monitor_CMD) ++ return ECMD_PROCESSED; + log_error("Volume group \"%s\" is exported", vg_name); + return ECMD_FAILED; + } diff --git a/SOURCES/lvm2-2_03_06-vgcreate-vgextend-restrict-PVs-with-mixed-block-size.patch b/SOURCES/lvm2-2_03_06-vgcreate-vgextend-restrict-PVs-with-mixed-block-size.patch new file mode 100644 index 0000000..106c2e5 --- /dev/null +++ b/SOURCES/lvm2-2_03_06-vgcreate-vgextend-restrict-PVs-with-mixed-block-size.patch @@ -0,0 +1,208 @@ + lib/commands/toolcontext.h | 1 + + lib/config/config_settings.h | 5 +++++ + lib/metadata/metadata-exported.h | 1 + + lib/metadata/metadata.c | 44 +++++++++++++++++++++++++++++++++++++ + tools/lvmcmdline.c | 2 ++ + tools/toollib.c | 47 ++++++++++++++++++++++++++++++++++++++++ + tools/vgcreate.c | 2 ++ + 7 files changed, 102 insertions(+) + +diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h +index 488752c..655d9f2 100644 +--- a/lib/commands/toolcontext.h ++++ b/lib/commands/toolcontext.h +@@ -153,6 +153,7 @@ struct cmd_context { + unsigned include_shared_vgs:1; /* report/display cmds can reveal lockd VGs */ + unsigned include_active_foreign_vgs:1; /* cmd should process foreign VGs with active LVs */ + unsigned vg_read_print_access_error:1; /* print access errors from vg_read */ ++ unsigned allow_mixed_block_sizes:1; + unsigned force_access_clustered:1; + unsigned lockd_gl_disable:1; + unsigned lockd_vg_disable:1; +diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h +index f14f0b8..25650e3 100644 +--- a/lib/config/config_settings.h ++++ b/lib/config/config_settings.h +@@ -502,6 +502,11 @@ cfg(devices_allow_changes_with_duplicate_pvs_CFG, "allow_changes_with_duplicate_ + "Enabling this setting allows the VG to be used as usual even with\n" + "uncertain devices.\n") + ++cfg(devices_allow_mixed_block_sizes_CFG, "allow_mixed_block_sizes", devices_CFG_SECTION, 0, CFG_TYPE_BOOL, 0, vsn(2, 3, 6), NULL, 0, NULL, ++ "Allow PVs in the same VG with different logical block sizes.\n" ++ "When allowed, the user is responsible to ensure that an LV is\n" ++ "using PVs with matching block sizes when necessary.\n") ++ + cfg_array(allocation_cling_tag_list_CFG, "cling_tag_list", allocation_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(2, 2, 77), NULL, 0, NULL, + "Advise LVM which PVs to use when searching for new space.\n" + "When searching for free space to extend an LV, the 'cling' allocation\n" +diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h +index 77b971b..539845c 100644 +--- a/lib/metadata/metadata-exported.h ++++ b/lib/metadata/metadata-exported.h +@@ -622,6 +622,7 @@ struct pvcreate_params { + unsigned is_remove : 1; /* is removing PVs, not creating */ + unsigned preserve_existing : 1; + unsigned check_failed : 1; ++ unsigned check_consistent_block_size : 1; + }; + + struct lvresize_params { +diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c +index f7eeb52..55ae46d 100644 +--- a/lib/metadata/metadata.c ++++ b/lib/metadata/metadata.c +@@ -751,12 +751,40 @@ int vg_extend_each_pv(struct volume_group *vg, struct pvcreate_params *pp) + { + struct pv_list *pvl; + unsigned int max_phys_block_size = 0; ++ unsigned int physical_block_size, logical_block_size; ++ unsigned int prev_lbs = 0; ++ int inconsistent_existing_lbs = 0; + + log_debug_metadata("Adding PVs to VG %s.", vg->name); + + if (vg_bad_status_bits(vg, RESIZEABLE_VG)) + return_0; + ++ /* ++ * Check if existing PVs have inconsistent block sizes. ++ * If so, do not enforce new devices to be consistent. ++ */ ++ dm_list_iterate_items(pvl, &vg->pvs) { ++ logical_block_size = 0; ++ physical_block_size = 0; ++ ++ if (!dev_get_direct_block_sizes(pvl->pv->dev, &physical_block_size, &logical_block_size)) ++ continue; ++ ++ if (!logical_block_size) ++ continue; ++ ++ if (!prev_lbs) { ++ prev_lbs = logical_block_size; ++ continue; ++ } ++ ++ if (prev_lbs != logical_block_size) { ++ inconsistent_existing_lbs = 1; ++ break; ++ } ++ } ++ + dm_list_iterate_items(pvl, &pp->pvs) { + log_debug_metadata("Adding PV %s to VG %s.", pv_dev_name(pvl->pv), vg->name); + +@@ -767,6 +795,22 @@ int vg_extend_each_pv(struct volume_group *vg, struct pvcreate_params *pp) + return 0; + } + ++ logical_block_size = 0; ++ physical_block_size = 0; ++ ++ if (!dev_get_direct_block_sizes(pvl->pv->dev, &physical_block_size, &logical_block_size)) ++ log_warn("WARNING: PV %s has unknown block size.", pv_dev_name(pvl->pv)); ++ ++ else if (prev_lbs && logical_block_size && (logical_block_size != prev_lbs)) { ++ if (vg->cmd->allow_mixed_block_sizes || inconsistent_existing_lbs) ++ log_debug("Devices have inconsistent block sizes (%u and %u)", prev_lbs, logical_block_size); ++ else { ++ log_error("Devices have inconsistent logical block sizes (%u and %u).", ++ prev_lbs, logical_block_size); ++ return 0; ++ } ++ } ++ + if (!add_pv_to_vg(vg, pv_dev_name(pvl->pv), pvl->pv, 0)) { + log_error("PV %s cannot be added to VG %s.", + pv_dev_name(pvl->pv), vg->name); +diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c +index 30f9d81..7d29b6f 100644 +--- a/tools/lvmcmdline.c ++++ b/tools/lvmcmdline.c +@@ -2319,6 +2319,8 @@ static int _get_current_settings(struct cmd_context *cmd) + + cmd->scan_lvs = find_config_tree_bool(cmd, devices_scan_lvs_CFG, NULL); + ++ cmd->allow_mixed_block_sizes = find_config_tree_bool(cmd, devices_allow_mixed_block_sizes_CFG, NULL); ++ + /* + * enable_hints is set to 1 if any commands are using hints. + * use_hints is set to 1 if this command doesn't use the hints. +diff --git a/tools/toollib.c b/tools/toollib.c +index b2313f8..155528c 100644 +--- a/tools/toollib.c ++++ b/tools/toollib.c +@@ -5355,6 +5355,8 @@ int pvcreate_each_device(struct cmd_context *cmd, + struct pv_list *vgpvl; + struct device_list *devl; + const char *pv_name; ++ unsigned int physical_block_size, logical_block_size; ++ unsigned int prev_pbs = 0, prev_lbs = 0; + int must_use_all = (cmd->cname->flags & MUST_USE_ALL_ARGS); + int found; + unsigned i; +@@ -5395,6 +5397,51 @@ int pvcreate_each_device(struct cmd_context *cmd, + pd->dev = dev_cache_get(cmd, pd->name, cmd->filter); + + /* ++ * Check for consistent block sizes. ++ */ ++ if (pp->check_consistent_block_size) { ++ dm_list_iterate_items(pd, &pp->arg_devices) { ++ if (!pd->dev) ++ continue; ++ ++ logical_block_size = 0; ++ physical_block_size = 0; ++ ++ if (!dev_get_direct_block_sizes(pd->dev, &physical_block_size, &logical_block_size)) { ++ log_warn("WARNING: Unknown block size for device %s.", dev_name(pd->dev)); ++ continue; ++ } ++ ++ if (!logical_block_size) { ++ log_warn("WARNING: Unknown logical_block_size for device %s.", dev_name(pd->dev)); ++ continue; ++ } ++ ++ if (!prev_lbs) { ++ prev_lbs = logical_block_size; ++ prev_pbs = physical_block_size; ++ continue; ++ } ++ ++ if (prev_lbs == logical_block_size) { ++ /* Require lbs to match, just warn about unmatching pbs. */ ++ if (!cmd->allow_mixed_block_sizes && prev_pbs && physical_block_size && ++ (prev_pbs != physical_block_size)) ++ log_warn("WARNING: Devices have inconsistent physical block sizes (%u and %u).", ++ prev_pbs, physical_block_size); ++ continue; ++ } ++ ++ if (!cmd->allow_mixed_block_sizes) { ++ log_error("Devices have inconsistent logical block sizes (%u and %u).", ++ prev_lbs, logical_block_size); ++ log_print("See lvm.conf allow_mixed_block_sizes."); ++ return 0; ++ } ++ } ++ } ++ ++ /* + * Use process_each_pv to search all existing PVs and devices. + * + * This is a slightly different way to use process_each_pv, because the +diff --git a/tools/vgcreate.c b/tools/vgcreate.c +index d594ec1..09b6a6c 100644 +--- a/tools/vgcreate.c ++++ b/tools/vgcreate.c +@@ -47,6 +47,8 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) + /* Don't create a new PV on top of an existing PV like pvcreate does. */ + pp.preserve_existing = 1; + ++ pp.check_consistent_block_size = 1; ++ + if (!vgcreate_params_set_defaults(cmd, &vp_def, NULL)) + return EINVALID_CMD_LINE; + vp_def.vg_name = vg_name; diff --git a/SOURCES/lvm2-build-autoreconf.patch b/SOURCES/lvm2-build-autoreconf.patch deleted file mode 100644 index 1678e9c..0000000 --- a/SOURCES/lvm2-build-autoreconf.patch +++ /dev/null @@ -1,17 +0,0 @@ - include/configure.h.in | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/include/configure.h.in b/include/configure.h.in -index f9f31d3..269b587 100644 ---- a/include/configure.h.in -+++ b/include/configure.h.in -@@ -669,9 +669,6 @@ - /* Define to 1 to include built-in support for vdo. */ - #undef VDO_INTERNAL - --/* Define to 1 to include built-in support for writecache. */ --#undef WRITECACHE_INTERNAL -- - /* Define to get access to GNU/Linux extension */ - #undef _GNU_SOURCE - diff --git a/SOURCES/lvm2-build-make-generate.patch b/SOURCES/lvm2-build-make-generate.patch deleted file mode 100644 index 8ac5ea8..0000000 --- a/SOURCES/lvm2-build-make-generate.patch +++ /dev/null @@ -1,114 +0,0 @@ - conf/example.conf.in | 59 ++++++++++++++++++++++++++++------------------------ - 1 file changed, 32 insertions(+), 27 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index 0c2d378..a54dc62 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -490,10 +490,19 @@ allocation { - # This configuration option has an automatic default value. - # vdo_use_deduplication = 1 - -- # Configuration option allocation/vdo_emulate_512_sectors. -- # Specifies that the VDO volume is to emulate a 512 byte block device. -+ # Configuration option allocation/vdo_use_metadata_hints. -+ # Enables or disables whether VDO volume should tag its latency-critical -+ # writes with the REQ_SYNC flag. Some device mapper targets such as dm-raid5 -+ # process writes with this flag at a higher priority. -+ # Default is enabled. - # This configuration option has an automatic default value. -- # vdo_emulate_512_sectors = 0 -+ # vdo_use_metadata_hints = 1 -+ -+ # Configuration option allocation/vdo_minimum_io_size. -+ # The minimum IO size for VDO volume to accept, in bytes. -+ # Valid values are 512 or 4096. The recommended and default value is 4096. -+ # This configuration option has an automatic default value. -+ # vdo_minimum_io_size = 4096 - - # Configuration option allocation/vdo_block_map_cache_size_mb. - # Specifies the amount of memory in MiB allocated for caching block map -@@ -504,10 +513,10 @@ allocation { - # vdo_block_map_cache_size_mb = 128 - - # Configuration option allocation/vdo_block_map_period. -- # Tunes the quantity of block map updates that can accumulate -- # before cache pages are flushed to disk. The value must be -- # at least 1 and less then 16380. -- # A lower value means shorter recovery time but lower performance. -+ # The speed with which the block map cache writes out modified block map pages. -+ # A smaller era length is likely to reduce the amount time spent rebuilding, -+ # at the cost of increased block map writes during normal operation. -+ # The maximum and recommended value is 16380; the minimum value is 1. - # This configuration option has an automatic default value. - # vdo_block_map_period = 16380 - -@@ -527,22 +536,6 @@ allocation { - # This configuration option has an automatic default value. - # vdo_index_memory_size_mb = 256 - -- # Configuration option allocation/vdo_use_read_cache. -- # Enables or disables the read cache within the VDO volume. -- # The cache should be enabled if write workloads are expected -- # to have high levels of deduplication, or for read intensive -- # workloads of highly compressible data. -- # This configuration option has an automatic default value. -- # vdo_use_read_cache = 0 -- -- # Configuration option allocation/vdo_read_cache_size_mb. -- # Specifies the extra VDO volume read cache size in MiB. -- # This space is in addition to a system-defined minimum. -- # The value must be less then 16TiB and 1.12 MiB of memory -- # will be used per MiB of read cache specified, per bio thread. -- # This configuration option has an automatic default value. -- # vdo_read_cache_size_mb = 0 -- - # Configuration option allocation/vdo_slab_size_mb. - # Specifies the size in MiB of the increment by which a VDO is grown. - # Using a smaller size constrains the total maximum physical size -@@ -551,7 +544,7 @@ allocation { - # vdo_slab_size_mb = 2048 - - # Configuration option allocation/vdo_ack_threads. -- # Specifies the number of threads to use for acknowledging -+ # Specifies the number of threads to use for acknowledging - # completion of requested VDO I/O operations. - # The value must be at in range [0..100]. - # This configuration option has an automatic default value. -@@ -618,6 +611,18 @@ allocation { - # Data which has not been flushed is not guaranteed to persist in this mode. - # This configuration option has an automatic default value. - # vdo_write_policy = "auto" -+ -+ # Configuration option allocation/vdo_max_discard. -+ # Specified te maximum size of discard bio accepted, in 4096 byte blocks. -+ # I/O requests to a VDO volume are normally split into 4096-byte blocks, -+ # and processed up to 2048 at a time. However, discard requests to a VDO volume -+ # can be automatically split to a larger size, up to 4096-byte blocks -+ # in a single bio, and are limited to 1500 at a time. -+ # Increasing this value may provide better overall performance, at the cost of -+ # increased latency for the individual discard requests. -+ # 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 section log. -@@ -898,14 +903,14 @@ global { - mirror_segtype_default = "@DEFAULT_MIRROR_SEGTYPE@" - - # Configuration option global/support_mirrored_mirror_log. -+ # Configuration option global/support_mirrored_mirror_log. - # Enable mirrored 'mirror' log type for testing. -- # -+ # - # This type is deprecated to create or convert to but can - # be enabled to test that activation of existing mirrored - # logs and conversion to disk/core works. -- # -+ # - # Not supported for regular operation! -- # - support_mirrored_mirror_log = 0 - - # Configuration option global/raid10_segtype_default. diff --git a/SOURCES/lvm2-rhel8.patch b/SOURCES/lvm2-rhel8.patch index d864528..0c12ddd 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 6e070dc..5a32e49 100644 +index ab284be..4661287 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ --2.03.02(2) (2018-12-18) -+2.03.02(2)-RHEL8 (2019-01-04) +-2.03.05(2) (2019-06-15) ++2.03.05(2)-RHEL8 (2019-06-15) diff --git a/VERSION_DM b/VERSION_DM -index 9561012..aef7512 100644 +index bd19b7d..32999a6 100644 --- a/VERSION_DM +++ b/VERSION_DM @@ -1 +1 @@ --1.02.155 (2018-12-18) -+1.02.155-RHEL8 (2019-01-04) +-1.02.163 (2019-06-15) ++1.02.163-RHEL8 (2019-06-15) diff --git a/SOURCES/lvm2-set-default-preferred_names.patch b/SOURCES/lvm2-set-default-preferred_names.patch index 6059133..7e18e8f 100644 --- a/SOURCES/lvm2-set-default-preferred_names.patch +++ b/SOURCES/lvm2-set-default-preferred_names.patch @@ -1,30 +1,31 @@ - conf/example.conf.in | 2 +- + conf/example.conf.in | 3 ++- lib/config/config_settings.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/example.conf.in b/conf/example.conf.in -index 6b8e0d4..7e29aaa 100644 +index 154f621..b9cdf0c 100644 --- a/conf/example.conf.in +++ b/conf/example.conf.in -@@ -106,7 +106,7 @@ devices { +@@ -122,7 +122,8 @@ devices { # Example # preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] # - # This configuration option does not have a default value defined. -+ preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] ++ # This configuration option has an automatic default value. ++ # preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] # Configuration option devices/filter. # Limit the block devices that are used by LVM commands. diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index 69eb9ea..689a9e4 100644 +index e718dec..3113fe1 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h -@@ -255,7 +255,7 @@ cfg(devices_external_device_info_source_CFG, "external_device_info_source", devi - " compiled with udev support.\n" +@@ -269,7 +269,7 @@ cfg(devices_hints_CFG, "hints", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_ + " Use no hints.\n" "#\n") -cfg_array(devices_preferred_names_CFG, "preferred_names", devices_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_UNDEFINED , CFG_TYPE_STRING, NULL, vsn(1, 2, 19), NULL, 0, NULL, -+cfg_array(devices_preferred_names_CFG, "preferred_names", devices_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, "#S^/dev/mpath/#S^/dev/mapper/mpath#S^/dev/[hs]d", vsn(1, 2, 19), NULL, 0, NULL, ++cfg_array(devices_preferred_names_CFG, "preferred_names", devices_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#S^/dev/mpath/#S^/dev/mapper/mpath#S^/dev/[hs]d", vsn(1, 2, 19), NULL, 0, NULL, "Select which path name to display for a block device.\n" "If multiple path names exist for a block device, and LVM needs to\n" "display a name for the device, the path names are matched against\n" diff --git a/SOURCES/lvm2-test-skip-problematic-tests.patch b/SOURCES/lvm2-test-skip-problematic-tests.patch new file mode 100644 index 0000000..29dde62 --- /dev/null +++ b/SOURCES/lvm2-test-skip-problematic-tests.patch @@ -0,0 +1,38 @@ + test/dbus/lvmdbustest.py | 1 + + test/shell/lvcreate-usage.sh | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/test/dbus/lvmdbustest.py b/test/dbus/lvmdbustest.py +index 9bc1683..1b5608c 100755 +--- a/test/dbus/lvmdbustest.py ++++ b/test/dbus/lvmdbustest.py +@@ -1885,6 +1885,7 @@ class TestDbusService(unittest.TestCase): + # path to it. Additionally, we will take the symlink and do a lookup + # (Manager.LookUpByLvmId) using it and the original device path to + # ensure that we can find the PV. ++ raise unittest.SkipTest('Test need fixing') + symlink = None + + pv = self.objs[PV_INT][0] +diff --git a/test/shell/lvcreate-usage.sh b/test/shell/lvcreate-usage.sh +index ca8694e..90ca600 100644 +--- a/test/shell/lvcreate-usage.sh ++++ b/test/shell/lvcreate-usage.sh +@@ -182,14 +182,14 @@ DEVICE=$(dmsetup deps -o blkdevname "$dev1" | sed -e "s,.*:\ (\(.*\)),/dev/\1,") + RASZ=$(( $(blockdev --getra "$DEVICE" ) / 2 )) + SZ="$RASZ.00k" + test "$RASZ" -ge 128 || SZ="128.00k" +-check lv_field $vg/$lv4 lv_kernel_read_ahead "$SZ" --units k ++should check lv_field $vg/$lv4 lv_kernel_read_ahead "$SZ" --units k + lvcreate -L 8 -n $lv5 -i2 --stripesize 16k --readahead auto $vg + check lv_field $vg/$lv5 lv_read_ahead "auto" +-check lv_field $vg/$lv5 lv_kernel_read_ahead "$SZ" --units k ++should check lv_field $vg/$lv5 lv_kernel_read_ahead "$SZ" --units k + lvcreate -L 8 -n $lv6 -i2 --stripesize 128k --readahead auto $vg + check lv_field $vg/$lv6 lv_read_ahead "auto" + test "$RASZ" -ge 512 || SZ="512.00k" +-check lv_field $vg/$lv6 lv_kernel_read_ahead "$SZ" --units k ++should check lv_field $vg/$lv6 lv_kernel_read_ahead "$SZ" --units k + lvremove -ff $vg + + # diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec index 43498f5..42f2f4a 100644 --- a/SPECS/lvm2.spec +++ b/SPECS/lvm2.spec @@ -1,4 +1,4 @@ -%global device_mapper_version 1.02.155 +%global device_mapper_version 1.02.163 %global enable_cache 1 %global enable_cluster 1 @@ -18,7 +18,7 @@ %global bash_version 4.0 %global corosync_version 1.99.9-1 %global resource_agents_version 3.9.5-12 -%global dlm_version 4.0.6-2 +%global dlm_version 4.0.9-1 %global libselinux_version 1.30.19-4 %global persistent_data_version 0.7.0-0.1.rc6 %global sanlock_version 3.3.0-2 @@ -27,13 +27,13 @@ %global enable_lockd_dlm %{enable_lvmlockd} %if 0%{?rhel} && 0%{?rhel} <= 8 - %ifnarch i686 x86_64 ppc64le s390x %{arm} + %ifnarch i686 x86_64 ppc64le s390x %global enable_cluster 0 %global enable_cmirror 0 %global enable_lockd_dlm 0 %endif - %ifnarch x86_64 ppc64 aarch64 %{arm} + %ifnarch x86_64 ppc64 aarch64 %global enable_lockd_sanlock 0 %endif %endif @@ -55,39 +55,63 @@ Name: lvm2 %if 0%{?rhel} Epoch: %{rhel} %endif -Version: 2.03.02 -Release: 6%{?dist} +Version: 2.03.05 +Release: 5%{?dist} License: GPLv2 -Group: System Environment/Base URL: http://sourceware.org/lvm2 Source0: ftp://sourceware.org/pub/lvm2/releases/LVM2.%{version}.tgz Patch0: lvm2-rhel8.patch Patch1: lvm2-set-default-preferred_names.patch -Patch2: lvm2-2_03_03-lvmlockd-Fix-arguments-when-built-without-sanlock.patch -Patch3: lvm2-2_03_03-dmeventd-resolve-compilation-of-vdo-status-parsing.patch -Patch4: lvm2-2_03_03-lib-move-towards-v2-version-of-VDO-format.patch -Patch5: lvm2-2_03_03-lvcreate-lvconvert-optionally-reenable-mirrored-mirr.patch -Patch6: lvm2-2_03_03-dm-ensure-migration_threshold-is-big-enough.patch -Patch7: lvm2-2_03_03-dm-migration_threshold-for-old-linked-tools.patch -Patch8: lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier.patch -Patch9: lvm2-2_03_03-lv_manip-better-work-with-PERCENT_VG-modifier-with-l.patch -Patch10: lvm2-2_03_03-vdo-fix-archived-metadata-comment.patch -Patch11: lvm2-2_03_03-vdo-update-vdo-profile.patch -Patch12: lvm2-2_03_03-man-missed-zero-option-for-thin-pool-creation.patch -Patch13: lvm2-2_03_03-man-initial-man-page-for-VDO-support.patch -Patch14: lvm2-2_03_03-man-document-dD-attrs-for-VDO-lvs.patch -Patch15: lvm2-2_03_03-vdo-some-formating-updates.patch -Patch16: lvm2-2_03_03-lvmdbusd-Exit-daemon-when-unable-to-retrieve-state.patch -Patch17: lvm2-2_03_03-lvmdbusd-Handle-exported-VG-s.patch -Patch18: lvm2-build-autoreconf.patch -Patch19: lvm2-build-make-generate.patch -Patch20: lvm2-2_03_03-scripts-lvm2-activation-generator-fix-lvmconfig-call.patch -Patch21: lvm2-2_03_03-generators-avoid-contacting-syslog-with-generators.patch -Patch22: lvm2-2_03_03-config-change-scan_lvs-default-to-0.patch -Patch23: lvm2-2_03_03-pvscan-fix-autoactivation-from-concurrent-pvscans.patch -Patch24: lvm2-2_03_03-pvscan-autoactivate-a-VG-once.patch -Patch25: lvm2-2_03_03-lvmlockd-make-lockstart-wait-for-existing-start.patch -Patch26: lvm2-2_03_03-lvmlockd-fix-make-lockstart-wait.patch +Patch2: lvm2-2_03_06-config-remove-filter-typo.patch +Patch3: lvm2-2_03_06-config-Fix-default-option-which-makes-no-sense.patch +# RHEL7 BZ 1569431 +Patch4: lvm2-2_03_06-vgchange-don-t-fail-monitor-command-if-vg-is-exporte.patch +Patch5: lvm2-2_03_06-metadata-include-description-with-command-in-metadat.patch +Patch6: lvm2-2_03_06-exported-vg-handling.patch +Patch7: lvm2-2_03_06-tests-add-exported.sh.patch +Patch8: lvm2-2_03_06-test-Fix-unbound-variable.patch +Patch9: lvm2-2_03_06-test-Remove-now-useless-clvmd-test.patch +Patch10: lvm2-2_03_06-cache-warn-and-prompt-for-writeback-with-cachevol.patch +Patch11: lvm2-2_03_06-udev-do-not-overwrite-ID_MODEL-in-69-dm-lvm-metad.ru.patch +# BZ 1720705 +Patch12: lvm2-2_03_06-lvconvert-allow-stripes-stripesize-in-mirror-convers.patch +# BZ 1727270 +Patch13: lvm2-2_03_06-md-component-detection-for-differing-PV-and-device-s.patch +Patch14: lvm2-2_03_06-pvscan-fix-PV-online-when-device-has-a-different-siz.patch +Patch15: lvm2-2_03_06-enable-full-md-component-detection-at-the-right-time.patch +Patch16: lvm2-2_03_06-tests-extend-lvm-on-md.patch +Patch17: lvm2-2_03_06-tests-pvscan-autoactivate-test-unmatching-dev-and-PV.patch +Patch18: lvm2-2_03_06-pvck-fix-looping-dump-metadata_all.patch +Patch19: lvm2-2_03_06-tests-lvm-on-md-use-variable-run-dir.patch +Patch20: lvm2-2_03_06-tests-Fix-unbound-variable.patch +# BZ 1732994 +Patch21: lvm2-2_03_06-Fix-rounding-writes-up-to-sector-size.patch +Patch22: lvm2-2_03_06-tests-large-physical-sector-size.patch +Patch23: lvm2-2_03_06-WHATS_NEW-fix-large-physical-block-size.patch +# RHEL7 BZ 1669751 +Patch24: lvm2-2_03_06-vgcreate-vgextend-restrict-PVs-with-mixed-block-size.patch +Patch25: lvm2-2_03_06-tests-allow-mixed-block-sizes.patch +Patch26: lvm2-2_03_06-WHATS_NEW-vgcreate-vgextend-logical-block-size.patch +Patch27: lvm2-2_03_06-increase-soft-open-file-limit.patch +# Coverity and test updates: +Patch28: lvm2-2_03_06-tests-open-file-limit.patch +Patch29: lvm2-2_03_06-cov-ensure-cname-exists-before-derefering-it.patch +Patch30: lvm2-2_03_06-cov-check-for-socket_path-being-set.patch +Patch31: lvm2-2_03_06-tests-replaces-grep-q-usage.patch +Patch32: lvm2-2_03_06-tests-fix-ra-checking.patch +Patch33: lvm2-2_03_06-tests-add-settle-wait-before-issue-remove.patch +Patch34: lvm2-2_03_06-tests-accept-also-value-512.patch +Patch35: lvm2-2_03_06-tests-for-cluster-testing-we-always-need-exclusive-m.patch +Patch36: lvm2-2_03_06-tests-simplify-some-var-settings.patch +# Upstream BZ 1740666 +Patch37: lvm2-2_03_06-udev-remove-unsupported-OPTIONS-event_timeout-rule.patch +# RHEL7 BZ 1560739 and related BZs +Patch38: lvm2-2_03_06-dmeventd-avoid-bail-out-preventing-repair-in-raid-pl.patch +Patch39: lvm2-2_03_06-build-make-generate.patch +Patch40: lvm2-test-skip-problematic-tests.patch +Patch41: lvm2-2_03_06-configure-Fix-setting-of-CLDFLAGS-default.patch +# BZ 1752635 +Patch42: lvm2-2_03_06-Revert-lvmlockd-use-commonly-used-define-NOTIFYDBUS_.patch BuildRequires: gcc %if %{enable_testsuite} @@ -143,33 +167,49 @@ or more physical volumes and creating one or more logical volumes %prep %setup -q -n LVM2.%{version} -%patch0 -p1 -b .rhel8 -%patch1 -p1 -b .preferred_names -%patch2 -p1 -b .lvmlockd_fix_arguments -%patch3 -p1 -b .dmeventd_fix_vdo_status_parsing -%patch4 -p1 -b .vdo_v2 -%patch5 -p1 -b .optionally_reenable_mirrored_mirrorlog -%patch6 -p1 -b .dm_ensure_migration_threshold_is_big_enough -%patch7 -p1 -b .dm_migration_threshold_for_old_linked_tools -%patch8 -p1 -b .lv_manip_better_work_with_PERCENT_VG_modifier -%patch9 -p1 -b .lv_manip_better_work_with_PERCENT_VG_modifier_with_l -%patch10 -p1 -b .vdo_fix_archived_metadata_comment -%patch11 -p1 -b .vdo_update_vdo_profile -%patch12 -p1 -b .man_missed_zero_option_for_thin_pool_creation -%patch13 -p1 -b .man_initial_man_page_for_VDO_support -%patch14 -p1 -b .man_document_dD_attrs_for_VDO_lvs -%patch15 -p1 -b .vdo_some_formating_updates -%patch16 -p1 -b .lvmdbusd_Exit_daemon_when_unable_to_retrieve_state -%patch17 -p1 -b .lvmdbusd_Handle_exported_VG_s -%patch18 -p1 -b .build_autoreconf -%patch19 -p1 -b .build_make_generate -%patch20 -p1 -b .fix_activation_generator_lvmconfig_call -%patch21 -p1 -b .generators_avoid_contacting_syslog -%patch22 -p1 -b .config_change_scan_lvs_default_to_0 -%patch23 -p1 -b .pvscan_fix_autoactivation_from_concurrent_pvscans -%patch24 -p1 -b .pvscan_autoactivate_a_VG_once -%patch25 -p1 -b .lvmlockd_make_lockstart_wait_for_existing_start -%patch26 -p1 -b .lvmlockd_fix_make_lockstart_wait +%patch0 -p1 -b .backup0 +%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 +%patch36 -p1 -b .backup36 +%patch37 -p1 -b .backup37 +%patch38 -p1 -b .backup38 +%patch39 -p1 -b .backup39 +%patch40 -p1 -b .backup40 +%patch41 -p1 -b .backup41 +%patch42 -p1 -b .backup42 %build %global _default_pid_dir /run @@ -190,9 +230,8 @@ or more physical volumes and creating one or more logical volumes %endif %if %{enable_lockd_dlm} -%global configure_lockd_dlm --enable-lvmlockd-dlm +%global configure_lockd_dlm --enable-lvmlockd-dlm --enable-lvmlockd-dlmcontrol %endif - %if %{enable_lockd_sanlock} %global configure_lockd_sanlock --enable-lvmlockd-sanlock %endif @@ -424,7 +463,6 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : ############################################################################## %package devel Summary: Development libraries and headers -Group: Development/Libraries License: LGPLv2 Requires: %{name} = %{?epoch}:%{version}-%{release} Requires: device-mapper-devel = %{?epoch}:%{device_mapper_version}-%{release} @@ -444,15 +482,12 @@ the lvm2 libraries. %package libs Summary: Shared libraries for lvm2 License: LGPLv2 -Group: System Environment/Libraries Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release} %description libs This package contains shared lvm2 libraries for applications. -%post libs -p /sbin/ldconfig - -%postun libs -p /sbin/ldconfig +%ldconfig_scriptlets libs %files libs %{!?_licensedir:%global license %%doc} @@ -482,7 +517,6 @@ This package contains shared lvm2 libraries for applications. %if %{enable_lockd_dlm} || %{enable_lockd_sanlock} %package lockd Summary: LVM locking daemon -Group: System Environment/Base Requires: lvm2 = %{?epoch}:%{version}-%{release} %if %{enable_lockd_sanlock} Requires: sanlock-lib >= %{sanlock_version} @@ -499,13 +533,13 @@ Requires(postun): systemd-units >= %{systemd_version} LVM commands use lvmlockd to coordinate access to shared storage. %post lockd -%systemd_post lvm2-lvmlockd.service +%systemd_post lvmlockd.service %preun lockd -%systemd_preun lvm2-lvmlockd.service +%systemd_preun lvmlockd.service %postun lockd -%systemd_postun lvm2-lvmlockd.service +%systemd_postun lvmlockd.service %files lockd %defattr(444,root,root,-) @@ -527,7 +561,6 @@ LVM commands use lvmlockd to coordinate access to shared storage. %package -n cmirror Summary: Daemon for device-mapper-based clustered mirrors -Group: System Environment/Base Requires: corosync >= %{corosync_version} Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} Requires: resource-agents >= %{resource_agents_version} @@ -546,7 +579,6 @@ Daemon providing device-mapper-based mirrors in a shared-storage cluster. %package -n cmirror-standalone Summary: Additional files to support device-mapper-based clustered mirrors in standalone mode License: GPLv2 -Group: System Environment/Base Requires: cmirror >= %{?epoch}:%{version}-%{release} %description -n cmirror-standalone @@ -579,7 +611,6 @@ involvement (e.g. pacemaker). %package dbusd Summary: LVM2 D-Bus daemon License: GPLv2 -Group: System Environment/Base BuildArch: noarch Requires: lvm2 >= %{?epoch}:%{version}-%{release} Requires: dbus @@ -622,7 +653,6 @@ Daemon for access to LVM2 functionality through a D-Bus interface. Summary: Device mapper utility Version: %{device_mapper_version} License: GPLv2 -Group: System Environment/Base URL: http://sources.redhat.com/dm Requires: device-mapper-libs = %{?epoch}:%{device_mapper_version}-%{release} Requires: util-linux >= %{util_linux_version} @@ -659,7 +689,6 @@ for the kernel device-mapper. Summary: Development libraries and headers for device-mapper Version: %{device_mapper_version} License: LGPLv2 -Group: Development/Libraries Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} Requires: pkgconfig @@ -677,15 +706,12 @@ the device-mapper libraries. Summary: Device-mapper shared library Version: %{device_mapper_version} License: LGPLv2 -Group: System Environment/Libraries Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} %description -n device-mapper-libs This package contains the device-mapper shared library, libdevmapper. -%post -n device-mapper-libs -p /sbin/ldconfig - -%postun -n device-mapper-libs -p /sbin/ldconfig +%ldconfig_scriptlets -n device-mapper-libs %files -n device-mapper-libs %{!?_licensedir:%global license %%doc} @@ -695,7 +721,6 @@ This package contains the device-mapper shared library, libdevmapper. %package -n device-mapper-event Summary: Device-mapper event daemon -Group: System Environment/Base Version: %{device_mapper_version} Requires: device-mapper = %{?epoch}:%{device_mapper_version}-%{release} Requires: device-mapper-event-libs = %{?epoch}:%{device_mapper_version}-%{release} @@ -732,15 +757,12 @@ fi Summary: Device-mapper event daemon shared library Version: %{device_mapper_version} License: LGPLv2 -Group: System Environment/Libraries %description -n device-mapper-event-libs This package contains the device-mapper event daemon shared library, libdevmapper-event. -%post -n device-mapper-event-libs -p /sbin/ldconfig - -%postun -n device-mapper-event-libs -p /sbin/ldconfig +%ldconfig_scriptlets -n device-mapper-event-libs %files -n device-mapper-event-libs %{!?_licensedir:%global license %%doc} @@ -752,7 +774,6 @@ libdevmapper-event. Summary: Development libraries and headers for the device-mapper event daemon Version: %{device_mapper_version} License: LGPLv2 -Group: Development/Libraries Requires: device-mapper-event = %{?epoch}:%{device_mapper_version}-%{release} Requires: pkgconfig @@ -786,6 +807,27 @@ An extensive functional testsuite for LVM2. %endif %changelog +* Wed Sep 25 2019 Marian Csontos - 2.03.05-5 +- Fix lvmlockd is not started with sanlock running. + +* Sun Aug 18 2019 Marian Csontos - 2.03.05-4 +- Update tests. + +* Sun Aug 18 2019 Marian Csontos - 2.03.05-3 +- Remove unsupported OPTIONS+="event_timeout" udev rule from 11-dm-lvm.rules. +- Prevent creating VGs with PVs with different logical block sizes. +- Fix metadata writes from corrupting with large physical block size. + +* Wed Jul 24 2019 Marian Csontos - 2.03.05-2 +- Fix scanning of PVs with size not matching device. +- Allow --stripe/--stripesize in mirror conversions. + +* Sat Jun 15 2019 Marian Csontos - 2.03.05-1 +- Update to upstream release 2.03.05. + +* Mon Jun 10 2019 Marian Csontos - 2.03.04-1 +- Update to upstream release 2.03.04. + * Fri Feb 22 2019 Marian Csontos - 2.03.02-6 * Thu Feb 07 2019 Marian Csontos - 2.03.02-5