diff --git a/0001-config-comment-all-default-settings.patch b/0001-config-comment-all-default-settings.patch index 767e639..9c597c6 100644 --- a/0001-config-comment-all-default-settings.patch +++ b/0001-config-comment-all-default-settings.patch @@ -1,14 +1,14 @@ -From 195b8e7a7d4ecde77788c581ff4b3470fad00aad Mon Sep 17 00:00:00 2001 +From 2159c817d3c659086842d286dd70342223555384 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Tue, 16 Mar 2021 09:51:41 -0500 -Subject: [PATCH 01/10] config: comment all default settings +Subject: [PATCH 01/11] config: comment all default settings --- lib/config/config_settings.h | 174 +++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index d3a42a1..6c6a28b 100644 +index fa87bea..9cf73ce 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h @@ -205,7 +205,7 @@ cfg_section(local_CFG_SECTION, "local", root_CFG_SECTION, 0, vsn(2, 2, 117), 0, @@ -54,10 +54,10 @@ index d3a42a1..6c6a28b 100644 -cfg(devices_external_device_info_source_CFG, "external_device_info_source", devices_CFG_SECTION, 0, CFG_TYPE_STRING, DEFAULT_EXTERNAL_DEVICE_INFO_SOURCE, vsn(2, 2, 116), NULL, 0, NULL, +cfg(devices_external_device_info_source_CFG, "external_device_info_source", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_EXTERNAL_DEVICE_INFO_SOURCE, vsn(2, 2, 116), NULL, 0, NULL, - "Select an external device information source.\n" - "Some information may already be available in the system and LVM can\n" - "use this information to determine the exact type or use of devices it\n" -@@ -372,12 +372,12 @@ cfg_array(devices_types_CFG, "types", devices_CFG_SECTION, CFG_DEFAULT_UNDEFINED + "Enable device information from udev.\n" + "If set to \"udev\", lvm will supplement its own native device information\n" + "with information from libudev. This can potentially improve the detection\n" +@@ -360,12 +360,12 @@ cfg_array(devices_types_CFG, "types", devices_CFG_SECTION, CFG_DEFAULT_UNDEFINED "types = [ \"fd\", 16 ]\n" "#\n") @@ -72,7 +72,7 @@ index d3a42a1..6c6a28b 100644 "Scan LVM LVs for layered PVs, allowing LVs to be used as PVs.\n" "When 1, LVM will detect PVs layered on LVs, and caution must be\n" "taken to avoid a host accessing a layered VG that may not belong\n" -@@ -390,10 +390,10 @@ cfg(devices_scan_lvs_CFG, "scan_lvs", devices_CFG_SECTION, 0, CFG_TYPE_BOOL, DEF +@@ -378,14 +378,14 @@ cfg(devices_scan_lvs_CFG, "scan_lvs", devices_CFG_SECTION, 0, CFG_TYPE_BOOL, DEF "an LV. The LVs are ignored using a built in device filter that\n" "identifies and excludes LVs.\n") @@ -80,12 +80,16 @@ index d3a42a1..6c6a28b 100644 +cfg(devices_multipath_component_detection_CFG, "multipath_component_detection", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_MULTIPATH_COMPONENT_DETECTION, vsn(2, 2, 89), NULL, 0, NULL, "Ignore devices that are components of DM multipath devices.\n") + cfg(devices_multipath_wwids_file_CFG, "multipath_wwids_file", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED | CFG_ALLOW_EMPTY, CFG_TYPE_STRING, DEFAULT_WWIDS_FILE, vsn(2, 3, 13), NULL, 0, NULL, + "The path to the multipath wwids file used for multipath component detection.\n" + "Set this to an empty string to disable the use of the multipath wwids file.\n") + -cfg(devices_md_component_detection_CFG, "md_component_detection", devices_CFG_SECTION, 0, CFG_TYPE_BOOL, DEFAULT_MD_COMPONENT_DETECTION, vsn(1, 0, 18), NULL, 0, NULL, +cfg(devices_md_component_detection_CFG, "md_component_detection", devices_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_MD_COMPONENT_DETECTION, vsn(1, 0, 18), NULL, 0, NULL, "Enable detection and exclusion of MD component devices.\n" "An MD component device is a block device that MD uses as part\n" "of a software RAID virtual device. When an LVM PV is created\n" -@@ -419,12 +419,12 @@ cfg(devices_md_component_checks_CFG, "md_component_checks", devices_CFG_SECTION, +@@ -411,12 +411,12 @@ cfg(devices_md_component_checks_CFG, "md_component_checks", devices_CFG_SECTION, " This requires an extra read at the end of devices.\n" "#\n") @@ -100,7 +104,7 @@ index d3a42a1..6c6a28b 100644 "Align the start of a PV data area with md device's stripe-width.\n" "This applies if a PV is placed directly on an md device.\n" "default_data_alignment will be overridden if it is not aligned\n" -@@ -438,7 +438,7 @@ cfg(devices_default_data_alignment_CFG, "default_data_alignment", devices_CFG_SE +@@ -430,7 +430,7 @@ cfg(devices_default_data_alignment_CFG, "default_data_alignment", devices_CFG_SE "This setting is overridden by data_alignment and the --dataalignment\n" "option.\n") @@ -109,7 +113,7 @@ index d3a42a1..6c6a28b 100644 "Align the start of a PV data area with sysfs io properties.\n" "The start of a PV data area will be a multiple of minimum_io_size or\n" "optimal_io_size exposed in sysfs. minimum_io_size is the smallest\n" -@@ -452,14 +452,14 @@ cfg(devices_data_alignment_detection_CFG, "data_alignment_detection", devices_CF +@@ -444,14 +444,14 @@ cfg(devices_data_alignment_detection_CFG, "data_alignment_detection", devices_CF "This setting is overridden by data_alignment and the --dataalignment\n" "option.\n") @@ -126,7 +130,7 @@ index d3a42a1..6c6a28b 100644 "Shift the start of an aligned PV data area based on sysfs information.\n" "After a PV data area is aligned, it will be shifted by the\n" "alignment_offset exposed in sysfs. This offset is often 0, but may\n" -@@ -469,12 +469,12 @@ cfg(devices_data_alignment_offset_detection_CFG, "data_alignment_offset_detectio +@@ -461,12 +461,12 @@ cfg(devices_data_alignment_offset_detection_CFG, "data_alignment_offset_detectio "LBA -1, and consequently sector 63 is aligned on a 4KiB boundary).\n" "This setting is overridden by the --dataalignmentoffset option.\n") @@ -141,7 +145,7 @@ index d3a42a1..6c6a28b 100644 "Do not scan 'mirror' LVs to avoid possible deadlocks.\n" "This avoids possible deadlocks when using the 'mirror' segment type.\n" "This setting determines whether LVs using the 'mirror' segment type\n" -@@ -492,19 +492,19 @@ cfg(devices_ignore_lvm_mirrors_CFG, "ignore_lvm_mirrors", devices_CFG_SECTION, 0 +@@ -484,19 +484,19 @@ cfg(devices_ignore_lvm_mirrors_CFG, "ignore_lvm_mirrors", devices_CFG_SECTION, 0 "apply to LVM RAID types like 'raid1' which handle failures in a\n" "different way, making them a better choice for VG stacking.\n") @@ -165,7 +169,7 @@ index d3a42a1..6c6a28b 100644 "Issue discards to PVs that are no longer used by an LV.\n" "Discards are sent to an LV's underlying physical volumes when the LV\n" "is no longer using the physical volumes' space, e.g. lvremove,\n" -@@ -516,7 +516,7 @@ cfg(devices_issue_discards_CFG, "issue_discards", devices_CFG_SECTION, 0, CFG_TY +@@ -508,7 +508,7 @@ cfg(devices_issue_discards_CFG, "issue_discards", devices_CFG_SECTION, 0, CFG_TY "generally do. If enabled, discards will only be issued if both the\n" "storage and kernel provide support.\n") @@ -174,7 +178,7 @@ index d3a42a1..6c6a28b 100644 "Allow VG modification while a PV appears on multiple devices.\n" "When a PV appears on multiple devices, LVM attempts to choose the\n" "best device to use for the PV. If the devices represent the same\n" -@@ -528,7 +528,7 @@ cfg(devices_allow_changes_with_duplicate_pvs_CFG, "allow_changes_with_duplicate_ +@@ -520,7 +520,7 @@ 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") @@ -183,7 +187,7 @@ index d3a42a1..6c6a28b 100644 "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") -@@ -551,14 +551,14 @@ cfg_array(allocation_cling_tag_list_CFG, "cling_tag_list", allocation_CFG_SECTIO +@@ -543,14 +543,14 @@ cfg_array(allocation_cling_tag_list_CFG, "cling_tag_list", allocation_CFG_SECTIO "cling_tag_list = [ \"@site1\", \"@site2\" ]\n" "#\n") @@ -200,7 +204,7 @@ index d3a42a1..6c6a28b 100644 "Use blkid to detect and erase existing signatures on new PVs and LVs.\n" "The blkid library can detect more signatures than the native LVM\n" "detection code, but may take longer. LVM needs to be compiled with\n" -@@ -567,7 +567,7 @@ cfg(allocation_use_blkid_wiping_CFG, "use_blkid_wiping", allocation_CFG_SECTION, +@@ -559,7 +559,7 @@ cfg(allocation_use_blkid_wiping_CFG, "use_blkid_wiping", allocation_CFG_SECTION, "swap signature, and LUKS signatures. To see the list of signatures\n" "recognized by blkid, check the output of the 'blkid -k' command.\n") @@ -209,7 +213,7 @@ index d3a42a1..6c6a28b 100644 "Look for and erase any signatures while zeroing a new LV.\n" "The --wipesignatures option overrides this setting.\n" "Zeroing is controlled by the -Z/--zero option, and if not specified,\n" -@@ -583,7 +583,7 @@ cfg(allocation_wipe_signatures_when_zeroing_new_lvs_CFG, "wipe_signatures_when_z +@@ -575,7 +575,7 @@ cfg(allocation_wipe_signatures_when_zeroing_new_lvs_CFG, "wipe_signatures_when_z "When this setting is disabled, signatures on new LVs are not detected\n" "or erased unless the --wipesignatures option is used directly.\n") @@ -218,7 +222,7 @@ index d3a42a1..6c6a28b 100644 "Mirror logs and images will always use different PVs.\n" "The default setting changed in version 2.02.85.\n") -@@ -857,10 +857,10 @@ cfg(log_command_log_selection_CFG, "command_log_selection", log_CFG_SECTION, CFG +@@ -852,10 +852,10 @@ cfg(log_command_log_selection_CFG, "command_log_selection", log_CFG_SECTION, CFG "For more information about selection criteria in general, see\n" "lvm(8) man page.\n") @@ -231,7 +235,7 @@ index d3a42a1..6c6a28b 100644 "Suppress all non-essential messages from stdout.\n" "This has the same effect as -qq. When enabled, the following commands\n" "still produce output: dumpconfig, lvdisplay, lvmdiskscan, lvs, pvck,\n" -@@ -870,16 +870,16 @@ cfg(log_silent_CFG, "silent", log_CFG_SECTION, 0, CFG_TYPE_BOOL, DEFAULT_SILENT, +@@ -865,16 +865,16 @@ cfg(log_silent_CFG, "silent", log_CFG_SECTION, 0, CFG_TYPE_BOOL, DEFAULT_SILENT, "Any 'yes' or 'no' questions not overridden by other arguments are\n" "suppressed and default to 'no'.\n") @@ -251,7 +255,7 @@ index d3a42a1..6c6a28b 100644 "The level of log messages that are sent to the log file or syslog.\n" "There are 6 syslog-like log levels currently in use: 2 to 7 inclusive.\n" "7 is the most verbose (LOG_DEBUG).\n") -@@ -887,23 +887,23 @@ cfg(log_level_CFG, "level", log_CFG_SECTION, 0, CFG_TYPE_INT, DEFAULT_LOGLEVEL, +@@ -882,23 +882,23 @@ cfg(log_level_CFG, "level", log_CFG_SECTION, 0, CFG_TYPE_INT, DEFAULT_LOGLEVEL, cfg(log_indent_CFG, "indent", log_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_INDENT, vsn(1, 0, 0), NULL, 0, NULL, "Indent messages according to their severity.\n") @@ -279,7 +283,7 @@ index d3a42a1..6c6a28b 100644 "Select log messages by class.\n" "Some debugging messages are assigned to a class and only appear in\n" "debug output if the class is listed here. Classes currently\n" -@@ -918,55 +918,55 @@ cfg_array(log_debug_output_fields_CFG, "debug_output_fields", log_CFG_SECTION, C +@@ -913,55 +913,55 @@ cfg_array(log_debug_output_fields_CFG, "debug_output_fields", log_CFG_SECTION, C "The fields included in debug output written to stderr.\n" "Use \"all\" to include everything (the default).\n") @@ -348,7 +352,7 @@ index d3a42a1..6c6a28b 100644 "Enable/disable communication with the kernel device-mapper.\n" "Disable to use the tools to manipulate LVM metadata without\n" "activating any logical volumes. If the device-mapper driver\n" -@@ -984,30 +984,30 @@ cfg_array(global_format_libraries_CFG, "format_libraries", global_CFG_SECTION, C +@@ -979,30 +979,30 @@ cfg_array(global_format_libraries_CFG, "format_libraries", global_CFG_SECTION, C cfg_array(global_segment_libraries_CFG, "segment_libraries", global_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(1, 0, 18), NULL, vsn(2, 3, 3), NULL, NULL) @@ -387,7 +391,7 @@ index d3a42a1..6c6a28b 100644 "Allow quicker VG write access during high volume read access.\n" "When there are competing read-only and read-write access requests for\n" "a volume group's metadata, instead of always granting the read-only\n" -@@ -1021,22 +1021,22 @@ cfg(global_library_dir_CFG, "library_dir", global_CFG_SECTION, CFG_DEFAULT_UNDEF +@@ -1016,22 +1016,22 @@ cfg(global_library_dir_CFG, "library_dir", global_CFG_SECTION, CFG_DEFAULT_UNDEF cfg(global_locking_library_CFG, "locking_library", global_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_LOCKING_LIB, vsn(1, 0, 0), NULL, vsn(2, 3, 0), NULL, NULL) @@ -414,7 +418,7 @@ index d3a42a1..6c6a28b 100644 "The segment type used by the short mirroring option -m.\n" "The --type mirror|raid1 option overrides this setting.\n" "#\n" -@@ -1071,7 +1071,7 @@ cfg(global_support_mirrored_mirror_log_CFG, "support_mirrored_mirror_log", globa +@@ -1066,7 +1066,7 @@ cfg(global_support_mirrored_mirror_log_CFG, "support_mirrored_mirror_log", globa "Not supported for regular operation!\n" "\n") @@ -423,7 +427,7 @@ index d3a42a1..6c6a28b 100644 "The segment type used by the -i -m combination.\n" "The --type raid10|mirror option overrides this setting.\n" "The --stripes/-i and --mirrors/-m options can both be specified\n" -@@ -1089,7 +1089,7 @@ cfg(global_raid10_segtype_default_CFG, "raid10_segtype_default", global_CFG_SECT +@@ -1084,7 +1084,7 @@ cfg(global_raid10_segtype_default_CFG, "raid10_segtype_default", global_CFG_SECT " in terms of providing redundancy and performance.\n" "#\n") @@ -432,7 +436,7 @@ index d3a42a1..6c6a28b 100644 "The segment type used by the -V -L combination.\n" "The --type snapshot|thin option overrides this setting.\n" "The combination of -V and -L options creates a sparse LV. There are\n" -@@ -1127,7 +1127,7 @@ cfg(global_event_activation_CFG, "event_activation", global_CFG_SECTION, CFG_DEF +@@ -1122,7 +1122,7 @@ cfg(global_event_activation_CFG, "event_activation", global_CFG_SECTION, CFG_DEF "See the --setautoactivation option or the auto_activation_volume_list\n" "setting to configure autoactivation for specific VGs or LVs.\n") @@ -441,7 +445,7 @@ index d3a42a1..6c6a28b 100644 NULL) cfg(global_lvmetad_update_wait_time_CFG, "lvmetad_update_wait_time", global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, 0, vsn(2, 2, 151), NULL, vsn(2, 3, 0), NULL, -@@ -1136,7 +1136,7 @@ cfg(global_lvmetad_update_wait_time_CFG, "lvmetad_update_wait_time", global_CFG_ +@@ -1131,7 +1131,7 @@ cfg(global_lvmetad_update_wait_time_CFG, "lvmetad_update_wait_time", global_CFG_ cfg(global_use_aio_CFG, "use_aio", global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_USE_AIO, vsn(2, 2, 183), NULL, 0, NULL, "Use async I/O when reading and writing devices.\n") @@ -450,7 +454,7 @@ index d3a42a1..6c6a28b 100644 "Use lvmlockd for locking among hosts using LVM on shared storage.\n" "Applicable only if LVM is compiled with lockd support in which\n" "case there is also lvmlockd(8) man page available for more\n" -@@ -1262,7 +1262,7 @@ cfg(global_fsadm_executable_CFG, "fsadm_executable", global_CFG_SECTION, CFG_DEF +@@ -1257,7 +1257,7 @@ cfg(global_fsadm_executable_CFG, "fsadm_executable", global_CFG_SECTION, CFG_DEF "The full path to the fsadm command.\n" "LVM uses this command to help with lvresize -r operations.\n") @@ -459,7 +463,7 @@ index d3a42a1..6c6a28b 100644 "The method LVM uses to set the local system ID.\n" "Volume Groups can also be given a system ID (by vgcreate, vgchange,\n" "or vgimport.) A VG on shared storage devices is accessible only to\n" -@@ -1292,13 +1292,13 @@ cfg(global_system_id_file_CFG, "system_id_file", global_CFG_SECTION, CFG_DEFAULT +@@ -1287,13 +1287,13 @@ cfg(global_system_id_file_CFG, "system_id_file", global_CFG_SECTION, CFG_DEFAULT "This is used when system_id_source is set to 'file'.\n" "Comments starting with the character # are ignored.\n") @@ -475,7 +479,7 @@ index d3a42a1..6c6a28b 100644 "Use lvmpolld to supervise long running LVM commands.\n" "When enabled, control of long running LVM commands is transferred\n" "from the original LVM command to the lvmpolld daemon. This allows\n" -@@ -1311,7 +1311,7 @@ cfg(global_use_lvmpolld_CFG, "use_lvmpolld", global_CFG_SECTION, 0, CFG_TYPE_BOO +@@ -1306,7 +1306,7 @@ cfg(global_use_lvmpolld_CFG, "use_lvmpolld", global_CFG_SECTION, 0, CFG_TYPE_BOO "commands will supervise long running operations by forking themselves.\n" "Applicable only if LVM is compiled with lvmpolld support.\n") @@ -484,7 +488,7 @@ index d3a42a1..6c6a28b 100644 "Enable D-Bus notification from LVM commands.\n" "When enabled, an LVM command that changes PVs, changes VG metadata,\n" "or changes the activation state of an LV will send a notification.\n") -@@ -1324,7 +1324,7 @@ cfg(global_io_memory_size_CFG, "io_memory_size", global_CFG_SECTION, CFG_DEFAULT +@@ -1319,7 +1319,7 @@ cfg(global_io_memory_size_CFG, "io_memory_size", global_CFG_SECTION, CFG_DEFAULT "This value should usually not be decreased from the default; setting\n" "it too low can result in lvm failing to read VGs.\n") @@ -493,7 +497,7 @@ index d3a42a1..6c6a28b 100644 "Use udev notifications to synchronize udev and LVM.\n" "The --noudevsync option overrides this setting.\n" "When disabled, LVM commands will not wait for notifications from\n" -@@ -1334,7 +1334,7 @@ cfg(activation_udev_sync_CFG, "udev_sync", activation_CFG_SECTION, 0, CFG_TYPE_B +@@ -1329,7 +1329,7 @@ cfg(activation_udev_sync_CFG, "udev_sync", activation_CFG_SECTION, 0, CFG_TYPE_B "running, and LVM processes are waiting for udev, run the command\n" "'dmsetup udevcomplete_all' to wake them up.\n") @@ -502,7 +506,7 @@ index d3a42a1..6c6a28b 100644 "Use udev rules to manage LV device nodes and symlinks.\n" "When disabled, LVM will manage the device nodes and symlinks for\n" "active LVs itself. Manual intervention may be required if this\n" -@@ -1346,13 +1346,13 @@ cfg(activation_verify_udev_operations_CFG, "verify_udev_operations", activation_ +@@ -1341,13 +1341,13 @@ cfg(activation_verify_udev_operations_CFG, "verify_udev_operations", activation_ "in the device directory after udev has completed processing its\n" "events. Useful for diagnosing problems with LVM/udev interactions.\n") @@ -518,7 +522,7 @@ index d3a42a1..6c6a28b 100644 "Method to fill missing stripes when activating an incomplete LV.\n" "Using 'error' will make inaccessible parts of the device return I/O\n" "errors on access. Using 'zero' will return success (and zero) on I/O\n" -@@ -1465,11 +1465,11 @@ cfg_array(activation_read_only_volume_list_CFG, "read_only_volume_list", activat +@@ -1460,11 +1460,11 @@ cfg_array(activation_read_only_volume_list_CFG, "read_only_volume_list", activat "read_only_volume_list = [ \"vg1\", \"vg2/lvol1\", \"@tag1\", \"@*\" ]\n" "#\n") @@ -532,7 +536,7 @@ index d3a42a1..6c6a28b 100644 "Size in KiB of each raid or mirror synchronization region.\n" "The clean/dirty state of data is tracked for each region.\n" "The value is rounded down to a power of two if necessary, and\n" -@@ -1494,7 +1494,7 @@ cfg(activation_readahead_CFG, "readahead", activation_CFG_SECTION, CFG_DEFAULT_C +@@ -1489,7 +1489,7 @@ cfg(activation_readahead_CFG, "readahead", activation_CFG_SECTION, CFG_DEFAULT_C " Use default value chosen by kernel.\n" "#\n") @@ -541,7 +545,7 @@ index d3a42a1..6c6a28b 100644 "Defines how a device failure in a RAID LV is handled.\n" "This includes LVs that have the following segment types:\n" "raid1, raid4, raid5*, and raid6*.\n" -@@ -1515,7 +1515,7 @@ cfg(activation_raid_fault_policy_CFG, "raid_fault_policy", activation_CFG_SECTIO +@@ -1510,7 +1510,7 @@ cfg(activation_raid_fault_policy_CFG, "raid_fault_policy", activation_CFG_SECTIO " replace faulty devices.\n" "#\n") @@ -550,7 +554,7 @@ index d3a42a1..6c6a28b 100644 "Defines how a device failure in a 'mirror' LV is handled.\n" "An LV with the 'mirror' segment type is composed of mirror images\n" "(copies) and a mirror log. A disk log ensures that a mirror LV does\n" -@@ -1551,16 +1551,16 @@ cfg_runtime(activation_mirror_image_fault_policy_CFG, "mirror_image_fault_policy +@@ -1546,16 +1546,16 @@ cfg_runtime(activation_mirror_image_fault_policy_CFG, "mirror_image_fault_policy " replacement.\n" "#\n") @@ -570,7 +574,7 @@ index d3a42a1..6c6a28b 100644 "Auto-extend a snapshot when its usage exceeds this percent.\n" "Setting this to 100 disables automatic extension.\n" "The minimum value is 50 (a smaller value is treated as 50.)\n" -@@ -1574,7 +1574,7 @@ cfg(activation_snapshot_autoextend_threshold_CFG, "snapshot_autoextend_threshold +@@ -1569,7 +1569,7 @@ cfg(activation_snapshot_autoextend_threshold_CFG, "snapshot_autoextend_threshold "snapshot_autoextend_threshold = 70\n" "#\n") @@ -579,7 +583,7 @@ index d3a42a1..6c6a28b 100644 "Auto-extending a snapshot adds this percent extra space.\n" "The amount of additional space added to a snapshot is this\n" "percent of its current size.\n" -@@ -1586,7 +1586,7 @@ cfg(activation_snapshot_autoextend_percent_CFG, "snapshot_autoextend_percent", a +@@ -1581,7 +1581,7 @@ cfg(activation_snapshot_autoextend_percent_CFG, "snapshot_autoextend_percent", a "snapshot_autoextend_percent = 20\n" "#\n") @@ -588,7 +592,7 @@ index d3a42a1..6c6a28b 100644 "Auto-extend a thin pool when its usage exceeds this percent.\n" "Setting this to 100 disables automatic extension.\n" "The minimum value is 50 (a smaller value is treated as 50.)\n" -@@ -1600,7 +1600,7 @@ cfg(activation_thin_pool_autoextend_threshold_CFG, "thin_pool_autoextend_thresho +@@ -1595,7 +1595,7 @@ cfg(activation_thin_pool_autoextend_threshold_CFG, "thin_pool_autoextend_thresho "thin_pool_autoextend_threshold = 70\n" "#\n") @@ -597,7 +601,7 @@ index d3a42a1..6c6a28b 100644 "Auto-extending a thin pool adds this percent extra space.\n" "The amount of additional space added to a thin pool is this\n" "percent of its current size.\n" -@@ -1657,7 +1657,7 @@ cfg(activation_use_mlockall_CFG, "use_mlockall", activation_CFG_SECTION, CFG_DEF +@@ -1652,7 +1652,7 @@ cfg(activation_use_mlockall_CFG, "use_mlockall", activation_CFG_SECTION, CFG_DEF "Prior to version 2.02.62, LVM used mlockall() to pin the whole\n" "process's memory while activating devices.\n") @@ -606,7 +610,7 @@ index d3a42a1..6c6a28b 100644 "Monitor LVs that are activated.\n" "The --ignoremonitoring option overrides this setting.\n" "When enabled, LVM will ask dmeventd to monitor activated LVs.\n") -@@ -1679,7 +1679,7 @@ cfg(activation_auto_set_activation_skip_CFG, "auto_set_activation_skip", activat +@@ -1674,7 +1674,7 @@ cfg(activation_auto_set_activation_skip_CFG, "auto_set_activation_skip", activat "flag set. When this setting is enabled, the activation skip flag is\n" "set on new thin snapshot LVs.\n") @@ -615,7 +619,7 @@ index d3a42a1..6c6a28b 100644 "How LVs with missing devices are activated.\n" "The --activationmode option overrides this setting.\n" "#\n" -@@ -2202,4 +2202,4 @@ cfg(local_host_id_CFG, "host_id", local_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_ +@@ -2197,4 +2197,4 @@ cfg(local_host_id_CFG, "host_id", local_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_ "This must be unique among all hosts, and must be between 1 and 2000.\n" "Applicable only if LVM is compiled with lockd support\n") diff --git a/0002-config-change-default-use_devicesfile-to-1.patch b/0002-config-change-default-use_devicesfile-to-1.patch index cef53c8..08421aa 100644 --- a/0002-config-change-default-use_devicesfile-to-1.patch +++ b/0002-config-change-default-use_devicesfile-to-1.patch @@ -1,17 +1,17 @@ -From c88769809f7849e149a8e2c782fac6b755e20f84 Mon Sep 17 00:00:00 2001 +From 13439caa0aa13a43cfaf066f55e50c4c5345146b Mon Sep 17 00:00:00 2001 From: David Teigland Date: Tue, 16 Mar 2021 09:52:13 -0500 -Subject: [PATCH 02/10] config: change default use_devicesfile to 1 +Subject: [PATCH 02/11] config: change default use_devicesfile to 1 --- lib/config/defaults.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/defaults.h b/lib/config/defaults.h -index 2870dee..8f83d35 100644 +index 66eece5..a7a2a06 100644 --- a/lib/config/defaults.h +++ b/lib/config/defaults.h -@@ -323,7 +323,7 @@ +@@ -322,7 +322,7 @@ #define DEFAULT_MD_COMPONENT_CHECKS "auto" diff --git a/0003-system_id-new-appmachineid-option.patch b/0003-system_id-new-appmachineid-option.patch index 6d2f98a..6028970 100644 --- a/0003-system_id-new-appmachineid-option.patch +++ b/0003-system_id-new-appmachineid-option.patch @@ -1,7 +1,7 @@ -From 3aa1a1cafd6ceb83855d65cdc1be0255dcf216a3 Mon Sep 17 00:00:00 2001 +From 8b83c056d12b32cffa15a77423b6be9748c0ede1 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Wed, 20 May 2020 10:59:38 -0500 -Subject: [PATCH 03/10] system_id: new appmachineid option +Subject: [PATCH 03/11] system_id: new appmachineid option The new system_id_source="appmachineid" will cause lvm to use an lvm-specific derivation of the machine-id, @@ -16,10 +16,10 @@ recommended in place of using machineid. 5 files changed, 76 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac -index 1a49e7f..9d8193c 100644 +index a20633e..9fe50e1 100644 --- a/configure.ac +++ b/configure.ac -@@ -1083,6 +1083,26 @@ if test "$NOTIFYDBUS_SUPPORT" = yes; then +@@ -1105,6 +1105,26 @@ if test "$NOTIFYDBUS_SUPPORT" = yes; then fi ################################################################################ @@ -47,7 +47,7 @@ index 1a49e7f..9d8193c 100644 dnl -- Enable blkid wiping functionality AC_ARG_ENABLE(blkid_wiping, diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c -index 2966186..488337d 100644 +index ecd50db..8991aeb 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -41,6 +41,10 @@ @@ -102,10 +102,10 @@ index 2966186..488337d 100644 } diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index 6c6a28b..b22baaa 100644 +index 9cf73ce..76ebc10 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h -@@ -1278,10 +1278,12 @@ cfg(global_system_id_source_CFG, "system_id_source", global_CFG_SECTION, CFG_DEF +@@ -1273,10 +1273,12 @@ cfg(global_system_id_source_CFG, "system_id_source", global_CFG_SECTION, CFG_DEF " uname\n" " Set the system ID from the hostname (uname) of the system.\n" " System IDs beginning localhost are not permitted.\n" diff --git a/0004-pvscan-add-options-listlvs-listvg-checkcomplete.patch b/0004-pvscan-add-options-listlvs-listvg-checkcomplete.patch index 0c27398..ee98018 100644 --- a/0004-pvscan-add-options-listlvs-listvg-checkcomplete.patch +++ b/0004-pvscan-add-options-listlvs-listvg-checkcomplete.patch @@ -1,7 +1,7 @@ -From d6495e9bfc7d6a3bed2a2a1d187e220d4f4bbed3 Mon Sep 17 00:00:00 2001 +From 9273d0cb758b38c17dc11e344067c71f79d12f02 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Wed, 9 Dec 2020 10:59:40 -0600 -Subject: [PATCH 04/10] pvscan: add options listlvs listvg checkcomplete +Subject: [PATCH 04/11] pvscan: add options listlvs listvg checkcomplete pvscan --cache . read only dev @@ -102,13 +102,13 @@ $ pvscan --cache --listvg --checkcomplete /dev/loop2 tools/args.h | 20 +++ tools/command-lines.in | 30 +++- tools/lvmcmdline.c | 4 + - tools/pvscan.c | 409 ++++++++++++++++++++++++++++++++++----------- + tools/pvscan.c | 418 ++++++++++++++++++++++++++++++++++----------- tools/toollib.c | 18 ++ tools/tools.h | 2 + - 9 files changed, 422 insertions(+), 99 deletions(-) + 9 files changed, 431 insertions(+), 99 deletions(-) diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h -index a47b7d7..0f97a16 100644 +index 0911b05..0cb4ad7 100644 --- a/lib/commands/toolcontext.h +++ b/lib/commands/toolcontext.h @@ -29,6 +29,7 @@ struct config_info { @@ -120,10 +120,10 @@ index a47b7d7..0f97a16 100644 int syslog; int activation; diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c -index 002d80c..2713ba9 100644 +index 0cbf678..ef343da 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c -@@ -5265,3 +5265,36 @@ struct volume_group *vg_read_for_update(struct cmd_context *cmd, const char *vg_ +@@ -5279,3 +5279,36 @@ struct volume_group *vg_read_for_update(struct cmd_context *cmd, const char *vg_ return vg; } @@ -174,10 +174,10 @@ index dfd576e..70f7bbc 100644 + #endif diff --git a/tools/args.h b/tools/args.h -index 741c82b..b723745 100644 +index d4f23f8..9aeec40 100644 --- a/tools/args.h +++ b/tools/args.h -@@ -324,6 +324,19 @@ arg(labelsector_ARG, '\0', "labelsector", number_VAL, 0, 0, +@@ -329,6 +329,19 @@ arg(labelsector_ARG, '\0', "labelsector", number_VAL, 0, 0, "start of the disk (between 0 and 3 inclusive - see LABEL_SCAN_SECTORS\n" "in the source). Use with care.\n") @@ -197,7 +197,7 @@ index 741c82b..b723745 100644 arg(lockopt_ARG, '\0', "lockopt", string_VAL, 0, 0, "Used to pass options for special cases to lvmlockd.\n" "See \\fBlvmlockd\\fP(8) for more information.\n") -@@ -806,6 +819,9 @@ arg(type_ARG, '\0', "type", segtype_VAL, 0, 0, +@@ -811,6 +824,9 @@ arg(type_ARG, '\0', "type", segtype_VAL, 0, 0, "(e.g. --stripes, --mirrors, --snapshot, --virtualsize, --thin, --cache, --vdo).\n" "Use inferred types with care because it can lead to unexpected results.\n") @@ -207,7 +207,7 @@ index 741c82b..b723745 100644 arg(unbuffered_ARG, '\0', "unbuffered", 0, 0, 0, "Produce output immediately without sorting or aligning the columns properly.\n") -@@ -882,6 +898,10 @@ arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", vgmetadatacopies_VAL, 0, 0, +@@ -887,6 +903,10 @@ arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", vgmetadatacopies_VAL, 0, 0, "\\fBall\\fP causes LVM to first clear the metadataignore flags on\n" "all PVs, and then to become unmanaged.\n") @@ -219,10 +219,10 @@ index 741c82b..b723745 100644 "Display a one line comment for each configuration node.\n") diff --git a/tools/command-lines.in b/tools/command-lines.in -index 1107c1e..c1f049a 100644 +index 0bc5a49..aa3e3d9 100644 --- a/tools/command-lines.in +++ b/tools/command-lines.in -@@ -1632,11 +1632,37 @@ DESC: Display PV information. +@@ -1633,11 +1633,37 @@ DESC: Display PV information. pvscan --cache_long OO: --ignorelockingfailure, --reportformat ReportFmt, @@ -263,7 +263,7 @@ index 1107c1e..c1f049a 100644 --- diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c -index d97ff57..bf1dad2 100644 +index 4b63d48..6ea5487 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -2390,6 +2390,9 @@ static void _reset_current_settings_to_default(struct cmd_context *cmd) @@ -285,7 +285,7 @@ index d97ff57..bf1dad2 100644 init_debug_classes_logged(cmd->default_settings.debug_classes); init_verbose(cmd->current_settings.verbose + VERBOSE_BASE_LEVEL); diff --git a/tools/pvscan.c b/tools/pvscan.c -index f8d2737..3406de2 100644 +index 2299890..a836e0a 100644 --- a/tools/pvscan.c +++ b/tools/pvscan.c @@ -179,6 +179,27 @@ out: @@ -500,7 +500,7 @@ index f8d2737..3406de2 100644 *no_quick = 1; return ECMD_FAILED; } -@@ -932,7 +953,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp +@@ -940,7 +961,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp * label rescan are then disabled in vg_read.) */ if (!lock_vol(cmd, vgname, LCK_VG_WRITE, NULL)) { @@ -509,7 +509,7 @@ index f8d2737..3406de2 100644 return ECMD_FAILED; } -@@ -945,7 +966,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp +@@ -953,7 +974,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp label_scan_devs(cmd, NULL, &devs); if (!(vgid = lvmcache_vgid_from_vgname(cmd, vgname))) { @@ -518,7 +518,7 @@ index f8d2737..3406de2 100644 return ECMD_FAILED; } -@@ -965,7 +986,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp +@@ -973,7 +994,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp * original device arg scan. There will be very few and unusual * cases that would be caught here. */ @@ -527,7 +527,7 @@ index f8d2737..3406de2 100644 return ECMD_FAILED; } -@@ -987,7 +1008,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp +@@ -995,7 +1016,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp dm_list_iterate_items(pvl, &vg->pvs) { if (dev_in_device_list(pvl->pv->dev, &devs)) continue; @@ -536,7 +536,7 @@ index f8d2737..3406de2 100644 ret = ECMD_FAILED; goto out; } -@@ -995,7 +1016,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp +@@ -1003,7 +1024,7 @@ static int _pvscan_aa_quick(struct cmd_context *cmd, struct pvscan_aa_params *pp log_debug("pvscan autoactivating VG %s.", vgname); if (!vgchange_activate(cmd, vg, CHANGE_AAY)) { @@ -545,7 +545,7 @@ index f8d2737..3406de2 100644 pp->activate_errors++; } -@@ -1014,7 +1035,7 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, +@@ -1022,7 +1043,7 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, int ret = ECMD_FAILED; if (!(handle = init_processing_handle(cmd, NULL))) { @@ -554,7 +554,7 @@ index f8d2737..3406de2 100644 goto out; } -@@ -1029,11 +1050,11 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, +@@ -1037,11 +1058,11 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp, */ dm_list_iterate_items_safe(sl, sl2, vgnames) { if (!_online_vg_file_create(cmd, sl->str)) { @@ -568,7 +568,7 @@ index f8d2737..3406de2 100644 } if (dm_list_empty(vgnames)) { -@@ -1165,6 +1186,64 @@ static int _get_args_devs(struct cmd_context *cmd, struct dm_list *pvscan_args, +@@ -1189,6 +1210,64 @@ static int _get_args_devs(struct cmd_context *cmd, struct dm_list *pvscan_args, return 1; } @@ -633,7 +633,7 @@ index f8d2737..3406de2 100644 static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvscan_devs, int *pv_count, struct dm_list *complete_vgnames) { -@@ -1177,15 +1256,20 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1201,15 +1280,20 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs struct metadata_area *mda1, *mda2; struct volume_group *vg; struct physical_volume *pv; @@ -657,14 +657,7 @@ index f8d2737..3406de2 100644 int ret = 1; dm_list_iterate_items_safe(devl, devl2, pvscan_devs) { -@@ -1199,20 +1283,20 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs - * using udev and the native version didn't catch it. - */ - if (udev_dev_is_mpath_component(dev)) { -- log_print("pvscan[%d] ignore multipath component %s.", getpid(), dev_name(dev)); -+ log_print_pvscan(cmd, "ignore multipath component %s.", dev_name(dev)); - continue; - } +@@ -1219,14 +1303,14 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs if (!(info = lvmcache_info_from_pvid(dev->pvid, dev, 0))) { if (!do_all) @@ -681,7 +674,7 @@ index f8d2737..3406de2 100644 (*pv_count)++; continue; } -@@ -1231,7 +1315,7 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1245,7 +1329,7 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs vg = mda2->ops->vg_read(cmd, fid, "", mda2, NULL, NULL); if (!vg) { @@ -690,7 +683,7 @@ index f8d2737..3406de2 100644 if (fid) fmt->ops->destroy_instance(fid); goto online; -@@ -1240,7 +1324,7 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1254,7 +1338,7 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs set_pv_devices(fid, vg); if (!(pv = find_pv(vg, dev))) { @@ -699,10 +692,12 @@ index f8d2737..3406de2 100644 release_vg(vg); continue; } -@@ -1258,13 +1342,13 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1271,14 +1355,15 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs + if (pv->device_hint && !strncmp(pv->device_hint, "/dev/md", 7)) do_full_check = 1; } - if (do_full_check && dev_is_md_component(dev, NULL, 1)) { ++ + if (do_full_check && dev_is_md_component(cmd, dev, NULL, 1)) { - log_print("pvscan[%d] ignore md component %s.", getpid(), dev_name(dev)); + log_print_pvscan(cmd, "ignore md component %s.", dev_name(dev)); release_vg(vg); @@ -715,7 +710,7 @@ index f8d2737..3406de2 100644 release_vg(vg); continue; } -@@ -1274,7 +1358,13 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1288,7 +1373,13 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs vg_is_foreign(vg)) { log_verbose("Ignore PV %s with VG system id %s with our system id %s", dev_name(dev), vg->system_id, cmd->system_id); @@ -730,7 +725,7 @@ index f8d2737..3406de2 100644 release_vg(vg); continue; } -@@ -1293,19 +1383,20 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1307,19 +1398,20 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs /* * Create file named for pvid to record this PV is online. @@ -756,7 +751,7 @@ index f8d2737..3406de2 100644 release_vg(vg); continue; } -@@ -1313,58 +1404,159 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs +@@ -1327,58 +1419,159 @@ static int _online_devs(struct cmd_context *cmd, int do_all, struct dm_list *pvs /* * Check if all the PVs for this VG are online. If the arrival * of this dev completes the VG, then save the vgname in @@ -768,12 +763,7 @@ index f8d2737..3406de2 100644 - pvs_offline = 0; - pvs_unknown = 0; - vg_complete = 0; -+ if (do_activate || do_check_complete) { -+ pvs_online = 0; -+ pvs_offline = 0; -+ pvs_unknown = 0; -+ vg_complete = 0; - +- - if (vg) { - /* - * Use the VG metadata from this PV for a list of all @@ -784,7 +774,12 @@ index f8d2737..3406de2 100644 - */ - log_debug("checking all pvid files from vg %s", vg->name); - _count_pvid_files(vg, &pvs_online, &pvs_offline); -- ++ if (do_activate || do_check_complete) { ++ pvs_online = 0; ++ pvs_offline = 0; ++ pvs_unknown = 0; ++ vg_complete = 0; + - if (pvs_offline && _write_lookup_file(cmd, vg)) { - log_debug("rechecking all pvid files from vg %s", vg->name); + if (vg) { @@ -818,7 +813,7 @@ index f8d2737..3406de2 100644 + log_debug("checking all pvid files from lookup file"); + if (!_count_pvid_files_from_lookup_file(cmd, dev, &pvs_online, &pvs_offline, &vgname)) + pvs_unknown = 1; - } ++ } + + if (pvs_unknown) { + log_print_pvscan(cmd, "PV %s online, VG unknown.", dev_name(dev)); @@ -834,7 +829,7 @@ index f8d2737..3406de2 100644 + if (!str_list_add(cmd->mem, complete_vgnames, dm_pool_strdup(cmd->mem, vgname))) + stack; + vg_complete = 1; -+ } + } + } + if (!vgname && vg) @@ -956,16 +951,16 @@ index f8d2737..3406de2 100644 saved_vg = vg; else release_vg(vg); -@@ -1453,7 +1645,7 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, - cmd->pvscan_cache_single = 1; - - if (!setup_devices(cmd)) { +@@ -1472,7 +1665,7 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, + * Specific devs must be matched later with device_ids_match_dev(). + */ + if (!setup_devices_no_file_match(cmd)) { - log_error("Failed to set up devices."); + log_error_pvscan(cmd, "Failed to set up devices."); return 0; } -@@ -1519,8 +1711,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, +@@ -1551,8 +1744,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, dm_list_iterate_items_safe(devl, devl2, &pvscan_devs) { if (!cmd->filter->passes_filter(cmd, cmd->filter, devl->dev, NULL)) { @@ -976,7 +971,7 @@ index f8d2737..3406de2 100644 dm_list_del(&devl->list); } } -@@ -1556,7 +1748,7 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, +@@ -1588,7 +1781,7 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, if (!has_pvid) { /* Not an lvm device */ @@ -985,7 +980,7 @@ index f8d2737..3406de2 100644 dm_list_del(&devl->list); continue; } -@@ -1567,8 +1759,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, +@@ -1599,8 +1792,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, */ if (relax_deviceid_filter) { if (!get_du_for_pvid(cmd, devl->dev->pvid)) { @@ -996,7 +991,7 @@ index f8d2737..3406de2 100644 dm_list_del(&devl->list); continue; } -@@ -1576,8 +1768,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, +@@ -1608,8 +1801,8 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv, /* Applies all filters, including those that need data from dev. */ if (!cmd->filter->passes_filter(cmd, cmd->filter, devl->dev, NULL)) { @@ -1007,7 +1002,7 @@ index f8d2737..3406de2 100644 dm_list_del(&devl->list); } } -@@ -1633,6 +1825,29 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) +@@ -1673,6 +1866,37 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) return ECMD_PROCESSED; } @@ -1025,19 +1020,27 @@ index f8d2737..3406de2 100644 + * rules do not attempt to autoactivate. + */ + -+ if (arg_is_set(cmd, checkcomplete_ARG) && -+ !find_config_tree_bool(cmd, global_event_activation_CFG, NULL)) { ++ if (arg_is_set(cmd, checkcomplete_ARG) && !event_activation) { + if (arg_is_set(cmd, udevoutput_ARG)) + printf("LVM_EVENT_ACTIVATION=0\n"); + else + log_print_pvscan(cmd, "Ignoring pvscan with --checkcomplete because event_activation is disabled."); + return ECMD_PROCESSED; + } ++ ++ /* ++ * If obtain_device_list_from_udev was set to 1, force it to 0. ++ * Don't ask udev for info since pvscan is running from udev. ++ * If a pvscan attempts to get dev info from udev, udev can ++ * repeatedly return errors about the dev not being initialized ++ * which will stall the pvscan. ++ */ ++ init_obtain_device_list_from_udev(0); + if (arg_is_set(cmd, major_ARG) + arg_is_set(cmd, minor_ARG)) devno_args = 1; -@@ -1643,7 +1858,7 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) +@@ -1683,13 +1907,13 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) do_all = !argc && !devno_args; @@ -1046,11 +1049,18 @@ index f8d2737..3406de2 100644 if (do_all) { if (!_pvscan_cache_all(cmd, argc, argv, &complete_vgnames)) + return ECMD_FAILED; + } else { +- if (!event_activation) { ++ if (!arg_is_set(cmd, checkcomplete_ARG) && !event_activation) { + /* Avoid doing anything for device removal: pvscan --cache */ + log_verbose("Ignoring pvscan --cache because event_activation is disabled."); + return ECMD_PROCESSED; diff --git a/tools/toollib.c b/tools/toollib.c -index 07f0653..0ac2412 100644 +index 3385510..6ef3895 100644 --- a/tools/toollib.c +++ b/tools/toollib.c -@@ -810,6 +810,24 @@ int lv_change_activate(struct cmd_context *cmd, struct logical_volume *lv, +@@ -811,6 +811,24 @@ int lv_change_activate(struct cmd_context *cmd, struct logical_volume *lv, lv_clear_integrity_recalculate_metadata(lv); } @@ -1076,10 +1086,10 @@ index 07f0653..0ac2412 100644 return r; diff --git a/tools/tools.h b/tools/tools.h -index efbe1f4..52215d7 100644 +index 708a78d..bc98fcb 100644 --- a/tools/tools.h +++ b/tools/tools.h -@@ -291,4 +291,6 @@ int lvconvert_cachevol_attach_single(struct cmd_context *cmd, +@@ -295,4 +295,6 @@ int lvconvert_cachevol_attach_single(struct cmd_context *cmd, struct logical_volume *lv, struct processing_handle *handle); diff --git a/0005-logging-to-the-systemd-journal.patch b/0005-logging-to-the-systemd-journal.patch index 89f6de0..7e4d441 100644 --- a/0005-logging-to-the-systemd-journal.patch +++ b/0005-logging-to-the-systemd-journal.patch @@ -1,7 +1,7 @@ -From 4fcbbdee7bf19452076da80755062d4947130b01 Mon Sep 17 00:00:00 2001 +From 0621739db9b751c48b8e7a6d67941aeca9fa2154 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Wed, 24 Mar 2021 14:19:54 -0500 -Subject: [PATCH 05/10] logging: to the systemd journal +Subject: [PATCH 05/11] logging: to the systemd journal Configure via lvm.conf log/journal or command line --journal. @@ -26,7 +26,7 @@ values set in lvm.conf 9 files changed, 159 insertions(+), 1 deletion(-) diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c -index 488337d..70926b7 100644 +index 8991aeb..f939c3e 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -340,6 +340,33 @@ static int _parse_debug_classes(struct cmd_context *cmd) @@ -74,7 +74,7 @@ index 488337d..70926b7 100644 ctime_r(&t, &timebuf[0]); timebuf[24] = '\0'; diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h -index 0f97a16..4250d13 100644 +index 0cb4ad7..2ee6524 100644 --- a/lib/commands/toolcontext.h +++ b/lib/commands/toolcontext.h @@ -41,6 +41,7 @@ struct config_info { @@ -86,10 +86,10 @@ index 0f97a16..4250d13 100644 const char *fmt_name; const char *dmeventd_executable; diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index b22baaa..980fce6 100644 +index 76ebc10..63569bf 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h -@@ -876,6 +876,12 @@ cfg(log_syslog_CFG, "syslog", log_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_B +@@ -871,6 +871,12 @@ cfg(log_syslog_CFG, "syslog", log_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_B cfg(log_file_CFG, "file", log_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(1, 0, 0), NULL, 0, NULL, "Write error and debug log messages to a file specified here.\n") @@ -262,10 +262,10 @@ index 39108fc..fb18a41 100644 void reset_lvm_errno(int store_errmsg); int stored_errno(void); diff --git a/tools/args.h b/tools/args.h -index b723745..c807e59 100644 +index 9aeec40..71db7f5 100644 --- a/tools/args.h +++ b/tools/args.h -@@ -318,6 +318,14 @@ arg(ignoreunsupported_ARG, '\0', "ignoreunsupported", 0, 0, 0, +@@ -323,6 +323,14 @@ arg(ignoreunsupported_ARG, '\0', "ignoreunsupported", 0, 0, 0, arg(importdevices_ARG, '\0', "importdevices", 0, 0, 0, "Add devices to the devices file.\n") @@ -281,7 +281,7 @@ index b723745..c807e59 100644 "By default the PV is labelled with an LVM2 identifier in its second\n" "sector (sector 1). This lets you use a different sector near the\n" diff --git a/tools/command-lines.in b/tools/command-lines.in -index c1f049a..5ce6556 100644 +index aa3e3d9..68374c0 100644 --- a/tools/command-lines.in +++ b/tools/command-lines.in @@ -204,7 +204,7 @@ @@ -294,7 +294,7 @@ index c1f049a..5ce6556 100644 # # options for pvs, lvs, vgs, fullreport diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c -index bf1dad2..dc00a05 100644 +index 6ea5487..222cd5b 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -2016,6 +2016,8 @@ out: diff --git a/0006-new-udev-and-systemd-autoactivation.patch b/0006-new-udev-and-systemd-autoactivation.patch deleted file mode 100644 index 233d1ac..0000000 --- a/0006-new-udev-and-systemd-autoactivation.patch +++ /dev/null @@ -1,198 +0,0 @@ -From 99f93ea6fc8cdce934768fb748f75ac549612164 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Fri, 26 Mar 2021 11:39:05 -0500 -Subject: [PATCH 06/10] new udev and systemd autoactivation - -new udev rule: 69-dm-lvm.rules - -. calls pvscan directly on the added device -. pvscan output indicates if a complete VG can be - activated -. the complete VG name to activate is set in env var - LVM_VG_NAME_COMPLETE -. this replaces 69-dm-lvm-meta.rules - -new unit file: lvm-vgchange@.service - -. udev rule above starts this using systemctl start - if LVM_VG_NAME_COMPLETE is set -. the service runs vgchange -aay on the vg -. this replaces lvm2-pvscan@.service ---- - configure.ac | 1 + - scripts/Makefile.in | 3 +- - scripts/lvm-vgchange.service.in | 12 +++++++ - scripts/lvmdump.sh.in | 3 ++ - udev/69-dm-lvm.rules.in | 80 +++++++++++++++++++++++++++++++++++++++++ - udev/Makefile.in | 2 +- - 7 files changed, 101 insertions(+), 4 deletions(-) - create mode 100644 scripts/lvm-vgchange.service.in - create mode 100644 udev/69-dm-lvm.rules.in - -diff --git a/configure.ac b/configure.ac -index 9d8193c..d0f1049 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1966,6 +1966,7 @@ libdm/libdevmapper.pc - man/Makefile - po/Makefile - scripts/lvm2-pvscan.service -+scripts/lvm-vgchange.service - scripts/blkdeactivate.sh - scripts/blk_availability_init_red_hat - scripts/blk_availability_systemd_red_hat.service -diff --git a/scripts/Makefile.in b/scripts/Makefile.in -index e8f6742..4ba5aca 100644 ---- a/scripts/Makefile.in -+++ b/scripts/Makefile.in -@@ -88,7 +88,7 @@ install_systemd_generators: - install_systemd_units: install_dbus_service - @echo " [INSTALL] systemd_units" - $(Q) $(INSTALL_DIR) $(systemd_unit_dir) -- $(Q) $(INSTALL_DATA) lvm2-pvscan.service $(systemd_unit_dir)/lvm2-pvscan@.service -+ $(Q) $(INSTALL_DATA) lvm-vgchange.service $(systemd_unit_dir)/lvm-vgchange@.service - ifeq ("@BUILD_DMEVENTD@", "yes") - $(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.socket $(systemd_unit_dir)/dm-event.socket - $(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.service $(systemd_unit_dir)/dm-event.service -@@ -139,6 +139,7 @@ DISTCLEAN_TARGETS += \ - dm_event_systemd_red_hat.socket \ - lvmdump.sh \ - lvm2-pvscan.service \ -+ lvm-vgchange.service \ - lvm2_cluster_activation_red_hat.sh \ - lvm2_cluster_activation_systemd_red_hat.service \ - lvm2_clvmd_systemd_red_hat.service \ -diff --git a/scripts/lvm-vgchange.service.in b/scripts/lvm-vgchange.service.in -new file mode 100644 -index 0000000..8ae0df8 ---- /dev/null -+++ b/scripts/lvm-vgchange.service.in -@@ -0,0 +1,12 @@ -+[Unit] -+Description=LVM event activation of VG %i -+Documentation=man:vgchange(8) -+DefaultDependencies=no -+StartLimitIntervalSec=0 -+Before=shutdown.target -+Conflicts=shutdown.target -+ -+[Service] -+Type=oneshot -+RemainAfterExit=no -+ExecStart=@SBINDIR@/lvm vgchange -aay --config log/prefix=\"\" %i -diff --git a/scripts/lvmdump.sh.in b/scripts/lvmdump.sh.in -index 0685d85..91340dd 100644 ---- a/scripts/lvmdump.sh.in -+++ b/scripts/lvmdump.sh.in -@@ -300,6 +300,9 @@ if (( sysreport )); then - for unit in $("$GREP" lvm2-pvscan "$sysreport_dir/systemd_unit_list" | cut -d " " -f 1); do - log "$SYSTEMCTL status -l --no-pager -n $log_lines -o short-precise $unit >> \"$sysreport_dir/systemd_lvm2_pvscan_service_status\"" - done -+ for unit in $("$GREP" lvm-vgchange "$sysreport_dir/systemd_unit_list" | cut -d " " -f 1); do -+ log "$SYSTEMCTL status -l --no-pager -n $log_lines -o short-precise $unit >> \"$sysreport_dir/systemd_lvm_vgchange_service_status\"" -+ done - fi - fi - -diff --git a/udev/69-dm-lvm.rules.in b/udev/69-dm-lvm.rules.in -new file mode 100644 -index 0000000..9869d1b ---- /dev/null -+++ b/udev/69-dm-lvm.rules.in -@@ -0,0 +1,80 @@ -+# Copyright (C) 2012,2021 Red Hat, Inc. All rights reserved. -+# -+# This file is part of LVM. -+# -+# This rule requires blkid to be called on block devices before so only devices -+# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member"). -+ -+SUBSYSTEM!="block", GOTO="lvm_end" -+(LVM_EXEC_RULE) -+ -+ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="lvm_end" -+ -+# Only process devices already marked as a PV - this requires blkid to be called before. -+ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end" -+ENV{DM_MULTIPATH_DEVICE_PATH}=="1", GOTO="lvm_end" -+ACTION=="remove", GOTO="lvm_end" -+ -+# Create /dev/disk/by-id/lvm-pv-uuid- symlink for each PV -+ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-id/lvm-pv-uuid-$env{ID_FS_UUID_ENC}" -+ -+# If the PV is a special device listed below, scan only if the device is -+# properly activated. These devices are not usable after an ADD event, -+# but they require an extra setup and they are ready after a CHANGE event. -+# Also support coldplugging with ADD event but only if the device is already -+# properly activated. -+# This logic should be eventually moved to rules where those particular -+# devices are processed primarily (MD and loop). -+ -+# DM device: -+KERNEL!="dm-[0-9]*", GOTO="next" -+ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", ENV{DM_ACTIVATION}=="1", GOTO="lvm_scan" -+GOTO="lvm_end" -+ -+# MD device: -+LABEL="next" -+KERNEL!="md[0-9]*", GOTO="next" -+IMPORT{db}="LVM_MD_PV_ACTIVATED" -+ACTION=="add", ENV{LVM_MD_PV_ACTIVATED}=="1", GOTO="lvm_scan" -+ACTION=="change", ENV{LVM_MD_PV_ACTIVATED}!="1", TEST=="md/array_state", ENV{LVM_MD_PV_ACTIVATED}="1", GOTO="lvm_scan" -+ACTION=="add", KERNEL=="md[0-9]*p[0-9]*", GOTO="lvm_scan" -+ENV{LVM_MD_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" -+GOTO="lvm_end" -+ -+# Loop device: -+LABEL="next" -+KERNEL!="loop[0-9]*", GOTO="next" -+ACTION=="add", ENV{LVM_LOOP_PV_ACTIVATED}=="1", GOTO="lvm_scan" -+ACTION=="change", ENV{LVM_LOOP_PV_ACTIVATED}!="1", TEST=="loop/backing_file", ENV{LVM_LOOP_PV_ACTIVATED}="1", GOTO="lvm_scan" -+ENV{LVM_LOOP_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" -+GOTO="lvm_end" -+ -+LABEL="next" -+ACTION!="add", GOTO="lvm_end" -+ -+LABEL="lvm_scan" -+ -+ENV{SYSTEMD_READY}="1" -+ -+# pvscan will check if this device completes a VG, -+# i.e. all PVs in the VG are now present with the -+# arrival of this PV. If so, it prints to stdout: -+# LVM_VG_NAME_COMPLETE='foo' -+# -+# When the VG is complete it can be activated, so -+# the lvm-vgchange service is started which runs -+# vgchange -aay . -+# -+# pvscan only reads the single device specified, -+# and uses temp files under /run/lvm to check if -+# other PVs in the VG are present. -+# -+# If event_activation=0 in lvm.conf, this pvscan -+# (using checkcomplete) will do nothing, so that -+# no event-based autoactivation will be happen. -+ -+IMPORT{program}="(LVM_EXEC)/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}" -+ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemctl start lvm-vgchange@$env{LVM_VG_NAME_COMPLETE}.service" -+GOTO="lvm_end" -+ -+LABEL="lvm_end" -diff --git a/udev/Makefile.in b/udev/Makefile.in -index e32cba9..e777dda 100644 ---- a/udev/Makefile.in -+++ b/udev/Makefile.in -@@ -18,7 +18,7 @@ top_builddir = @top_builddir@ - include $(top_builddir)/make.tmpl - - DM_RULES=10-dm.rules 13-dm-disk.rules 95-dm-notify.rules --LVM_RULES=11-dm-lvm.rules 69-dm-lvm-metad.rules -+LVM_RULES=11-dm-lvm.rules 69-dm-lvm.rules - - DM_DIR=$(shell $(GREP) "\#define DM_DIR" $(top_srcdir)/libdm/misc/dm-ioctl.h | $(AWK) '{print $$3}') - --- -1.8.3.1 - diff --git a/0007-tests-add-udev-pvscan-vgchange.patch b/0006-new-udev-autoactivation.patch similarity index 57% rename from 0007-tests-add-udev-pvscan-vgchange.patch rename to 0006-new-udev-autoactivation.patch index bd6a97b..b6e7fcc 100644 --- a/0007-tests-add-udev-pvscan-vgchange.patch +++ b/0006-new-udev-autoactivation.patch @@ -1,20 +1,46 @@ -From 032bc9bfb43239f863032b47617f05cd51648a60 Mon Sep 17 00:00:00 2001 +From 15562a3c2761d206e47258ee11e25dac17427fce Mon Sep 17 00:00:00 2001 From: David Teigland -Date: Wed, 7 Apr 2021 17:19:51 -0500 -Subject: [PATCH 07/10] tests: add udev-pvscan-vgchange +Date: Fri, 26 Mar 2021 11:39:05 -0500 +Subject: [PATCH 06/11] new udev autoactivation -uses real devices, tests udev rule and systemd unit +new udev rule 69-dm-lvm.rules replaces +69-dm-lvm-meta.rules and lvm2-pvscan.service + +udev rule calls pvscan directly on the added device + +pvscan output indicates if a complete VG can be activated + +udev env var LVM_VG_NAME_COMPLETE is used to pass complete +VG name from pvscan to the udev rule + +udev rule uses systemd-run to run vgchange -aay --- - test/shell/udev-pvscan-vgchange.sh | 380 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 380 insertions(+) + scripts/Makefile.in | 1 - + test/shell/udev-pvscan-vgchange.sh | 403 +++++++++++++++++++++++++++++++++++++ + udev/69-dm-lvm.rules.in | 87 ++++++++ + udev/Makefile.in | 2 +- + 5 files changed, 492 insertions(+), 4 deletions(-) create mode 100644 test/shell/udev-pvscan-vgchange.sh + create mode 100644 udev/69-dm-lvm.rules.in +diff --git a/scripts/Makefile.in b/scripts/Makefile.in +index 1fe88ca..60449e1 100644 +--- a/scripts/Makefile.in ++++ b/scripts/Makefile.in +@@ -92,7 +92,6 @@ install_systemd_generators: + install_systemd_units: install_dbus_service + @echo " [INSTALL] systemd_units" + $(Q) $(INSTALL_DIR) $(systemd_unit_dir) +- $(Q) $(INSTALL_DATA) lvm2-pvscan.service $(systemd_unit_dir)/lvm2-pvscan@.service + ifeq ("@BUILD_DMEVENTD@", "yes") + $(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.socket $(systemd_unit_dir)/dm-event.socket + $(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.service $(systemd_unit_dir)/dm-event.service diff --git a/test/shell/udev-pvscan-vgchange.sh b/test/shell/udev-pvscan-vgchange.sh new file mode 100644 -index 0000000..fc05c8a +index 0000000..c81acf0 --- /dev/null +++ b/test/shell/udev-pvscan-vgchange.sh -@@ -0,0 +1,380 @@ +@@ -0,0 +1,403 @@ +#!/usr/bin/env bash + +# Copyright (C) 2021 Red Hat, Inc. All rights reserved. @@ -88,6 +114,20 @@ index 0000000..fc05c8a + done +} + ++# udevadm trigger runs udev rule which runs systemd-run --no-wait vgchange -aay ++# Because of --no-wait, we need to wait for the transient systemd ++# service to be gone before checking the effects of the vgchange. ++ ++wait_lvm_activate() { ++ local vgw=$1 ++ local wait=0 ++ ++ while systemctl status lvm-activate-$vgw > /dev/null && test "$wait" -le 30; do ++ sleep .2 ++ wait=$(( wait + 1 )) ++ done ++} ++ +# Test requires 3 devs +test $num_devs -gt 2 || skip +BDEV1=$(basename "$dev1") @@ -110,10 +150,12 @@ index 0000000..fc05c8a +_clear_online_files +udevadm trigger --settle -c add /sys/block/$BDEV1 + ++wait_lvm_activate $vg1 ++ +ls "$RUNDIR/lvm/pvs_online/$PVID1" +ls "$RUNDIR/lvm/vgs_online/$vg1" -+systemctl status lvm-vgchange@$vg1 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg1 | tee out || true ++grep "now active" out +check lv_field $vg1/$lv1 lv_active "active" + +vgchange -an $vg1 @@ -134,16 +176,19 @@ index 0000000..fc05c8a +udevadm trigger --settle -c add /sys/block/$BDEV1 +ls "$RUNDIR/lvm/pvs_online/$PVID1" +not ls "$RUNDIR/lvm/vgs_online/$vg2" -+systemctl status lvm-vgchange@$vg2 | tee out || true -+not grep Started out ++journalctl -u lvm-activate-$vg2 | tee out || true ++not grep "now active" out +check lv_field $vg2/$lv1 lv_active "" +check lv_field $vg2/$lv2 lv_active "" + +udevadm trigger --settle -c add /sys/block/$BDEV2 +ls "$RUNDIR/lvm/pvs_online/$PVID2" +ls "$RUNDIR/lvm/vgs_online/$vg2" -+systemctl status lvm-vgchange@$vg2 | tee out || true -+grep Started out ++ ++wait_lvm_activate $vg2 ++ ++journalctl -u lvm-activate-$vg2 | tee out || true ++grep "now active" out +check lv_field $vg2/$lv1 lv_active "active" +check lv_field $vg2/$lv2 lv_active "active" + @@ -171,15 +216,15 @@ index 0000000..fc05c8a +udevadm trigger -c add /sys/block/$BDEV2 & +udevadm trigger -c add /sys/block/$BDEV3 + -+sleep 5 +aux udev_wait ++wait_lvm_activate $vg3 + +ls "$RUNDIR/lvm/pvs_online/$PVID1" +ls "$RUNDIR/lvm/pvs_online/$PVID2" +ls "$RUNDIR/lvm/pvs_online/$PVID3" +ls "$RUNDIR/lvm/vgs_online/$vg3" -+systemctl status lvm-vgchange@$vg3 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg3 | tee out || true ++grep "now active" out +check lv_field $vg3/$lv1 lv_active "active" +check lv_field $vg3/$lv2 lv_active "active" +check lv_field $vg3/$lv3 lv_active "active" @@ -214,15 +259,15 @@ index 0000000..fc05c8a +udevadm trigger -c add /sys/block/$BDEV2 & +udevadm trigger -c add /sys/block/$BDEV3 + -+sleep 5 +aux udev_wait ++wait_lvm_activate $vg4 + +ls "$RUNDIR/lvm/pvs_online/$PVID1" +ls "$RUNDIR/lvm/pvs_online/$PVID2" +ls "$RUNDIR/lvm/pvs_online/$PVID3" +ls "$RUNDIR/lvm/vgs_online/$vg4" -+systemctl status lvm-vgchange@$vg4 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg4 | tee out || true ++grep "now active" out +check lv_field $vg4/$lv1 lv_active "active" +check lv_field $vg4/$lv2 lv_active "active" +check lv_field $vg4/$lv3 lv_active "active" @@ -254,18 +299,20 @@ index 0000000..fc05c8a +udevadm trigger -c add /sys/block/$BDEV2 & +udevadm trigger -c add /sys/block/$BDEV3 + -+sleep 5 +aux udev_wait ++wait_lvm_activate $vg5 ++wait_lvm_activate $vg6 ++wait_lvm_activate $vg7 + +ls "$RUNDIR/lvm/vgs_online/$vg5" +ls "$RUNDIR/lvm/vgs_online/$vg6" +ls "$RUNDIR/lvm/vgs_online/$vg7" -+systemctl status lvm-vgchange@$vg5 | tee out || true -+grep Started out -+systemctl status lvm-vgchange@$vg6 | tee out || true -+grep Started out -+systemctl status lvm-vgchange@$vg7 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg5 | tee out || true ++grep "now active" out ++journalctl -u lvm-activate-$vg6 | tee out || true ++grep "now active" out ++journalctl -u lvm-activate-$vg7 | tee out || true ++grep "now active" out +check lv_field $vg5/$lv1 lv_active "active" +check lv_field $vg5/$lv2 lv_active "active" +check lv_field $vg6/$lv1 lv_active "active" @@ -327,12 +374,12 @@ index 0000000..fc05c8a +udevadm trigger -c add /sys/block/$BDEV2 & +udevadm trigger -c add /sys/block/$BDEV3 + -+sleep 5 +aux udev_wait ++wait_lvm_activate $vg8 + +ls "$RUNDIR/lvm/vgs_online/$vg8" -+systemctl status lvm-vgchange@$vg8 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg8 | tee out || true ++grep "now active" out + +num_active=$(lvs $vg8 --noheading -o active | grep active | wc -l) + @@ -382,9 +429,11 @@ index 0000000..fc05c8a + +udevadm trigger --settle -c add /sys/block/$BDEVMD + ++wait_lvm_activate $vg9 ++ +ls "$RUNDIR/lvm/vgs_online/$vg9" -+systemctl status lvm-vgchange@$vg9 | tee out || true -+grep Started out ++journalctl -u lvm-activate-$vg9 | tee out || true ++grep "now active" out +check lv_field $vg9/$lv1 lv_active "active" +check lv_field $vg9/$lv2 lv_active "active" + @@ -395,6 +444,112 @@ index 0000000..fc05c8a +aux udev_wait +wipe_all + +diff --git a/udev/69-dm-lvm.rules.in b/udev/69-dm-lvm.rules.in +new file mode 100644 +index 0000000..03c8fbb +--- /dev/null ++++ b/udev/69-dm-lvm.rules.in +@@ -0,0 +1,87 @@ ++# Copyright (C) 2012,2021 Red Hat, Inc. All rights reserved. ++# ++# This file is part of LVM. ++# ++# This rule requires blkid to be called on block devices before so only devices ++# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member"). ++ ++SUBSYSTEM!="block", GOTO="lvm_end" ++(LVM_EXEC_RULE) ++ ++ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="lvm_end" ++ ++# Only process devices already marked as a PV - this requires blkid to be called before. ++ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end" ++ENV{DM_MULTIPATH_DEVICE_PATH}=="1", GOTO="lvm_end" ++ACTION=="remove", GOTO="lvm_end" ++ ++# Create /dev/disk/by-id/lvm-pv-uuid- symlink for each PV ++ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-id/lvm-pv-uuid-$env{ID_FS_UUID_ENC}" ++ ++# If the PV is a special device listed below, scan only if the device is ++# properly activated. These devices are not usable after an ADD event, ++# but they require an extra setup and they are ready after a CHANGE event. ++# Also support coldplugging with ADD event but only if the device is already ++# properly activated. ++# This logic should be eventually moved to rules where those particular ++# devices are processed primarily (MD and loop). ++ ++# DM device: ++KERNEL!="dm-[0-9]*", GOTO="next" ++ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", ENV{DM_ACTIVATION}=="1", GOTO="lvm_scan" ++GOTO="lvm_end" ++ ++# MD device: ++LABEL="next" ++KERNEL!="md[0-9]*", GOTO="next" ++IMPORT{db}="LVM_MD_PV_ACTIVATED" ++ACTION=="add", ENV{LVM_MD_PV_ACTIVATED}=="1", GOTO="lvm_scan" ++ACTION=="change", ENV{LVM_MD_PV_ACTIVATED}!="1", TEST=="md/array_state", ENV{LVM_MD_PV_ACTIVATED}="1", GOTO="lvm_scan" ++ACTION=="add", KERNEL=="md[0-9]*p[0-9]*", GOTO="lvm_scan" ++ENV{LVM_MD_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" ++GOTO="lvm_end" ++ ++# Loop device: ++LABEL="next" ++KERNEL!="loop[0-9]*", GOTO="next" ++ACTION=="add", ENV{LVM_LOOP_PV_ACTIVATED}=="1", GOTO="lvm_scan" ++ACTION=="change", ENV{LVM_LOOP_PV_ACTIVATED}!="1", TEST=="loop/backing_file", ENV{LVM_LOOP_PV_ACTIVATED}="1", GOTO="lvm_scan" ++ENV{LVM_LOOP_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" ++GOTO="lvm_end" ++ ++LABEL="next" ++ACTION!="add", GOTO="lvm_end" ++ ++LABEL="lvm_scan" ++ ++ENV{SYSTEMD_READY}="1" ++ ++# pvscan will check if this device completes a VG, ++# i.e. all PVs in the VG are now present with the ++# arrival of this PV. If so, it prints to stdout: ++# LVM_VG_NAME_COMPLETE='foo' ++# ++# When the VG is complete it can be activated, so ++# vgchange -aay is run. It is run via ++# systemd since it can take longer to run than ++# udev wants to block when processing rules. ++# (if there are hundreds of LVs to activate, ++# the vgchange can take many seconds.) ++# ++# pvscan only reads the single device specified, ++# and uses temp files under /run/lvm to check if ++# other PVs in the VG are present. ++# ++# If event_activation=0 in lvm.conf, this pvscan ++# (using checkcomplete) will do nothing, so that ++# no event-based autoactivation will be happen. ++# ++# TODO: adjust the output of vgchange -aay so that ++# it's better suited to appearing in the journal. ++ ++IMPORT{program}="(LVM_EXEC)/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}" ++ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay $env{LVM_VG_NAME_COMPLETE}" ++GOTO="lvm_end" ++ ++LABEL="lvm_end" ++ +diff --git a/udev/Makefile.in b/udev/Makefile.in +index e32cba9..e777dda 100644 +--- a/udev/Makefile.in ++++ b/udev/Makefile.in +@@ -18,7 +18,7 @@ top_builddir = @top_builddir@ + include $(top_builddir)/make.tmpl + + DM_RULES=10-dm.rules 13-dm-disk.rules 95-dm-notify.rules +-LVM_RULES=11-dm-lvm.rules 69-dm-lvm-metad.rules ++LVM_RULES=11-dm-lvm.rules 69-dm-lvm.rules + + DM_DIR=$(shell $(GREP) "\#define DM_DIR" $(top_srcdir)/libdm/misc/dm-ioctl.h | $(AWK) '{print $$3}') + -- 1.8.3.1 diff --git a/0010-configure-update.patch b/0007-configure-update.patch similarity index 50% rename from 0010-configure-update.patch rename to 0007-configure-update.patch index 99fd132..d7863ce 100644 --- a/0010-configure-update.patch +++ b/0007-configure-update.patch @@ -1,27 +1,29 @@ -From 7629e3185849f2fb76fe8378f03cf25f6ffe3de6 Mon Sep 17 00:00:00 2001 +From 9dc9a14d41d5c91892bc03024cc80c742827baa3 Mon Sep 17 00:00:00 2001 From: Marian Csontos Date: Mon, 26 Apr 2021 14:27:05 +0200 -Subject: [PATCH 10/10] configure: update +Subject: [PATCH 07/11] configure: update --- - configure | 108 ++++++++++++++++++++++++++++++++++++++++++++++++- + configure | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ include/configure.h.in | 3 ++ - 2 files changed, 110 insertions(+), 1 deletion(-) + 2 files changed, 115 insertions(+) diff --git a/configure b/configure -index 7c6bd48..54bc1ef 100755 +index c2d2cff..0147902 100755 --- a/configure +++ b/configure -@@ -774,6 +774,8 @@ SYSTEMD_LIBS +@@ -774,6 +774,10 @@ UDEV_LIBS + UDEV_CFLAGS + SYSTEMD_LIBS SYSTEMD_CFLAGS - BLKID_LIBS - BLKID_CFLAGS ++BLKID_LIBS ++BLKID_CFLAGS +APP_MACHINEID_LIBS +APP_MACHINEID_CFLAGS NOTIFY_DBUS_LIBS NOTIFY_DBUS_CFLAGS - LOCKD_DLM_CONTROL_LIBS -@@ -952,6 +954,7 @@ enable_use_lvmpolld + BLKID_LIBS +@@ -957,6 +961,7 @@ enable_use_lvmpolld with_lvmpolld_pidfile enable_dmfilemapd enable_notify_dbus @@ -29,16 +31,18 @@ index 7c6bd48..54bc1ef 100755 enable_blkid_wiping enable_udev_systemd_background_jobs enable_udev_sync -@@ -1021,6 +1024,8 @@ LOCKD_DLM_CONTROL_CFLAGS +@@ -1027,6 +1032,10 @@ LOCKD_DLM_CONTROL_CFLAGS LOCKD_DLM_CONTROL_LIBS - NOTIFY_DBUS_CFLAGS - NOTIFY_DBUS_LIBS + LOCKD_IDM_CFLAGS + LOCKD_IDM_LIBS ++NOTIFY_DBUS_CFLAGS ++NOTIFY_DBUS_LIBS +APP_MACHINEID_CFLAGS +APP_MACHINEID_LIBS BLKID_CFLAGS BLKID_LIBS - SYSTEMD_CFLAGS -@@ -1682,6 +1687,7 @@ Optional Features: + NOTIFY_DBUS_CFLAGS +@@ -1691,6 +1700,7 @@ Optional Features: --disable-use-lvmpolld disable usage of LVM Poll Daemon --enable-dmfilemapd enable the dmstats filemap daemon --enable-notify-dbus enable LVM notification using dbus @@ -46,7 +50,7 @@ index 7c6bd48..54bc1ef 100755 --disable-blkid_wiping disable libblkid detection of signatures when wiping and use native code instead --disable-udev-systemd-background-jobs -@@ -1836,6 +1842,10 @@ Some influential environment variables: +@@ -1853,6 +1863,13 @@ Some influential environment variables: C compiler flags for NOTIFY_DBUS, overriding pkg-config NOTIFY_DBUS_LIBS linker flags for NOTIFY_DBUS, overriding pkg-config @@ -54,10 +58,13 @@ index 7c6bd48..54bc1ef 100755 + C compiler flags for APP_MACHINEID, overriding pkg-config + APP_MACHINEID_LIBS + linker flags for APP_MACHINEID, overriding pkg-config - BLKID_CFLAGS - C compiler flags for BLKID, overriding pkg-config - BLKID_LIBS linker flags for BLKID, overriding pkg-config -@@ -11410,6 +11420,101 @@ fi ++ BLKID_CFLAGS ++ C compiler flags for BLKID, overriding pkg-config ++ BLKID_LIBS linker flags for BLKID, overriding pkg-config + SYSTEMD_CFLAGS + C compiler flags for SYSTEMD, overriding pkg-config + SYSTEMD_LIBS +@@ -11589,6 +11606,101 @@ fi fi ################################################################################ @@ -159,25 +166,8 @@ index 7c6bd48..54bc1ef 100755 # Check whether --enable-blkid_wiping was given. if test "${enable_blkid_wiping+set}" = set; then : -@@ -14181,7 +14286,7 @@ _ACEOF - - - ################################################################################ --ac_config_files="$ac_config_files Makefile make.tmpl libdm/make.tmpl daemons/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/raid/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile daemons/dmeventd/plugins/thin/Makefile daemons/dmeventd/plugins/vdo/Makefile daemons/lvmdbusd/Makefile daemons/lvmdbusd/lvmdbusd daemons/lvmdbusd/lvmdb.py daemons/lvmdbusd/lvm_shell_proxy.py daemons/lvmdbusd/path.py daemons/lvmpolld/Makefile daemons/lvmlockd/Makefile conf/Makefile conf/example.conf conf/lvmlocal.conf conf/command_profile_template.profile conf/metadata_profile_template.profile include/Makefile lib/Makefile include/lvm-version.h libdaemon/Makefile libdaemon/client/Makefile libdaemon/server/Makefile libdm/Makefile libdm/dm-tools/Makefile libdm/libdevmapper.pc man/Makefile po/Makefile scripts/lvm2-pvscan.service scripts/blkdeactivate.sh scripts/blk_availability_init_red_hat scripts/blk_availability_systemd_red_hat.service scripts/cmirrord_init_red_hat scripts/com.redhat.lvmdbus1.service scripts/dm_event_systemd_red_hat.service scripts/dm_event_systemd_red_hat.socket scripts/lvm2_cmirrord_systemd_red_hat.service scripts/lvm2_lvmdbusd_systemd_red_hat.service scripts/lvm2_lvmpolld_init_red_hat scripts/lvm2_lvmpolld_systemd_red_hat.service scripts/lvm2_lvmpolld_systemd_red_hat.socket scripts/lvmlockd.service scripts/lvmlocks.service scripts/lvm2_monitoring_init_red_hat scripts/lvm2_monitoring_systemd_red_hat.service scripts/lvm2_tmpfiles_red_hat.conf scripts/lvmdump.sh scripts/Makefile test/Makefile tools/Makefile udev/Makefile" -+ac_config_files="$ac_config_files Makefile make.tmpl libdm/make.tmpl daemons/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/raid/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile daemons/dmeventd/plugins/thin/Makefile daemons/dmeventd/plugins/vdo/Makefile daemons/lvmdbusd/Makefile daemons/lvmdbusd/lvmdbusd daemons/lvmdbusd/lvmdb.py daemons/lvmdbusd/lvm_shell_proxy.py daemons/lvmdbusd/path.py daemons/lvmpolld/Makefile daemons/lvmlockd/Makefile conf/Makefile conf/example.conf conf/lvmlocal.conf conf/command_profile_template.profile conf/metadata_profile_template.profile include/Makefile lib/Makefile include/lvm-version.h libdaemon/Makefile libdaemon/client/Makefile libdaemon/server/Makefile libdm/Makefile libdm/dm-tools/Makefile libdm/libdevmapper.pc man/Makefile po/Makefile scripts/lvm2-pvscan.service scripts/lvm-vgchange.service scripts/blkdeactivate.sh scripts/blk_availability_init_red_hat scripts/blk_availability_systemd_red_hat.service scripts/cmirrord_init_red_hat scripts/com.redhat.lvmdbus1.service scripts/dm_event_systemd_red_hat.service scripts/dm_event_systemd_red_hat.socket scripts/lvm2_cmirrord_systemd_red_hat.service scripts/lvm2_lvmdbusd_systemd_red_hat.service scripts/lvm2_lvmpolld_init_red_hat scripts/lvm2_lvmpolld_systemd_red_hat.service scripts/lvm2_lvmpolld_systemd_red_hat.socket scripts/lvmlockd.service scripts/lvmlocks.service scripts/lvm2_monitoring_init_red_hat scripts/lvm2_monitoring_systemd_red_hat.service scripts/lvm2_tmpfiles_red_hat.conf scripts/lvmdump.sh scripts/Makefile test/Makefile tools/Makefile udev/Makefile" - - cat >confcache <<\_ACEOF - # This file is a shell script that caches the results of configure -@@ -14914,6 +15019,7 @@ do - "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; - "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; - "scripts/lvm2-pvscan.service") CONFIG_FILES="$CONFIG_FILES scripts/lvm2-pvscan.service" ;; -+ "scripts/lvm-vgchange.service") CONFIG_FILES="$CONFIG_FILES scripts/lvm-vgchange.service" ;; - "scripts/blkdeactivate.sh") CONFIG_FILES="$CONFIG_FILES scripts/blkdeactivate.sh" ;; - "scripts/blk_availability_init_red_hat") CONFIG_FILES="$CONFIG_FILES scripts/blk_availability_init_red_hat" ;; - "scripts/blk_availability_systemd_red_hat.service") CONFIG_FILES="$CONFIG_FILES scripts/blk_availability_systemd_red_hat.service" ;; diff --git a/include/configure.h.in b/include/configure.h.in -index 671d201..c680525 100644 +index 55d18bd..f3060bc 100644 --- a/include/configure.h.in +++ b/include/configure.h.in @@ -1,5 +1,8 @@ diff --git a/0008-add-dracut-files.patch b/0008-add-dracut-files.patch new file mode 100644 index 0000000..c096ed2 --- /dev/null +++ b/0008-add-dracut-files.patch @@ -0,0 +1,290 @@ +From 7dff68f6d02afb1174b13c36865d4000cf63aff7 Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Thu, 1 Apr 2021 12:08:58 -0500 +Subject: [PATCH 08/11] add dracut files + +pvscan-udev-initrd.sh is shell wrapper around the +pvscan command for use in the initrd lvm udev rule. +It finds the intersection of complete VG/LVs reported +by pvscan, and the VG/LVs specified on boot cmdline. +The resulting VG or LVs are printed as env-vars that +the udev rule can IMPORT, and pass to vgchange/lvchange. + +64-lvm.rules calls pvscan-udev-initrd.sh/pvscan to scan +the PV to check if any VG or LVs are complete given the +new device. The pvscan will only ever read the single +device triggering the uevent. If any VG or LVs are +complete, the udev rule uses systemd-run to run a +vgchange or lvchange command to activate the complete +VG or LVs. (Running vgchange or lvchange directly may +take longer than udev likes, so systemd-run --no-block +is used.) +--- + dracut/64-lvm.rules | 44 +++++++++++++++++ + dracut/module-setup.sh | 112 +++++++++++++++++++++++++++++++++++++++++++ + dracut/parse-lvm.sh | 18 +++++++ + dracut/pvscan-udev-initrd.sh | 57 ++++++++++++++++++++++ + 4 files changed, 231 insertions(+) + create mode 100644 dracut/64-lvm.rules + create mode 100755 dracut/module-setup.sh + create mode 100755 dracut/parse-lvm.sh + create mode 100755 dracut/pvscan-udev-initrd.sh + +diff --git a/dracut/64-lvm.rules b/dracut/64-lvm.rules +new file mode 100644 +index 0000000..174af1d +--- /dev/null ++++ b/dracut/64-lvm.rules +@@ -0,0 +1,44 @@ ++# Copyright 2008,2021 Red Hat, Inc. ++# ++# Jeremy Katz ++ ++SUBSYSTEM!="block", GOTO="lvm_end" ++ACTION!="add|change", GOTO="lvm_end" ++# Also don't process disks that are slated to be a multipath device ++ENV{DM_MULTIPATH_DEVICE_PATH}=="1", GOTO="lvm_end" ++KERNEL=="dm-[0-9]*", ACTION=="add", GOTO="lvm_end" ++ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end" ++ ++PROGRAM=="/bin/sh -c 'for i in $sys/$devpath/holders/dm-[0-9]*; do [ -e $$i ] && exit 0; done; exit 1;' ", \ ++ GOTO="lvm_end" ++ ++# pvscan-udev-initrd.sh is a wrapper that calls pvscan and prints ++# LVM_VG_NAME_COMPLETE='...' ++# LVM_LV_NAMES_COMPLETE='...' ++# if the given device completes a VG or LVs listed in ++# rd.lvm.vg or rd.lvm.lv ++# ++# If a VG or LVs are completed by the device, but are not ++# listed in rd.lvm.vg/lv, then they are not printed ++# (we don't want to activate VGs/LVs that are not specified.) ++# ++# If no VG or LVs are completed by the device, then ++# nothing is printed. ++# ++# LVs may be complete and activated before the VG is complete, ++# i.e. the entire VG is not necessary to activate LVs in it. ++# ++# If multiple LV names are completed from one device, ++# e.g. LVM_LV_NAMES_COMPLETE='vg/lv1 vg/lv2 vg/lv3' ++# they will be activated by one lvchange command. ++ ++IMPORT{program}="pvscan-udev-initrd.sh $env{DEVNAME}" ++ ++# systemd services are used to run vgchange/lvchange ++# because the lvm activation commands can run for longer ++# than udev will tolerate. ++ ++ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run --no-block --property DefaultDependencies=no /sbin/lvm vgchange -ay --yes --ignoremonitoring --poll n --sysinit $env{LVM_VG_NAME_COMPLETE}" ++ENV{LVM_LV_NAMES_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run --no-block --property DefaultDependencies=no /sbin/lvm lvchange -ay --yes -K --ignoremonitoring --poll n --sysinit $env{LVM_LV_NAMES_COMPLETE}" ++ ++LABEL="lvm_end" +diff --git a/dracut/module-setup.sh b/dracut/module-setup.sh +new file mode 100755 +index 0000000..51d9cd3 +--- /dev/null ++++ b/dracut/module-setup.sh +@@ -0,0 +1,112 @@ ++#!/bin/bash ++ ++# called by dracut ++check() { ++ # No point trying to support lvm if the binaries are missing ++ require_binaries lvm || return 1 ++ ++ [[ $hostonly ]] || [[ $mount_needs ]] && { ++ for fs in "${host_fs_types[@]}"; do ++ [[ $fs = LVM*_member ]] && return 0 ++ done ++ return 255 ++ } ++ ++ return 0 ++} ++ ++# called by dracut ++depends() { ++ # We depend on dm_mod being loaded ++ echo rootfs-block dm ++ return 0 ++} ++ ++# called by dracut ++cmdline() { ++ local _activated ++ declare -A _activated ++ ++ for dev in "${!host_fs_types[@]}"; do ++ [ -e /sys/block/${dev#/dev/}/dm/name ] || continue ++ [ -e /sys/block/${dev#/dev/}/dm/uuid ] || continue ++ uuid=$(/dev/null) ++ [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 1 ++ if ! [[ ${_activated[${DM_VG_NAME}/${DM_LV_NAME}]} ]]; then ++ printf " rd.lvm.lv=%s " "${DM_VG_NAME}/${DM_LV_NAME} " ++ _activated["${DM_VG_NAME}/${DM_LV_NAME}"]=1 ++ fi ++ done ++} ++ ++installkernel() { ++ hostonly='' instmods dm-snapshot ++} ++ ++# called by dracut ++install() { ++ local _i ++ ++ inst lvm ++ ++ if [[ $hostonly_cmdline == "yes" ]]; then ++ local _lvmconf=$(cmdline) ++ [[ $_lvmconf ]] && printf "%s\n" "$_lvmconf" >> "${initdir}/etc/cmdline.d/90lvm.conf" ++ fi ++ ++ inst_rules "$moddir/64-lvm.rules" ++ ++ if [[ $hostonly ]] || [[ $lvmconf = "yes" ]]; then ++ if [ -f $dracutsysrootdir/etc/lvm/lvm.conf ]; then ++ inst_simple -H /etc/lvm/lvm.conf ++ fi ++ ++ export LVM_SUPPRESS_FD_WARNINGS=1 ++ # Also install any files needed for LVM system id support. ++ if [ -f $dracutsysrootdir/etc/lvm/lvmlocal.conf ]; then ++ inst_simple -H /etc/lvm/lvmlocal.conf ++ fi ++ eval $(lvm dumpconfig global/system_id_source &>/dev/null) ++ if [ "$system_id_source" == "file" ]; then ++ eval $(lvm dumpconfig global/system_id_file) ++ if [ -f "$system_id_file" ]; then ++ inst_simple -H $system_id_file ++ fi ++ fi ++ unset LVM_SUPPRESS_FD_WARNINGS ++ fi ++ ++ inst_rules 11-dm-lvm.rules ++ ++ inst_script "$moddir/pvscan-udev-initrd.sh" /usr/lib/udev/pvscan-udev-initrd.sh ++ inst_hook cmdline 30 "$moddir/parse-lvm.sh" ++ ++ inst_libdir_file "libdevmapper-event-lvm*.so" ++ ++ if [[ $hostonly ]] && type -P lvs &>/dev/null; then ++ for dev in "${!host_fs_types[@]}"; do ++ [ -e /sys/block/${dev#/dev/}/dm/name ] || continue ++ dev=$(/dev/null) ++ [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || continue ++ case "$(lvs --noheadings -o segtype ${DM_VG_NAME} 2>/dev/null)" in ++ *thin*|*cache*|*era*) ++ inst_multiple -o thin_dump thin_restore thin_check thin_repair \ ++ cache_dump cache_restore cache_check cache_repair \ ++ era_check era_dump era_invalidate era_restore ++ break;; ++ esac ++ done ++ fi ++ ++ if ! [[ $hostonly ]]; then ++ inst_multiple -o thin_dump thin_restore thin_check thin_repair \ ++ cache_dump cache_restore cache_check cache_repair \ ++ era_check era_dump era_invalidate era_restore ++ fi ++ ++ dracut_need_initqueue ++} +diff --git a/dracut/parse-lvm.sh b/dracut/parse-lvm.sh +new file mode 100755 +index 0000000..8236050 +--- /dev/null ++++ b/dracut/parse-lvm.sh +@@ -0,0 +1,18 @@ ++#!/bin/sh ++ ++if [ -e /etc/lvm/lvm.conf ] && ! getargbool 1 rd.lvm.conf -d -n rd_NO_LVMCONF; then ++ rm -f -- /etc/lvm/lvm.conf ++fi ++ ++LV_DEVS="$(getargs rd.lvm.vg -d rd_LVM_VG=) $(getargs rd.lvm.lv -d rd_LVM_LV=)" ++ ++if ! getargbool 1 rd.lvm -d -n rd_NO_LVM \ ++ || ( [ -z "$LV_DEVS" ] && ! getargbool 0 rd.auto ); then ++ info "rd.lvm=0: removing LVM activation" ++ rm -f -- /etc/udev/rules.d/64-lvm*.rules ++else ++ for dev in $LV_DEVS; do ++ wait_for_dev -n "/dev/$dev" ++ done ++fi ++ +diff --git a/dracut/pvscan-udev-initrd.sh b/dracut/pvscan-udev-initrd.sh +new file mode 100755 +index 0000000..1743771 +--- /dev/null ++++ b/dracut/pvscan-udev-initrd.sh +@@ -0,0 +1,57 @@ ++#!/bin/sh ++ ++# pvscan wrapper called by initrd lvm udev rule to find the ++# intersection of complete VGs/LVs found by pvscan and the ++# requested VGs/LVs from the cmdline. ++# ++# Used in 64-lvm.rules as: ++# IMPORT{program}="pvscan-udev-initrd.sh $env{DEVNAME}" ++# ++# See /usr/lib/dracut/modules.d/90lvm/64-lvm.rules ++ ++dev=$1 ++ ++type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh ++ ++ ++VGS=$(getargs rd.lvm.vg -d rd_LVM_VG=) ++LVS=$(getargs rd.lvm.lv -d rd_LVM_LV=) ++ ++IFS=' ' ++ ++# pvscan will produce a single VG line, and one or more LV lines. ++# VG complete ++# VG incomplete ++# LV complete ++# LV incomplete ++# ++# LV names are printed as vgname/lvname. ++# We only care about the complete items. ++# Each pvscan will produce a single VG line, ++# and may produce zero, one or more LV lines. ++ ++PVSCAN=$(/sbin/lvm pvscan --cache --listlvs --checkcomplete --journal output --config 'global/event_activation=1' $dev) ++ ++read -r -a VGSARRAY <<< "$VGS" ++ ++for VG in "${VGSARRAY[@]}" ++do ++ if strstr "$PVSCAN" "VG $VG complete" ; then ++ echo LVM_VG_NAME_COMPLETE=\'"$VG"\' ++ fi ++done ++ ++# Combine all matching LVs into a single print containing them all, ++# e.g. LVM_LV_NAMES_COMPLETE='vg/lv1 vg/lv2' ++ ++read -r -a LVSARRAY <<< "$LVS" ++ ++echo -n LVM_LV_NAMES_COMPLETE=\' ++for LV in "${LVSARRAY[@]}" ++do ++ if strstr "$PVSCAN" "LV $LV complete" ; then ++ echo -n "$LV " ++ fi ++done ++echo \' ++ +-- +1.8.3.1 + diff --git a/0008-add-pvscan-udev-initrd.sh.patch b/0008-add-pvscan-udev-initrd.sh.patch deleted file mode 100644 index 3e01f6b..0000000 --- a/0008-add-pvscan-udev-initrd.sh.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 72abbe49a433d71ea1a50a88662f52f5b94e1639 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Thu, 1 Apr 2021 12:08:58 -0500 -Subject: [PATCH 08/10] add pvscan-udev-initrd.sh - -pvscan wrapper for use in the initrd lvm udev rule. -Finds the intersection of complete VG/LVs reported -by pvscan, and the VG/LVs specified on boot cmdline. -The resulting VG or LVs are printed as env-vars that -the udev rule can IMPORT, and pass to vgchange/lvchange. ---- - udev/pvscan-udev-initrd.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 57 insertions(+) - create mode 100644 udev/pvscan-udev-initrd.sh - -diff --git a/udev/pvscan-udev-initrd.sh b/udev/pvscan-udev-initrd.sh -new file mode 100644 -index 0000000..1743771 ---- /dev/null -+++ b/udev/pvscan-udev-initrd.sh -@@ -0,0 +1,57 @@ -+#!/bin/sh -+ -+# pvscan wrapper called by initrd lvm udev rule to find the -+# intersection of complete VGs/LVs found by pvscan and the -+# requested VGs/LVs from the cmdline. -+# -+# Used in 64-lvm.rules as: -+# IMPORT{program}="pvscan-udev-initrd.sh $env{DEVNAME}" -+# -+# See /usr/lib/dracut/modules.d/90lvm/64-lvm.rules -+ -+dev=$1 -+ -+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh -+ -+ -+VGS=$(getargs rd.lvm.vg -d rd_LVM_VG=) -+LVS=$(getargs rd.lvm.lv -d rd_LVM_LV=) -+ -+IFS=' ' -+ -+# pvscan will produce a single VG line, and one or more LV lines. -+# VG complete -+# VG incomplete -+# LV complete -+# LV incomplete -+# -+# LV names are printed as vgname/lvname. -+# We only care about the complete items. -+# Each pvscan will produce a single VG line, -+# and may produce zero, one or more LV lines. -+ -+PVSCAN=$(/sbin/lvm pvscan --cache --listlvs --checkcomplete --journal output --config 'global/event_activation=1' $dev) -+ -+read -r -a VGSARRAY <<< "$VGS" -+ -+for VG in "${VGSARRAY[@]}" -+do -+ if strstr "$PVSCAN" "VG $VG complete" ; then -+ echo LVM_VG_NAME_COMPLETE=\'"$VG"\' -+ fi -+done -+ -+# Combine all matching LVs into a single print containing them all, -+# e.g. LVM_LV_NAMES_COMPLETE='vg/lv1 vg/lv2' -+ -+read -r -a LVSARRAY <<< "$LVS" -+ -+echo -n LVM_LV_NAMES_COMPLETE=\' -+for LV in "${LVSARRAY[@]}" -+do -+ if strstr "$PVSCAN" "LV $LV complete" ; then -+ echo -n "$LV " -+ fi -+done -+echo \' -+ --- -1.8.3.1 - diff --git a/0009-lvmdbusd-Use-ID_FS_TYPE-UDev-property-in-udevwatch.patch b/0009-lvmdbusd-Use-ID_FS_TYPE-UDev-property-in-udevwatch.patch new file mode 100644 index 0000000..50437b7 --- /dev/null +++ b/0009-lvmdbusd-Use-ID_FS_TYPE-UDev-property-in-udevwatch.patch @@ -0,0 +1,31 @@ +From de86234888bea4b994fd49776915c28a4d7f02b5 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 2 Jun 2021 17:17:40 +0200 +Subject: [PATCH 09/11] lvmdbusd: Use ID_FS_TYPE UDev property in udevwatch + +'.ID_FS_TYPE_NEW' is a custom property added by an LVM UDev rule +which is now being removed and 'ID_FS_TYPE' has the same value. + +Signed-off-by: Vojtech Trefny +--- + daemons/lvmdbusd/udevwatch.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/daemons/lvmdbusd/udevwatch.py b/daemons/lvmdbusd/udevwatch.py +index b53b180..f9b3e4a 100644 +--- a/daemons/lvmdbusd/udevwatch.py ++++ b/daemons/lvmdbusd/udevwatch.py +@@ -52,8 +52,8 @@ def filter_event(action, device): + # when appropriate. + refresh = False + +- if '.ID_FS_TYPE_NEW' in device: +- fs_type_new = device['.ID_FS_TYPE_NEW'] ++ if 'ID_FS_TYPE' in device: ++ fs_type_new = device['ID_FS_TYPE'] + + if 'LVM' in fs_type_new: + refresh = True +-- +1.8.3.1 + diff --git a/0009-pvscan-don-t-get-info-from-udev.patch b/0009-pvscan-don-t-get-info-from-udev.patch deleted file mode 100644 index c95df4f..0000000 --- a/0009-pvscan-don-t-get-info-from-udev.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 936549a57ad174786c3bae629462166149515c99 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Fri, 9 Apr 2021 15:49:26 -0500 -Subject: [PATCH 09/10] pvscan: don't get info from udev - -don't use obtain_device_info_from_udev since udev -will repeatedly return errors, stalling a command. ---- - tools/pvscan.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/tools/pvscan.c b/tools/pvscan.c -index 3406de2..de18c04 100644 ---- a/tools/pvscan.c -+++ b/tools/pvscan.c -@@ -1848,6 +1848,17 @@ int pvscan_cache_cmd(struct cmd_context *cmd, int argc, char **argv) - return ECMD_PROCESSED; - } - -+ /* -+ * Don't ask udev for info since pvscan is running from udev. -+ * If a pvscan attempts to get dev info from udev, udev can -+ * repeatedly return errors about the dev not being initialized -+ * which will stall the pvscan. -+ * FIXME: lvm commands should be changed to request and use udev -+ * info if it's available, and if udev info is not immediately -+ * available the command should just continue without it. -+ */ -+ init_obtain_device_list_from_udev(0); -+ - if (arg_is_set(cmd, major_ARG) + arg_is_set(cmd, minor_ARG)) - devno_args = 1; - --- -1.8.3.1 - diff --git a/0010-udev-vgchange-skip-hints-and-keep-transient-service-.patch b/0010-udev-vgchange-skip-hints-and-keep-transient-service-.patch new file mode 100644 index 0000000..7c46421 --- /dev/null +++ b/0010-udev-vgchange-skip-hints-and-keep-transient-service-.patch @@ -0,0 +1,31 @@ +From d45b26023747c1da95e18753a45b31e47090aa40 Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Thu, 22 Jul 2021 13:27:35 -0500 +Subject: [PATCH 10/11] udev vgchange: skip hints and keep transient service + record + +Using hints with vgchange in the udev rule is not helpful because +repeated pvscans during startup are constantly invalidating hints. + +Use -r with systemd-run so that the transient service used to +run vgchange remains visible and can be inspected. +--- + udev/69-dm-lvm.rules.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/udev/69-dm-lvm.rules.in b/udev/69-dm-lvm.rules.in +index 03c8fbb..70f2b37 100644 +--- a/udev/69-dm-lvm.rules.in ++++ b/udev/69-dm-lvm.rules.in +@@ -80,7 +80,7 @@ ENV{SYSTEMD_READY}="1" + # it's better suited to appearing in the journal. + + IMPORT{program}="(LVM_EXEC)/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}" +-ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay $env{LVM_VG_NAME_COMPLETE}" ++ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run -r --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay --config devices/hints=none $env{LVM_VG_NAME_COMPLETE}" + GOTO="lvm_end" + + LABEL="lvm_end" +-- +1.8.3.1 + diff --git a/0011-make-generate.patch b/0011-make-generate.patch new file mode 100644 index 0000000..084ec5b --- /dev/null +++ b/0011-make-generate.patch @@ -0,0 +1,2505 @@ +From 6a223b0d855d8024248823e9c45f4675250f36fb Mon Sep 17 00:00:00 2001 +From: Marian Csontos +Date: Fri, 6 Aug 2021 13:23:11 +0200 +Subject: [PATCH 11/11] make: generate + +--- + conf/example.conf.in | 258 +++++++++++++++++++++++++++++-------------- + man/lvchange.8_pregen | 14 +++ + man/lvconvert.8_pregen | 14 +++ + man/lvcreate.8_pregen | 14 +++ + man/lvdisplay.8_pregen | 12 ++ + man/lvextend.8_pregen | 14 +++ + man/lvm-fullreport.8_pregen | 12 ++ + man/lvm-lvpoll.8_pregen | 12 ++ + man/lvmconfig.8_pregen | 12 ++ + man/lvmdevices.8_pregen | 14 +++ + man/lvmdiskscan.8_pregen | 12 ++ + man/lvreduce.8_pregen | 12 ++ + man/lvremove.8_pregen | 12 ++ + man/lvrename.8_pregen | 12 ++ + man/lvresize.8_pregen | 14 +++ + man/lvs.8_pregen | 12 ++ + man/lvscan.8_pregen | 12 ++ + man/pvchange.8_pregen | 12 ++ + man/pvck.8_pregen | 14 +++ + man/pvcreate.8_pregen | 12 ++ + man/pvdisplay.8_pregen | 12 ++ + man/pvmove.8_pregen | 12 ++ + man/pvremove.8_pregen | 12 ++ + man/pvresize.8_pregen | 12 ++ + man/pvs.8_pregen | 12 ++ + man/pvscan.8_pregen | 214 ++++++++++++++++++++++++++++++++++- + man/vgcfgbackup.8_pregen | 12 ++ + man/vgcfgrestore.8_pregen | 14 +++ + man/vgchange.8_pregen | 14 +++ + man/vgck.8_pregen | 12 ++ + man/vgconvert.8_pregen | 12 ++ + man/vgcreate.8_pregen | 12 ++ + man/vgdisplay.8_pregen | 12 ++ + man/vgexport.8_pregen | 12 ++ + man/vgextend.8_pregen | 12 ++ + man/vgimport.8_pregen | 12 ++ + man/vgimportclone.8_pregen | 12 ++ + man/vgimportdevices.8_pregen | 12 ++ + man/vgmerge.8_pregen | 12 ++ + man/vgmknodes.8_pregen | 12 ++ + man/vgreduce.8_pregen | 14 +++ + man/vgremove.8_pregen | 12 ++ + man/vgrename.8_pregen | 12 ++ + man/vgs.8_pregen | 12 ++ + man/vgscan.8_pregen | 12 ++ + man/vgsplit.8_pregen | 12 ++ + 46 files changed, 932 insertions(+), 88 deletions(-) + +diff --git a/conf/example.conf.in b/conf/example.conf.in +index 2dc6dd9..0a76c72 100644 +--- a/conf/example.conf.in ++++ b/conf/example.conf.in +@@ -33,15 +33,18 @@ config { + # any configuration mismatch is ignored and the default value is used + # without any warning (a message about the configuration key not being + # found is issued in verbose mode only). +- checks = 1 ++ # This configuration option has an automatic default value. ++ # checks = 1 + + # Configuration option config/abort_on_errors. + # Abort the LVM process if a configuration mismatch is found. +- abort_on_errors = 0 ++ # This configuration option has an automatic default value. ++ # abort_on_errors = 0 + + # Configuration option config/profile_dir. + # Directory where LVM looks for configuration profiles. +- profile_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_PROFILE_SUBDIR@" ++ # This configuration option has an automatic default value. ++ # profile_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_PROFILE_SUBDIR@" + } + + # Configuration section devices. +@@ -52,12 +55,14 @@ devices { + # Directory in which to create volume group device nodes. + # Commands also accept this as a prefix on volume group names. + # This configuration option is advanced. +- dir = "/dev" ++ # This configuration option has an automatic default value. ++ # dir = "/dev" + + # Configuration option devices/scan. + # Directories containing device nodes to use with LVM. + # This configuration option is advanced. +- scan = [ "/dev" ] ++ # This configuration option has an automatic default value. ++ # scan = [ "/dev" ] + + # Configuration option devices/obtain_device_list_from_udev. + # Obtain the list of available devices from udev. +@@ -67,14 +72,16 @@ devices { + # setting applies only to the udev-managed device directory; other + # directories will be scanned fully. LVM needs to be compiled with + # udev support for this setting to apply. +- obtain_device_list_from_udev = 0 ++ # This configuration option has an automatic default value. ++ # obtain_device_list_from_udev = 0 + + # Configuration option devices/external_device_info_source. + # Enable device information from udev. + # If set to "udev", lvm will supplement its own native device information + # with information from libudev. This can potentially improve the detection + # of MD component devices and multipath component devices. +- external_device_info_source = "none" ++ # This configuration option has an automatic default value. ++ # external_device_info_source = "none" + + # Configuration option devices/hints. + # Use a local file to remember which devices have PVs on them. +@@ -119,7 +126,7 @@ devices { + # be used, regardless of this setting, when the --devicesfile + # option is set to a specific file name. + # This configuration option has an automatic default value. +- # use_devicesfile = 0 ++ # use_devicesfile = 1 + + # Configuration option devices/devicesfile. + # The name of the system devices file, listing devices that LVM should use. +@@ -200,7 +207,8 @@ devices { + # Restrict device scanning to block devices appearing in sysfs. + # This is a quick way of filtering out block devices that are not + # present on the system. sysfs must be part of the kernel and mounted.) +- sysfs_scan = 1 ++ # This configuration option has an automatic default value. ++ # sysfs_scan = 1 + + # Configuration option devices/scan_lvs. + # Scan LVM LVs for layered PVs, allowing LVs to be used as PVs. +@@ -214,11 +222,19 @@ devices { + # use PVs that exist on LVs, and will not allow a PV to be created on + # an LV. The LVs are ignored using a built in device filter that + # identifies and excludes LVs. +- scan_lvs = 0 ++ # This configuration option has an automatic default value. ++ # scan_lvs = 0 + + # Configuration option devices/multipath_component_detection. + # Ignore devices that are components of DM multipath devices. +- multipath_component_detection = 1 ++ # This configuration option has an automatic default value. ++ # multipath_component_detection = 1 ++ ++ # Configuration option devices/multipath_wwids_file. ++ # The path to the multipath wwids file used for multipath component detection. ++ # Set this to an empty string to disable the use of the multipath wwids file. ++ # This configuration option has an automatic default value. ++ # multipath_wwids_file = "/etc/multipath/wwids" + + # Configuration option devices/multipath_wwids_file. + # The path to the multipath wwids file used for multipath component detection. +@@ -235,7 +251,8 @@ devices { + # In cases where the MD superblock is located at the end of the + # component devices, it is more difficult for LVM to consistently + # identify an MD component, see the md_component_checks setting. +- md_component_detection = 1 ++ # This configuration option has an automatic default value. ++ # md_component_detection = 1 + + # Configuration option devices/md_component_checks. + # The checks LVM should use to detect MD component devices. +@@ -259,7 +276,8 @@ devices { + # Ignore devices that are components of firmware RAID devices. + # LVM must use an external_device_info_source other than none for this + # detection to execute. +- fw_raid_component_detection = 0 ++ # This configuration option has an automatic default value. ++ # fw_raid_component_detection = 0 + + # Configuration option devices/md_chunk_alignment. + # Align the start of a PV data area with md device's stripe-width. +@@ -268,7 +286,8 @@ devices { + # with the value detected for this setting. + # This setting is overridden by data_alignment_detection, + # data_alignment, and the --dataalignment option. +- md_chunk_alignment = 1 ++ # This configuration option has an automatic default value. ++ # md_chunk_alignment = 1 + + # Configuration option devices/default_data_alignment. + # Align the start of a PV data area with this number of MiB. +@@ -291,7 +310,8 @@ devices { + # if they are not aligned with the value detected for this setting. + # This setting is overridden by data_alignment and the --dataalignment + # option. +- data_alignment_detection = 1 ++ # This configuration option has an automatic default value. ++ # data_alignment_detection = 1 + + # Configuration option devices/data_alignment. + # Align the start of a PV data area with this number of KiB. +@@ -299,7 +319,8 @@ devices { + # Set to 0 to disable, in which case default_data_alignment + # is used to align the first PE in units of MiB. + # This setting is overridden by the --dataalignment option. +- data_alignment = 0 ++ # This configuration option has an automatic default value. ++ # data_alignment = 0 + + # Configuration option devices/data_alignment_offset_detection. + # Shift the start of an aligned PV data area based on sysfs information. +@@ -310,13 +331,15 @@ devices { + # is the lowest aligned logical block, the 4KiB sectors start at + # LBA -1, and consequently sector 63 is aligned on a 4KiB boundary). + # This setting is overridden by the --dataalignmentoffset option. +- data_alignment_offset_detection = 1 ++ # This configuration option has an automatic default value. ++ # data_alignment_offset_detection = 1 + + # Configuration option devices/ignore_suspended_devices. + # Ignore DM devices that have I/O suspended while scanning devices. + # Otherwise, LVM waits for a suspended device to become accessible. + # This should only be needed in recovery situations. +- ignore_suspended_devices = 0 ++ # This configuration option has an automatic default value. ++ # ignore_suspended_devices = 0 + + # Configuration option devices/ignore_lvm_mirrors. + # Do not scan 'mirror' LVs to avoid possible deadlocks. +@@ -335,18 +358,21 @@ devices { + # a scan of the mirror's labels. The 'mirror' scanning problems do not + # apply to LVM RAID types like 'raid1' which handle failures in a + # different way, making them a better choice for VG stacking. +- ignore_lvm_mirrors = 1 ++ # This configuration option has an automatic default value. ++ # ignore_lvm_mirrors = 1 + + # Configuration option devices/require_restorefile_with_uuid. + # Allow use of pvcreate --uuid without requiring --restorefile. +- require_restorefile_with_uuid = 1 ++ # This configuration option has an automatic default value. ++ # require_restorefile_with_uuid = 1 + + # Configuration option devices/pv_min_size. + # Minimum size in KiB of block devices which can be used as PVs. + # In a clustered environment all nodes must use the same value. + # Any value smaller than 512KiB is ignored. The previous built-in + # value was 512. +- pv_min_size = 2048 ++ # This configuration option has an automatic default value. ++ # pv_min_size = 2048 + + # Configuration option devices/issue_discards. + # Issue discards to PVs that are no longer used by an LV. +@@ -359,7 +385,8 @@ devices { + # benefit from discards, but SSDs and thinly provisioned LUNs + # generally do. If enabled, discards will only be issued if both the + # storage and kernel provide support. +- issue_discards = 0 ++ # This configuration option has an automatic default value. ++ # issue_discards = 0 + + # Configuration option devices/allow_changes_with_duplicate_pvs. + # Allow VG modification while a PV appears on multiple devices. +@@ -372,13 +399,15 @@ devices { + # or activating LVs in it while a PV appears on multiple devices. + # Enabling this setting allows the VG to be used as usual even with + # uncertain devices. +- allow_changes_with_duplicate_pvs = 0 ++ # This configuration option has an automatic default value. ++ # allow_changes_with_duplicate_pvs = 0 + + # Configuration option devices/allow_mixed_block_sizes. + # Allow PVs in the same VG with different logical block sizes. + # When allowed, the user is responsible to ensure that an LV is + # using PVs with matching block sizes when necessary. +- allow_mixed_block_sizes = 0 ++ # This configuration option has an automatic default value. ++ # allow_mixed_block_sizes = 0 + } + + # Configuration section allocation. +@@ -410,7 +439,8 @@ allocation { + # policies to detect more situations where data can be grouped onto + # the same disks. This setting can be used to disable the changes + # and revert to the previous algorithm. +- maximise_cling = 1 ++ # This configuration option has an automatic default value. ++ # maximise_cling = 1 + + # Configuration option allocation/use_blkid_wiping. + # Use blkid to detect and erase existing signatures on new PVs and LVs. +@@ -420,7 +450,8 @@ allocation { + # code is currently able to recognize: MD device signatures, + # swap signature, and LUKS signatures. To see the list of signatures + # recognized by blkid, check the output of the 'blkid -k' command. +- use_blkid_wiping = @DEFAULT_USE_BLKID_WIPING@ ++ # This configuration option has an automatic default value. ++ # use_blkid_wiping = @DEFAULT_USE_BLKID_WIPING@ + + # Configuration option allocation/wipe_signatures_when_zeroing_new_lvs. + # Look for and erase any signatures while zeroing a new LV. +@@ -437,12 +468,14 @@ allocation { + # use_blkid_wiping.) Wiping each detected signature must be confirmed. + # When this setting is disabled, signatures on new LVs are not detected + # or erased unless the --wipesignatures option is used directly. +- wipe_signatures_when_zeroing_new_lvs = 1 ++ # This configuration option has an automatic default value. ++ # wipe_signatures_when_zeroing_new_lvs = 1 + + # Configuration option allocation/mirror_logs_require_separate_pvs. + # Mirror logs and images will always use different PVs. + # The default setting changed in version 2.02.85. +- mirror_logs_require_separate_pvs = 0 ++ # This configuration option has an automatic default value. ++ # mirror_logs_require_separate_pvs = 0 + + # Configuration option allocation/raid_stripe_all_devices. + # Stripe across all PVs when RAID stripes are not specified. +@@ -789,7 +822,8 @@ log { + + # Configuration option log/verbose. + # Controls the messages sent to stdout or stderr. +- verbose = 0 ++ # This configuration option has an automatic default value. ++ # verbose = 0 + + # Configuration option log/silent. + # Suppress all non-essential messages from stdout. +@@ -800,25 +834,37 @@ log { + # for syslog and lvm2_log_fn purposes. + # Any 'yes' or 'no' questions not overridden by other arguments are + # suppressed and default to 'no'. +- silent = 0 ++ # This configuration option has an automatic default value. ++ # silent = 0 + + # Configuration option log/syslog. + # Send log messages through syslog. +- syslog = 1 ++ # This configuration option has an automatic default value. ++ # syslog = 1 + + # Configuration option log/file. + # Write error and debug log messages to a file specified here. + # This configuration option does not have a default value defined. + ++ # Configuration option log/journal. ++ # Record lvm information in the systemd journal. ++ # command: record commands that are run. ++ # output: record default output from commands. ++ # debug: record debug messages from commands. ++ # This configuration option has an automatic default value. ++ # journal = [ ] ++ + # Configuration option log/overwrite. + # Overwrite the log file each time the program is run. +- overwrite = 0 ++ # This configuration option has an automatic default value. ++ # overwrite = 0 + + # Configuration option log/level. + # The level of log messages that are sent to the log file or syslog. + # There are 6 syslog-like log levels currently in use: 2 to 7 inclusive. + # 7 is the most verbose (LOG_DEBUG). +- level = 0 ++ # This configuration option has an automatic default value. ++ # level = 0 + + # Configuration option log/indent. + # Indent messages according to their severity. +@@ -827,7 +873,8 @@ log { + + # Configuration option log/command_names. + # Display the command name on each line of output. +- command_names = 0 ++ # This configuration option has an automatic default value. ++ # command_names = 0 + + # Configuration option log/prefix. + # A prefix to use before the log message text. +@@ -835,12 +882,14 @@ log { + # Two spaces allows you to see/grep the severity of each message. + # To make the messages look similar to the original LVM tools use: + # indent = 0, command_names = 1, prefix = " -- " +- prefix = " " ++ # This configuration option has an automatic default value. ++ # prefix = " " + + # Configuration option log/activation. + # Log messages during activation. + # Don't use this in low memory situations (can deadlock). +- activation = 0 ++ # This configuration option has an automatic default value. ++ # activation = 0 + + # Configuration option log/debug_classes. + # Select log messages by class. +@@ -848,7 +897,8 @@ log { + # debug output if the class is listed here. Classes currently + # available: memory, devices, io, activation, allocation, + # metadata, cache, locking, lvmpolld. Use "all" to see everything. +- debug_classes = [ "memory", "devices", "io", "activation", "allocation", "metadata", "cache", "locking", "lvmpolld", "dbus" ] ++ # This configuration option has an automatic default value. ++ # debug_classes = [ "memory", "devices", "io", "activation", "allocation", "metadata", "cache", "locking", "lvmpolld", "dbus" ] + + # Configuration option log/debug_file_fields. + # The fields included in debug output written to log file. +@@ -875,30 +925,36 @@ backup { + # Configuration option backup/backup. + # Maintain a backup of the current metadata configuration. + # Think very hard before turning this off! +- backup = 1 ++ # This configuration option has an automatic default value. ++ # backup = 1 + + # Configuration option backup/backup_dir. + # Location of the metadata backup files. + # Remember to back up this directory regularly! +- backup_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_BACKUP_SUBDIR@" ++ # This configuration option has an automatic default value. ++ # backup_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_BACKUP_SUBDIR@" + + # Configuration option backup/archive. + # Maintain an archive of old metadata configurations. + # Think very hard before turning this off. +- archive = 1 ++ # This configuration option has an automatic default value. ++ # archive = 1 + + # Configuration option backup/archive_dir. + # Location of the metdata archive files. + # Remember to back up this directory regularly! +- archive_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_ARCHIVE_SUBDIR@" ++ # This configuration option has an automatic default value. ++ # archive_dir = "@DEFAULT_SYS_DIR@/@DEFAULT_ARCHIVE_SUBDIR@" + + # Configuration option backup/retain_min. + # Minimum number of archives to keep. +- retain_min = 10 ++ # This configuration option has an automatic default value. ++ # retain_min = 10 + + # Configuration option backup/retain_days. + # Minimum number of days to keep archive files. +- retain_days = 30 ++ # This configuration option has an automatic default value. ++ # retain_days = 30 + } + + # Configuration section shell. +@@ -907,7 +963,8 @@ shell { + + # Configuration option shell/history_size. + # Number of lines of history to store in ~/.lvm_history. +- history_size = 100 ++ # This configuration option has an automatic default value. ++ # history_size = 100 + } + + # Configuration section global. +@@ -917,16 +974,19 @@ global { + # Configuration option global/umask. + # The file creation mask for any files and directories created. + # Interpreted as octal if the first digit is zero. +- umask = 077 ++ # This configuration option has an automatic default value. ++ # umask = 077 + + # Configuration option global/test. + # No on-disk metadata changes will be made in test mode. + # Equivalent to having the -t option on every command. +- test = 0 ++ # This configuration option has an automatic default value. ++ # test = 0 + + # Configuration option global/units. + # Default value for --units argument. +- units = "r" ++ # This configuration option has an automatic default value. ++ # units = "r" + + # Configuration option global/si_unit_consistency. + # Distinguish between powers of 1024 and 1000 bytes. +@@ -934,13 +994,15 @@ global { + # e.g. KiB, MiB, GiB, and powers of 1000 bytes, e.g. KB, MB, GB. + # If scripts depend on the old behaviour, disable this setting + # temporarily until they are updated. +- si_unit_consistency = 1 ++ # This configuration option has an automatic default value. ++ # si_unit_consistency = 1 + + # Configuration option global/suffix. + # Display unit suffix for sizes. + # This setting has no effect if the units are in human-readable form + # (global/units = "h") in which case the suffix is always displayed. +- suffix = 1 ++ # This configuration option has an automatic default value. ++ # suffix = 1 + + # Configuration option global/activation. + # Enable/disable communication with the kernel device-mapper. +@@ -948,26 +1010,31 @@ global { + # activating any logical volumes. If the device-mapper driver + # is not present in the kernel, disabling this should suppress + # the error messages. +- activation = 1 ++ # This configuration option has an automatic default value. ++ # activation = 1 + + # Configuration option global/proc. + # Location of proc filesystem. + # This configuration option is advanced. +- proc = "/proc" ++ # This configuration option has an automatic default value. ++ # proc = "/proc" + + # Configuration option global/etc. + # Location of /etc system configuration directory. +- etc = "@CONFDIR@" ++ # This configuration option has an automatic default value. ++ # etc = "@CONFDIR@" + + # Configuration option global/wait_for_locks. + # When disabled, fail if a lock request would block. +- wait_for_locks = 1 ++ # This configuration option has an automatic default value. ++ # wait_for_locks = 1 + + # Configuration option global/locking_dir. + # Directory to use for LVM command file locks. + # Local non-LV directory that holds file-based locks while commands are + # in progress. A directory like /tmp that may get wiped on reboot is OK. +- locking_dir = "@DEFAULT_LOCK_DIR@" ++ # This configuration option has an automatic default value. ++ # locking_dir = "@DEFAULT_LOCK_DIR@" + + # Configuration option global/prioritise_write_locks. + # Allow quicker VG write access during high volume read access. +@@ -976,7 +1043,8 @@ global { + # requests immediately, delay them to allow the read-write requests to + # be serviced. Without this setting, write access may be stalled by a + # high volume of read-only requests. This option only affects file locks. +- prioritise_write_locks = 1 ++ # This configuration option has an automatic default value. ++ # prioritise_write_locks = 1 + + # Configuration option global/library_dir. + # Search this directory first for shared libraries. +@@ -986,7 +1054,8 @@ global { + # Abort a command that encounters an internal error. + # Treat any internal errors as fatal errors, aborting the process that + # encountered the internal error. Please only enable for debugging. +- abort_on_internal_errors = 0 ++ # This configuration option has an automatic default value. ++ # abort_on_internal_errors = 0 + + # Configuration option global/metadata_read_only. + # No operations that change on-disk metadata are permitted. +@@ -994,7 +1063,8 @@ global { + # repair will still be allowed to proceed exactly as if the repair had + # been performed (except for the unchanged vg_seqno). Inappropriate + # use could mess up your system, so seek advice first! +- metadata_read_only = 0 ++ # This configuration option has an automatic default value. ++ # metadata_read_only = 0 + + # Configuration option global/mirror_segtype_default. + # The segment type used by the short mirroring option -m. +@@ -1020,7 +1090,8 @@ global { + # cluster-aware and cannot be used in a shared (active/active) + # fashion in a cluster. + # +- mirror_segtype_default = "@DEFAULT_MIRROR_SEGTYPE@" ++ # This configuration option has an automatic default value. ++ # mirror_segtype_default = "@DEFAULT_MIRROR_SEGTYPE@" + + # Configuration option global/support_mirrored_mirror_log. + # Enable mirrored 'mirror' log type for testing. +@@ -1050,7 +1121,8 @@ global { + # effectively creating a RAID 0+1 array. The layering is suboptimal + # in terms of providing redundancy and performance. + # +- raid10_segtype_default = "@DEFAULT_RAID10_SEGTYPE@" ++ # This configuration option has an automatic default value. ++ # raid10_segtype_default = "@DEFAULT_RAID10_SEGTYPE@" + + # Configuration option global/sparse_segtype_default. + # The segment type used by the -V -L combination. +@@ -1070,7 +1142,8 @@ global { + # metadata. It has better performance, especially when more data + # is used. It also supports full snapshots. + # +- sparse_segtype_default = "@DEFAULT_SPARSE_SEGTYPE@" ++ # This configuration option has an automatic default value. ++ # sparse_segtype_default = "@DEFAULT_SPARSE_SEGTYPE@" + + # Configuration option global/lvdisplay_shows_full_device_path. + # Enable this to reinstate the previous lvdisplay name format. +@@ -1105,7 +1178,8 @@ global { + # Applicable only if LVM is compiled with lockd support in which + # case there is also lvmlockd(8) man page available for more + # information. +- use_lvmlockd = 0 ++ # This configuration option has an automatic default value. ++ # use_lvmlockd = 0 + + # Configuration option global/lvmlockd_lock_retries. + # Retry lvmlockd lock requests this many times. +@@ -1278,15 +1352,18 @@ global { + # uname + # Set the system ID from the hostname (uname) of the system. + # System IDs beginning localhost are not permitted. ++ # appmachineid ++ # Use an LVM-specific derivation of the local machine-id as the ++ # system ID. See 'man machine-id'. + # machineid +- # Use the contents of the machine-id file to set the system ID. +- # Some systems create this file at installation time. +- # See 'man machine-id' and global/etc. ++ # Use the contents of the machine-id file to set the system ID ++ # (appmachineid is recommended.) + # file + # Use the contents of another file (system_id_file) to set the + # system ID. + # +- system_id_source = "none" ++ # This configuration option has an automatic default value. ++ # system_id_source = "none" + + # Configuration option global/system_id_file. + # The full path to the file containing a system ID. +@@ -1306,13 +1383,15 @@ global { + # and to use its own control group. When this option is disabled, LVM + # commands will supervise long running operations by forking themselves. + # Applicable only if LVM is compiled with lvmpolld support. +- use_lvmpolld = @DEFAULT_USE_LVMPOLLD@ ++ # This configuration option has an automatic default value. ++ # use_lvmpolld = @DEFAULT_USE_LVMPOLLD@ + + # Configuration option global/notify_dbus. + # Enable D-Bus notification from LVM commands. + # When enabled, an LVM command that changes PVs, changes VG metadata, + # or changes the activation state of an LV will send a notification. +- notify_dbus = 1 ++ # This configuration option has an automatic default value. ++ # notify_dbus = 1 + + # Configuration option global/io_memory_size. + # The amount of memory in KiB that LVM allocates to perform disk io. +@@ -1333,7 +1412,8 @@ activation { + # Useful for debugging problems with activation. Some of the checks may + # be expensive, so it's best to use this only when there seems to be a + # problem. +- checks = 0 ++ # This configuration option has an automatic default value. ++ # checks = 0 + + # Configuration option activation/udev_sync. + # Use udev notifications to synchronize udev and LVM. +@@ -1344,14 +1424,16 @@ activation { + # that ignore the devices LVM creates. If enabled when udev is not + # running, and LVM processes are waiting for udev, run the command + # 'dmsetup udevcomplete_all' to wake them up. +- udev_sync = 1 ++ # This configuration option has an automatic default value. ++ # udev_sync = 1 + + # Configuration option activation/udev_rules. + # Use udev rules to manage LV device nodes and symlinks. + # When disabled, LVM will manage the device nodes and symlinks for + # active LVs itself. Manual intervention may be required if this + # setting is changed while LVs are active. +- udev_rules = 1 ++ # This configuration option has an automatic default value. ++ # udev_rules = 1 + + # Configuration option activation/verify_udev_operations. + # Use extra checks in LVM to verify udev operations. +@@ -1366,7 +1448,8 @@ activation { + # If LV deactivation fails, LVM will retry for a few seconds before + # failing. This may happen because a process run from a quick udev rule + # temporarily opened the device. +- retry_deactivation = 1 ++ # This configuration option has an automatic default value. ++ # retry_deactivation = 1 + + # Configuration option activation/missing_stripe_filler. + # Method to fill missing stripes when activating an incomplete LV. +@@ -1377,7 +1460,8 @@ activation { + # other than 'error' with mirrored or snapshotted volumes is likely to + # result in data corruption. + # This configuration option is advanced. +- missing_stripe_filler = "error" ++ # This configuration option has an automatic default value. ++ # missing_stripe_filler = "error" + + # Configuration option activation/use_linear_target. + # Use the linear target to optimize single stripe LVs. +@@ -1499,7 +1583,8 @@ activation { + # The clean/dirty state of data is tracked for each region. + # The value is rounded down to a power of two if necessary, and + # is ignored if it is not a multiple of the machine memory page size. +- raid_region_size = 2048 ++ # This configuration option has an automatic default value. ++ # raid_region_size = 2048 + + # Configuration option activation/error_when_full. + # Return errors if a thin pool runs out of space. +@@ -1544,7 +1629,8 @@ activation { + # Attempt to use any extra physical volumes in the VG as spares and + # replace faulty devices. + # +- raid_fault_policy = "warn" ++ # This configuration option has an automatic default value. ++ # raid_fault_policy = "warn" + + # Configuration option activation/mirror_image_fault_policy. + # Defines how a device failure in a 'mirror' LV is handled. +@@ -1581,13 +1667,15 @@ activation { + # 'remove' if no suitable device and space can be allocated for the + # replacement. + # +- mirror_image_fault_policy = "remove" ++ # This configuration option has an automatic default value. ++ # mirror_image_fault_policy = "remove" + + # Configuration option activation/mirror_log_fault_policy. + # Defines how a device failure in a 'mirror' log LV is handled. + # The mirror_image_fault_policy description for mirrored LVs also + # applies to mirrored log LVs. +- mirror_log_fault_policy = "allocate" ++ # This configuration option has an automatic default value. ++ # mirror_log_fault_policy = "allocate" + + # Configuration option activation/snapshot_autoextend_threshold. + # Auto-extend a snapshot when its usage exceeds this percent. +@@ -1602,7 +1690,8 @@ activation { + # 840M, it is extended to 1.44G: + # snapshot_autoextend_threshold = 70 + # +- snapshot_autoextend_threshold = 100 ++ # This configuration option has an automatic default value. ++ # snapshot_autoextend_threshold = 100 + + # Configuration option activation/snapshot_autoextend_percent. + # Auto-extending a snapshot adds this percent extra space. +@@ -1615,7 +1704,8 @@ activation { + # 840M, it is extended to 1.44G: + # snapshot_autoextend_percent = 20 + # +- snapshot_autoextend_percent = 20 ++ # This configuration option has an automatic default value. ++ # snapshot_autoextend_percent = 20 + + # Configuration option activation/thin_pool_autoextend_threshold. + # Auto-extend a thin pool when its usage exceeds this percent. +@@ -1630,7 +1720,8 @@ activation { + # 840M, it is extended to 1.44G: + # thin_pool_autoextend_threshold = 70 + # +- thin_pool_autoextend_threshold = 100 ++ # This configuration option has an automatic default value. ++ # thin_pool_autoextend_threshold = 100 + + # Configuration option activation/thin_pool_autoextend_percent. + # Auto-extending a thin pool adds this percent extra space. +@@ -1643,7 +1734,8 @@ activation { + # 840M, it is extended to 1.44G: + # thin_pool_autoextend_percent = 20 + # +- thin_pool_autoextend_percent = 20 ++ # This configuration option has an automatic default value. ++ # thin_pool_autoextend_percent = 20 + + # Configuration option activation/vdo_pool_autoextend_threshold. + # Auto-extend a VDO pool when its usage exceeds this percent. +@@ -1702,7 +1794,8 @@ activation { + # Monitor LVs that are activated. + # The --ignoremonitoring option overrides this setting. + # When enabled, LVM will ask dmeventd to monitor activated LVs. +- monitoring = 1 ++ # This configuration option has an automatic default value. ++ # monitoring = 1 + + # Configuration option activation/polling_interval. + # Check pvmove or lvconvert progress at this interval (seconds). +@@ -1744,7 +1837,8 @@ activation { + # This setting should not normally be used, but may sometimes + # assist with data recovery. + # +- activation_mode = "degraded" ++ # This configuration option has an automatic default value. ++ # activation_mode = "degraded" + + # Configuration option activation/lock_start_list. + # Locking is started only for VGs selected by this list. +diff --git a/man/lvchange.8_pregen b/man/lvchange.8_pregen +index 3cfa733..2422465 100644 +--- a/man/lvchange.8_pregen ++++ b/man/lvchange.8_pregen +@@ -67,6 +67,8 @@ lvchange \(em Change the attributes of logical volume(s) + .br + \fB--ignoremonitoring\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -419,6 +421,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -674,6 +678,16 @@ Do not interact with dmeventd unless --monitor is specified. + Do not use this if dmeventd is already monitoring a device. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvconvert.8_pregen b/man/lvconvert.8_pregen +index 4fafe5d..f5f2bfd 100644 +--- a/man/lvconvert.8_pregen ++++ b/man/lvconvert.8_pregen +@@ -67,6 +67,8 @@ lvconvert \(em Change logical volume layout + .br + \fB-i\fP|\fB--interval\fP \fINumber\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -963,6 +965,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -1183,6 +1187,16 @@ Display help text. + Report progress at regular intervals. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvcreate.8_pregen b/man/lvcreate.8_pregen +index b642ad0..513ef05 100644 +--- a/man/lvcreate.8_pregen ++++ b/man/lvcreate.8_pregen +@@ -75,6 +75,8 @@ lvcreate \(em Create a logical volume + .br + \fB--ignoremonitoring\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -805,6 +807,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -1075,6 +1079,16 @@ Do not interact with dmeventd unless --monitor is specified. + Do not use this if dmeventd is already monitoring a device. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvdisplay.8_pregen b/man/lvdisplay.8_pregen +index 8ff34bc..011857c 100644 +--- a/man/lvdisplay.8_pregen ++++ b/man/lvdisplay.8_pregen +@@ -110,6 +110,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -228,6 +230,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvextend.8_pregen b/man/lvextend.8_pregen +index fa0aec6..1409ada 100644 +--- a/man/lvextend.8_pregen ++++ b/man/lvextend.8_pregen +@@ -39,6 +39,8 @@ lvextend \(em Add space to a logical volume + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -251,6 +253,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -373,6 +377,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvm-fullreport.8_pregen b/man/lvm-fullreport.8_pregen +index 399d4ff..a93e9cf 100644 +--- a/man/lvm-fullreport.8_pregen ++++ b/man/lvm-fullreport.8_pregen +@@ -106,6 +106,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -202,6 +204,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvm-lvpoll.8_pregen b/man/lvm-lvpoll.8_pregen +index cf18ebe..4c6cd30 100644 +--- a/man/lvm-lvpoll.8_pregen ++++ b/man/lvm-lvpoll.8_pregen +@@ -62,6 +62,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -147,6 +149,16 @@ Display help text. + Report progress at regular intervals. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvmconfig.8_pregen b/man/lvmconfig.8_pregen +index 6cdb577..bcbe3e6 100644 +--- a/man/lvmconfig.8_pregen ++++ b/man/lvmconfig.8_pregen +@@ -103,6 +103,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -204,6 +206,16 @@ and \fBdiff\fP types include unsupported settings in their output by default, + all the other types ignore unsupported settings. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB-l\fP|\fB--list\fP + .br + List config settings with summarizing comment. This is the same as using +diff --git a/man/lvmdevices.8_pregen b/man/lvmdevices.8_pregen +index e581a8d..0506991 100644 +--- a/man/lvmdevices.8_pregen ++++ b/man/lvmdevices.8_pregen +@@ -38,6 +38,8 @@ lvmdevices \(em Manage the devices file + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -284,6 +286,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -379,6 +383,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvmdiskscan.8_pregen b/man/lvmdiskscan.8_pregen +index 5f31e81..0f1f0f5 100644 +--- a/man/lvmdiskscan.8_pregen ++++ b/man/lvmdiskscan.8_pregen +@@ -60,6 +60,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -123,6 +125,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvreduce.8_pregen b/man/lvreduce.8_pregen +index 0a659e1..a5a9e8b 100644 +--- a/man/lvreduce.8_pregen ++++ b/man/lvreduce.8_pregen +@@ -82,6 +82,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -179,6 +181,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvremove.8_pregen b/man/lvremove.8_pregen +index a5ed826..aa3dd78 100644 +--- a/man/lvremove.8_pregen ++++ b/man/lvremove.8_pregen +@@ -88,6 +88,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -163,6 +165,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvrename.8_pregen b/man/lvrename.8_pregen +index 5b5975f..76702e8 100644 +--- a/man/lvrename.8_pregen ++++ b/man/lvrename.8_pregen +@@ -72,6 +72,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -141,6 +143,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvresize.8_pregen b/man/lvresize.8_pregen +index 36c1760..a9dea81 100644 +--- a/man/lvresize.8_pregen ++++ b/man/lvresize.8_pregen +@@ -39,6 +39,8 @@ lvresize \(em Resize a logical volume + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -209,6 +211,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -331,6 +335,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvs.8_pregen b/man/lvs.8_pregen +index d822347..5207a32 100644 +--- a/man/lvs.8_pregen ++++ b/man/lvs.8_pregen +@@ -106,6 +106,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -212,6 +214,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/lvscan.8_pregen b/man/lvscan.8_pregen +index 40438a7..fa318ef 100644 +--- a/man/lvscan.8_pregen ++++ b/man/lvscan.8_pregen +@@ -65,6 +65,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -146,6 +148,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvchange.8_pregen b/man/pvchange.8_pregen +index 577352d..ca3c0f3 100644 +--- a/man/pvchange.8_pregen ++++ b/man/pvchange.8_pregen +@@ -109,6 +109,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -206,6 +208,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvck.8_pregen b/man/pvck.8_pregen +index 6e55916..76f4144 100644 +--- a/man/pvck.8_pregen ++++ b/man/pvck.8_pregen +@@ -33,6 +33,8 @@ pvck \(em Check metadata on physical volumes + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--labelsector\fP \fINumber\fP + .br + \fB--lockopt\fP \fIString\fP +@@ -305,6 +307,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -389,6 +393,16 @@ Metadata file to read or write. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--labelsector\fP \fINumber\fP + .br + By default the PV is labelled with an LVM2 identifier in its second +diff --git a/man/pvcreate.8_pregen b/man/pvcreate.8_pregen +index 26e5141..9fb1106 100644 +--- a/man/pvcreate.8_pregen ++++ b/man/pvcreate.8_pregen +@@ -158,6 +158,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -256,6 +258,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--labelsector\fP \fINumber\fP + .br + By default the PV is labelled with an LVM2 identifier in its second +diff --git a/man/pvdisplay.8_pregen b/man/pvdisplay.8_pregen +index ff5d9f5..346b97d 100644 +--- a/man/pvdisplay.8_pregen ++++ b/man/pvdisplay.8_pregen +@@ -108,6 +108,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -218,6 +220,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvmove.8_pregen b/man/pvmove.8_pregen +index a764ed9..2ec1b59 100644 +--- a/man/pvmove.8_pregen ++++ b/man/pvmove.8_pregen +@@ -112,6 +112,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -232,6 +234,16 @@ Display help text. + Report progress at regular intervals. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvremove.8_pregen b/man/pvremove.8_pregen +index b34f2a0..6ca29f5 100644 +--- a/man/pvremove.8_pregen ++++ b/man/pvremove.8_pregen +@@ -61,6 +61,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -130,6 +132,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvresize.8_pregen b/man/pvresize.8_pregen +index ea309b3..a94e0e5 100644 +--- a/man/pvresize.8_pregen ++++ b/man/pvresize.8_pregen +@@ -56,6 +56,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -119,6 +121,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvs.8_pregen b/man/pvs.8_pregen +index 08b5600..00c501c 100644 +--- a/man/pvs.8_pregen ++++ b/man/pvs.8_pregen +@@ -104,6 +104,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -202,6 +204,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/pvscan.8_pregen b/man/pvscan.8_pregen +index 8025d6c..ec4189e 100644 +--- a/man/pvscan.8_pregen ++++ b/man/pvscan.8_pregen +@@ -6,12 +6,80 @@ pvscan \(em List all physical volumes + . + .SH SYNOPSIS + . +-\fBpvscan\fP \fIoption_args\fP ++\fBpvscan\fP \fIoption_args\fP \fIposition_args\fP + .br + [ \fIoption_args\fP ] + .br + [ \fIposition_args\fP ] + .br ++.P ++.ad l ++ \fB-a\fP|\fB--activate\fP \fBy\fP|\fBn\fP|\fBay\fP ++.br ++ \fB--cache\fP ++.br ++ \fB--checkcomplete\fP ++.br ++ \fB--commandprofile\fP \fIString\fP ++.br ++ \fB--config\fP \fIString\fP ++.br ++ \fB-d\fP|\fB--debug\fP ++.br ++ \fB--devices\fP \fIPV\fP ++.br ++ \fB--devicesfile\fP \fIString\fP ++.br ++ \fB--driverloaded\fP \fBy\fP|\fBn\fP ++.br ++ \fB-e\fP|\fB--exported\fP ++.br ++ \fB-h\fP|\fB--help\fP ++.br ++ \fB--ignorelockingfailure\fP ++.br ++ \fB--journal\fP \fIString\fP ++.br ++ \fB--listlvs\fP ++.br ++ \fB--listvg\fP ++.br ++ \fB--lockopt\fP \fIString\fP ++.br ++ \fB--longhelp\fP ++.br ++ \fB-j\fP|\fB--major\fP \fINumber\fP ++.br ++ \fB--minor\fP \fINumber\fP ++.br ++ \fB--nolocking\fP ++.br ++ \fB--noudevsync\fP ++.br ++ \fB-n\fP|\fB--novolumegroup\fP ++.br ++ \fB--profile\fP \fIString\fP ++.br ++ \fB-q\fP|\fB--quiet\fP ++.br ++ \fB--reportformat\fP \fBbasic\fP|\fBjson\fP ++.br ++ \fB-s\fP|\fB--short\fP ++.br ++ \fB-t\fP|\fB--test\fP ++.br ++ \fB--udevoutput\fP ++.br ++ \fB-u\fP|\fB--uuid\fP ++.br ++ \fB-v\fP|\fB--verbose\fP ++.br ++ \fB--version\fP ++.br ++ \fB--vgonline\fP ++.br ++ \fB-y\fP|\fB--yes\fP ++.ad b + . + .SH DESCRIPTION + . +@@ -92,21 +160,29 @@ Display PV information. + .br + [ \fB-u\fP|\fB--uuid\fP ] + .br ++[ \fB--ignorelockingfailure\fP ] ++.br ++[ \fB--reportformat\fP \fBbasic\fP|\fBjson\fP ] ++.br + [ COMMON_OPTIONS ] + .ad b + .RE + .P +-Autoactivate a VG when all PVs are online. ++\(em ++.P ++Record that a PV is online or offline. + .br + .P + \fBpvscan\fP \fB--cache\fP + .br + .RS 4 + .ad l +-[ \fB-a\fP|\fB--activate\fP \fBay\fP ] +-.br + [ \fB-j\fP|\fB--major\fP \fINumber\fP ] + .br ++[ \fB--ignorelockingfailure\fP ] ++.br ++[ \fB--reportformat\fP \fBbasic\fP|\fBjson\fP ] ++.br + [ \fB--minor\fP \fINumber\fP ] + .br + [ \fB--noudevsync\fP ] +@@ -118,16 +194,100 @@ Autoactivate a VG when all PVs are online. + [ \fIString\fP|\fIPV\fP ... ] + .RE + .P +-Common options for command: +-. ++\(em ++.P ++Record that a PV is online and autoactivate the VG if complete. ++.br ++.P ++\fBpvscan\fP \fB--cache\fP \fB-a\fP|\fB--activate\fP \fBay\fP ++.br + .RS 4 + .ad l ++[ \fB-j\fP|\fB--major\fP \fINumber\fP ] ++.br + [ \fB--ignorelockingfailure\fP ] + .br + [ \fB--reportformat\fP \fBbasic\fP|\fBjson\fP ] ++.br ++[ \fB--minor\fP \fINumber\fP ] ++.br ++[ \fB--noudevsync\fP ] ++.br ++[ COMMON_OPTIONS ] ++.ad b ++.RE ++.RS 4 ++[ \fIString\fP|\fIPV\fP ... ] ++.RE ++.P ++\(em ++.P ++Record that a PV is online and list the VG using the PV. ++.br ++.P ++\fBpvscan\fP \fB--cache\fP \fB--listvg\fP \fIPV\fP ++.br ++.RS 4 ++.ad l ++[ \fB--ignorelockingfailure\fP ] ++.br ++[ \fB--checkcomplete\fP ] ++.br ++[ \fB--vgonline\fP ] ++.br ++[ \fB--udevoutput\fP ] ++.br ++[ COMMON_OPTIONS ] + .ad b + .RE + .P ++\(em ++.P ++Record that a PV is online and list LVs using the PV. ++.br ++.P ++\fBpvscan\fP \fB--cache\fP \fB--listlvs\fP \fIPV\fP ++.br ++.RS 4 ++.ad l ++[ \fB--ignorelockingfailure\fP ] ++.br ++[ \fB--checkcomplete\fP ] ++.br ++[ \fB--vgonline\fP ] ++.br ++[ COMMON_OPTIONS ] ++.ad b ++.RE ++.P ++\(em ++.P ++List LVs using the PV. ++.br ++.P ++\fBpvscan\fP \fB--listlvs\fP \fIPV\fP ++.br ++.RS 4 ++.ad l ++[ COMMON_OPTIONS ] ++.ad b ++.RE ++.P ++\(em ++.P ++List the VG using the PV. ++.br ++.P ++\fBpvscan\fP \fB--listvg\fP \fIPV\fP ++.br ++.RS 4 ++.ad l ++[ COMMON_OPTIONS ] ++.ad b ++.RE ++.P ++\(em ++.P + Common options for lvm: + . + .RS 4 +@@ -154,6 +314,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -181,6 +343,15 @@ Auto-activate LVs in a VG when the PVs scanned have completed the VG. + Scan one or more devices and record that they are online. + . + .HP ++\fB--checkcomplete\fP ++.br ++Check if all the devices used by a VG or LV are present, ++and print "complete" or "incomplete" for each listed ++VG or LV. This option is used as a part of event-based ++autoactivation, so pvscan will do nothing if this option ++is set and event_activation=0 in the config settings. ++. ++.HP + \fB--commandprofile\fP \fIString\fP + .br + The command profile to use for command configuration. +@@ -239,6 +410,26 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP ++\fB--listlvs\fP ++.br ++Print a list of LVs that use the device. ++. ++.HP ++\fB--listvg\fP ++.br ++Print the VG that uses the device. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +@@ -314,6 +505,11 @@ error messages in multi-stage operations if a tool relies on reading + back metadata it believes has changed but hasn't. + . + .HP ++\fB--udevoutput\fP ++.br ++Command output is modified to be imported from a udev rule. ++. ++.HP + \fB-u\fP|\fB--uuid\fP + .br + Show UUIDs in addition to device names. +@@ -330,6 +526,12 @@ of messages sent to stdout and stderr. + Display version information. + . + .HP ++\fB--vgonline\fP ++.br ++The first command to see a complete VG will report it uniquely. ++Other commands to see the complete VG will report it differently. ++. ++.HP + \fB-y\fP|\fB--yes\fP + .br + Do not prompt for confirmation interactively but always assume the +diff --git a/man/vgcfgbackup.8_pregen b/man/vgcfgbackup.8_pregen +index ce71025..34690ef 100644 +--- a/man/vgcfgbackup.8_pregen ++++ b/man/vgcfgbackup.8_pregen +@@ -81,6 +81,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -163,6 +165,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgcfgrestore.8_pregen b/man/vgcfgrestore.8_pregen +index 8416267..54f1d45 100644 +--- a/man/vgcfgrestore.8_pregen ++++ b/man/vgcfgrestore.8_pregen +@@ -32,6 +32,8 @@ vgcfgrestore \(em Restore volume group configuration + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB-l\fP|\fB--list\fP + .br + \fB--lockopt\fP \fIString\fP +@@ -162,6 +164,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -240,6 +244,16 @@ thin pool kernel metadata precisely. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB-l\fP|\fB--list\fP + .br + List metadata backup and archive files pertaining to the VG. +diff --git a/man/vgchange.8_pregen b/man/vgchange.8_pregen +index 31fc458..c2324d3 100644 +--- a/man/vgchange.8_pregen ++++ b/man/vgchange.8_pregen +@@ -53,6 +53,8 @@ vgchange \(em Change volume group attributes + .br + \fB--ignoremonitoring\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--lockstart\fP +@@ -419,6 +421,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -597,6 +601,16 @@ Do not interact with dmeventd unless --monitor is specified. + Do not use this if dmeventd is already monitoring a device. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgck.8_pregen b/man/vgck.8_pregen +index ae31242..6295e44 100644 +--- a/man/vgck.8_pregen ++++ b/man/vgck.8_pregen +@@ -72,6 +72,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -135,6 +137,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgconvert.8_pregen b/man/vgconvert.8_pregen +index d18e7af..2665fe6 100644 +--- a/man/vgconvert.8_pregen ++++ b/man/vgconvert.8_pregen +@@ -67,6 +67,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -151,6 +153,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--labelsector\fP \fINumber\fP + .br + By default the PV is labelled with an LVM2 identifier in its second +diff --git a/man/vgcreate.8_pregen b/man/vgcreate.8_pregen +index 7e357a5..a774575 100644 +--- a/man/vgcreate.8_pregen ++++ b/man/vgcreate.8_pregen +@@ -107,6 +107,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -233,6 +235,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--labelsector\fP \fINumber\fP + .br + By default the PV is labelled with an LVM2 identifier in its second +diff --git a/man/vgdisplay.8_pregen b/man/vgdisplay.8_pregen +index 467f745..4f7ddf5 100644 +--- a/man/vgdisplay.8_pregen ++++ b/man/vgdisplay.8_pregen +@@ -105,6 +105,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -215,6 +217,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgexport.8_pregen b/man/vgexport.8_pregen +index 0e6e0b1..5c39c8d 100644 +--- a/man/vgexport.8_pregen ++++ b/man/vgexport.8_pregen +@@ -93,6 +93,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -160,6 +162,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgextend.8_pregen b/man/vgextend.8_pregen +index e5e01c4..b0d20f6 100644 +--- a/man/vgextend.8_pregen ++++ b/man/vgextend.8_pregen +@@ -85,6 +85,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -174,6 +176,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--labelsector\fP \fINumber\fP + .br + By default the PV is labelled with an LVM2 identifier in its second +diff --git a/man/vgimport.8_pregen b/man/vgimport.8_pregen +index c0b815b..ff242cf 100644 +--- a/man/vgimport.8_pregen ++++ b/man/vgimport.8_pregen +@@ -81,6 +81,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -155,6 +157,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgimportclone.8_pregen b/man/vgimportclone.8_pregen +index ee9bbe6..e78d1b2 100644 +--- a/man/vgimportclone.8_pregen ++++ b/man/vgimportclone.8_pregen +@@ -62,6 +62,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -145,6 +147,16 @@ will not be changed (nor will their associated PVs). + Add devices to the devices file. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgimportdevices.8_pregen b/man/vgimportdevices.8_pregen +index 364ef52..db6b597 100644 +--- a/man/vgimportdevices.8_pregen ++++ b/man/vgimportdevices.8_pregen +@@ -86,6 +86,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -159,6 +161,16 @@ See \fBlvmsystemid\fP(7) for more information about foreign VGs. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgmerge.8_pregen b/man/vgmerge.8_pregen +index e229218..588d2ec 100644 +--- a/man/vgmerge.8_pregen ++++ b/man/vgmerge.8_pregen +@@ -59,6 +59,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -128,6 +130,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB-l\fP|\fB--list\fP + .br + Display merged destination VG like vgdisplay -v. +diff --git a/man/vgmknodes.8_pregen b/man/vgmknodes.8_pregen +index 10f2359..df40528 100644 +--- a/man/vgmknodes.8_pregen ++++ b/man/vgmknodes.8_pregen +@@ -66,6 +66,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -135,6 +137,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgreduce.8_pregen b/man/vgreduce.8_pregen +index 1509e4b..0fd4c5e 100644 +--- a/man/vgreduce.8_pregen ++++ b/man/vgreduce.8_pregen +@@ -32,6 +32,8 @@ vgreduce \(em Remove physical volume(s) from a volume group + .br + \fB-h\fP|\fB--help\fP + .br ++ \fB--journal\fP \fIString\fP ++.br + \fB--lockopt\fP \fIString\fP + .br + \fB--longhelp\fP +@@ -142,6 +144,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -222,6 +226,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgremove.8_pregen b/man/vgremove.8_pregen +index cf5c48c..e4b5a02 100644 +--- a/man/vgremove.8_pregen ++++ b/man/vgremove.8_pregen +@@ -67,6 +67,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -136,6 +138,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgrename.8_pregen b/man/vgrename.8_pregen +index 24ff247..f09bfd5 100644 +--- a/man/vgrename.8_pregen ++++ b/man/vgrename.8_pregen +@@ -85,6 +85,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -160,6 +162,16 @@ Use with extreme caution. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgs.8_pregen b/man/vgs.8_pregen +index ffb4ddc..817bea5 100644 +--- a/man/vgs.8_pregen ++++ b/man/vgs.8_pregen +@@ -102,6 +102,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -199,6 +201,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgscan.8_pregen b/man/vgscan.8_pregen +index 959e161..86b7bc6 100644 +--- a/man/vgscan.8_pregen ++++ b/man/vgscan.8_pregen +@@ -59,6 +59,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -128,6 +130,16 @@ Allows a command to continue with read-only metadata + operations after locking failures. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +diff --git a/man/vgsplit.8_pregen b/man/vgsplit.8_pregen +index 8a0ae59..c32fc57 100644 +--- a/man/vgsplit.8_pregen ++++ b/man/vgsplit.8_pregen +@@ -102,6 +102,8 @@ Common options for lvm: + .br + [ \fB--driverloaded\fP \fBy\fP|\fBn\fP ] + .br ++[ \fB--journal\fP \fIString\fP ] ++.br + [ \fB--lockopt\fP \fIString\fP ] + .br + [ \fB--longhelp\fP ] +@@ -196,6 +198,16 @@ For testing and debugging. + Display help text. + . + .HP ++\fB--journal\fP \fIString\fP ++.br ++Record information in the systemd journal. ++This information is in addition to information ++enabled by the lvm.conf log/journal setting. ++command: record information about the command. ++output: record the default command output. ++debug: record full command debugging. ++. ++.HP + \fB--lockopt\fP \fIString\fP + .br + Used to pass options for special cases to lvmlockd. +-- +1.8.3.1 + diff --git a/0012-test-Fix-system_id-test.patch b/0012-test-Fix-system_id-test.patch new file mode 100644 index 0000000..06638e8 --- /dev/null +++ b/0012-test-Fix-system_id-test.patch @@ -0,0 +1,25 @@ +From 929e36ebfe991e01d6b341c5c8b4e6ad61cb26e2 Mon Sep 17 00:00:00 2001 +From: Marian Csontos +Date: Wed, 11 Aug 2021 19:19:19 +0200 +Subject: [PATCH] test: Fix system_id test + +--- + test/shell/system_id.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/shell/system_id.sh b/test/shell/system_id.sh +index 8b5638a..4dc167d 100644 +--- a/test/shell/system_id.sh ++++ b/test/shell/system_id.sh +@@ -38,7 +38,7 @@ check vg_field $vg1 systemid "$SID" + vgremove $vg1 + + # FIXME - print 'life' config data +-eval "$(lvmconfig global/etc 2>/dev/null || lvmconfig --type default global/etc)" ++eval "$({ lvmconfig global/etc 2>/dev/null || lvmconfig --type default global/etc; } | sed 's/^\s*#\s*//')" + + ## machineid + if [ -e "$etc/machine-id" ]; then +-- +1.8.3.1 + diff --git a/LVM2.2.03.12.tgz.asc b/LVM2.2.03.12.tgz.asc deleted file mode 100644 index 0830b12..0000000 --- a/LVM2.2.03.12.tgz.asc +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.22 (GNU/Linux) - -iQIcBAABAgAGBQJgla2zAAoJELkRJDHlCQOfqvYP/j1wFtzE+dX8NmNpMRsS53qh -7AwkYZH0h6VJfzXc2o7jt7Xfytj2zNzq9ZD+HPLPiQg5M2Aa2NlHwk3tIzCAVk5t -LA3GKM4GT8PL/gS2uYaYAzkKW5NWd9cAItkWGRaydgqonwq5ZVekKeSurpfzwp2F -lE+iVclkmerZqGwQriV3Z1alLdm6h0UbkfRemaD8mKA+1IHFeG6Tq/lZEGvjkXL3 -IlTZfGF5Ddp2ZJmiIyQiYymiFWhS/XUNrXyVJlAysjtBuWEiywGSoDpf+GkMNTVg -jYmW0wvW5TxGi8yjD2wHK4turEhDyWdHftIaa21v7PD+DAHc5Vhr6QlcCCVb/s00 -qSrZaMZJ4RGCnEWf2mZe4m2Ckg7o4owP5CtCHuA4yZ5/SGZ2OhIRGIM/RAcUgC/u -wrzVZOCB4iFnDp7tEFWRq3uwfrHzl5l886nFYt62DZyoG3HlZOpPt0c7Xk5vyNgC -uoIgHHcasTJw6+2prxJ+u6I7+FP0yygKOdY0g3u+WOwYAlXgr2N1M+xFC8Q0tA/I -OQDCc8cHAFdl7K+lGITWGICPIkArW2HJVex2vtHFD23waCoxnsGXLE4mi6IJ7NPl -uSSsnw2cWcBGlVvJdwDCem7Bb50g2VPocOEW4SVgGQdrl76r/Y0epqYNREMGA82i -r30zWBTHczgZfDEIPqqV -=OKc0 ------END PGP SIGNATURE----- diff --git a/LVM2.2.03.13.tgz.asc b/LVM2.2.03.13.tgz.asc new file mode 100644 index 0000000..4c03b49 --- /dev/null +++ b/LVM2.2.03.13.tgz.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.22 (GNU/Linux) + +iQIcBAABAgAGBQJhE+77AAoJELkRJDHlCQOfpEYP/0nuaspSTyABSJifvLkVkKqX +zR+s1WsKbDUEA4r8iIaZXfiB0Eo62laHoZxVV2FBaFdO73AecwMs7GJ9E4eky6Dr +KIMJcYcv2iP/2om+PLdQDV89U+Y1CL4l77tvM9UZrkyHxIy8+mHo+4BWZeDxK2sT +WwSwUo1qJ4upeys8YMTL7XX4bU7NCl8st+gCoAIxzesgiP85NjAAXCdj4Q7kb3Lx +MwG9JNsnjs+XVIB+xvrB+IeJKU6PBVqGAtV8l29D8SnTohl9kT3AePB2LBnKTlzS +EmHRnyM1cwOLJGuP26m+pXbTtW8jXUOGbcpzApGmQPVxnLYKqhvcgAs9rXfXdKNg +B0CC01uTveHXcpL/xwQdag9aMx9yNGUb6KizWWHOupg0+q2ULtFauDvfGdK3n9CN +uumHZMWslpGgstM2CU7cbDO/LrujMQjQ5r6ULofg5DDeVqIze05DDB7VeDHAOHyV +MtJPOKGsAopdqAmkzoE2QoAHrXGqe86W/zCxYbjLKWtz7lhClZldyes499n0zdET +xpliWbW4x6SpalnfY8iBdqOWDetdW2qbykR0ZL/rC460e/Zl/mDxQyZm4DPqJzTM +0j3b5LhX48hrOz3NzLT5zBmjUWDB6gW9PYNqA0B9Zts1nyJySzD9WFsU+CMrl7Ea +aqguG+5zGYgU6OhbiSbn +=1259 +-----END PGP SIGNATURE----- diff --git a/gating.yaml b/gating.yaml index d3b61f2..bd90bd9 100644 --- a/gating.yaml +++ b/gating.yaml @@ -1,6 +1,6 @@ --- !Policy product_versions: - - rhel-8 + - rhel-9 decision_context: osci_compose_gate rules: - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} diff --git a/lvm2-2_03_12-WHATS_NEW-update.patch b/lvm2-2_03_12-WHATS_NEW-update.patch deleted file mode 100644 index ed16b64..0000000 --- a/lvm2-2_03_12-WHATS_NEW-update.patch +++ /dev/null @@ -1,15 +0,0 @@ - WHATS_NEW | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/WHATS_NEW b/WHATS_NEW -index ffefc9d..3953c7e 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,7 @@ - Version 2.03.12 - - =================================== -+ Fix problem with wiping of converted LVs. -+ Fix memleak in scanning (2.03.11). - Fix corner case allocation for thin-pools. - - Version 2.03.11 - 08th January 2021 diff --git a/lvm2-2_03_12-alloc-enhance-estimation-of-sufficient_pes_free.patch b/lvm2-2_03_12-alloc-enhance-estimation-of-sufficient_pes_free.patch deleted file mode 100644 index a60a2b8..0000000 --- a/lvm2-2_03_12-alloc-enhance-estimation-of-sufficient_pes_free.patch +++ /dev/null @@ -1,47 +0,0 @@ - WHATS_NEW | 10 ++++++++-- - lib/metadata/lv_manip.c | 10 +++++++--- - 2 files changed, 11 insertions(+), 3 deletions(-) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 452a631..fe347f7 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,3 +1,7 @@ -+Version 2.03.12 - -+=================================== -+ Fix corner case allocation for thin-pools. -+ - Version 2.03.11 - 08th January 2021 - =================================== - Fix pvck handling MDA at offset different from 4096. -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 7046436..443d32c 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -1850,11 +1850,13 @@ static uint32_t _mirror_log_extents(uint32_t region_size, uint32_t pe_size, uint - - /* Is there enough total space or should we give up immediately? */ - static int _sufficient_pes_free(struct alloc_handle *ah, struct dm_list *pvms, -- uint32_t allocated, uint32_t extents_still_needed) -+ uint32_t allocated, uint32_t log_still_needed, -+ uint32_t extents_still_needed) - { - uint32_t area_extents_needed = (extents_still_needed - allocated) * ah->area_count / ah->area_multiple; - uint32_t parity_extents_needed = (extents_still_needed - allocated) * ah->parity_count / ah->area_multiple; -- uint32_t metadata_extents_needed = ah->alloc_and_split_meta ? 0 : ah->metadata_area_count * RAID_METADATA_AREA_LEN + ah->log_len; /* One each */ -+ uint32_t metadata_extents_needed = (ah->alloc_and_split_meta ? 0 : ah->metadata_area_count * RAID_METADATA_AREA_LEN) + -+ (log_still_needed ? ah->log_len : 0); /* One each */ - uint64_t total_extents_needed = (uint64_t)area_extents_needed + parity_extents_needed + metadata_extents_needed; - uint32_t free_pes = pv_maps_size(pvms); - -@@ -3359,7 +3361,9 @@ static int _allocate(struct alloc_handle *ah, - old_allocated = alloc_state.allocated; - log_debug_alloc("Trying allocation using %s policy.", get_alloc_string(alloc)); - -- if (!ah->approx_alloc && !_sufficient_pes_free(ah, pvms, alloc_state.allocated, ah->new_extents)) -+ if (!ah->approx_alloc && !_sufficient_pes_free(ah, pvms, alloc_state.allocated, -+ alloc_state.log_area_count_still_needed, -+ ah->new_extents)) - goto_out; - - _init_alloc_parms(ah, &alloc_parms, alloc, prev_lvseg, diff --git a/lvm2-2_03_12-cache-reuse-code-for-metadata-min_max.patch b/lvm2-2_03_12-cache-reuse-code-for-metadata-min_max.patch deleted file mode 100644 index ce35731..0000000 --- a/lvm2-2_03_12-cache-reuse-code-for-metadata-min_max.patch +++ /dev/null @@ -1,107 +0,0 @@ - lib/metadata/cache_manip.c | 40 ++++++++++++++-------------------------- - lib/metadata/metadata-exported.h | 1 + - tools/lvconvert.c | 1 + - tools/lvcreate.c | 1 + - 4 files changed, 17 insertions(+), 26 deletions(-) - -diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c -index 2c4cc92..90ebd94 100644 ---- a/lib/metadata/cache_manip.c -+++ b/lib/metadata/cache_manip.c -@@ -204,6 +204,7 @@ int update_cache_pool_params(struct cmd_context *cmd, - unsigned attr, - uint32_t pool_data_extents, - uint32_t *pool_metadata_extents, -+ struct logical_volume *metadata_lv, - int *chunk_size_calc_method, uint32_t *chunk_size) - { - uint64_t min_meta_size; -@@ -252,39 +253,26 @@ int update_cache_pool_params(struct cmd_context *cmd, - if (!validate_cache_chunk_size(cmd, *chunk_size)) - return_0; - -- min_meta_size = _cache_min_metadata_size((uint64_t) pool_data_extents * extent_size, *chunk_size); -+ if ((uint64_t) *chunk_size > (uint64_t) pool_data_extents * extent_size) { -+ log_error("Size of %s data volume cannot be smaller than chunk size %s.", -+ segtype->name, display_size(cmd, *chunk_size)); -+ return 0; -+ } - -- /* Round up to extent size */ -- if (min_meta_size % extent_size) -- min_meta_size += extent_size - min_meta_size % extent_size; -+ min_meta_size = _cache_min_metadata_size((uint64_t) pool_data_extents * extent_size, *chunk_size); -+ min_meta_size = dm_round_up(min_meta_size, extent_size); - - if (!pool_metadata_size) - pool_metadata_size = min_meta_size; - -- if (pool_metadata_size > (2 * DEFAULT_CACHE_POOL_MAX_METADATA_SIZE)) { -- pool_metadata_size = 2 * DEFAULT_CACHE_POOL_MAX_METADATA_SIZE; -- if (*pool_metadata_extents) -- log_warn("WARNING: Maximum supported pool metadata size is %s.", -- display_size(cmd, pool_metadata_size)); -- } else if (pool_metadata_size < min_meta_size) { -- if (*pool_metadata_extents) -- log_warn("WARNING: Minimum required pool metadata size is %s " -- "(needs extra %s).", -- display_size(cmd, min_meta_size), -- display_size(cmd, min_meta_size - pool_metadata_size)); -- pool_metadata_size = min_meta_size; -- } -- -- if (!(*pool_metadata_extents = -- extents_from_size(cmd, pool_metadata_size, extent_size))) -+ if (!update_pool_metadata_min_max(cmd, extent_size, -+ min_meta_size, -+ (2 * DEFAULT_CACHE_POOL_MAX_METADATA_SIZE), -+ &pool_metadata_size, -+ metadata_lv, -+ pool_metadata_extents)) - return_0; - -- if ((uint64_t) *chunk_size > (uint64_t) pool_data_extents * extent_size) { -- log_error("Size of %s data volume cannot be smaller than chunk size %s.", -- segtype->name, display_size(cmd, *chunk_size)); -- return 0; -- } -- - log_verbose("Preferred pool metadata size %s.", - display_size(cmd, (uint64_t)*pool_metadata_extents * extent_size)); - -diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h -index 0e57722..c0fa564 100644 ---- a/lib/metadata/metadata-exported.h -+++ b/lib/metadata/metadata-exported.h -@@ -1319,6 +1319,7 @@ int update_cache_pool_params(struct cmd_context *cmd, - unsigned attr, - uint32_t pool_data_extents, - uint32_t *pool_metadata_extents, -+ struct logical_volume *metadata_lv, - int *chunk_size_calc_method, uint32_t *chunk_size); - int validate_lv_cache_chunk_size(struct logical_volume *pool_lv, uint32_t chunk_size); - int validate_lv_cache_create_pool(const struct logical_volume *pool_lv); -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index ce90279..416e8a7 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -3189,6 +3189,7 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, - pool_segtype, target_attr, - lv->le_count, - &meta_extents, -+ metadata_lv, - &chunk_calc, - &chunk_size)) - goto_bad; -diff --git a/tools/lvcreate.c b/tools/lvcreate.c -index 1ee9e14..1ce561f 100644 ---- a/tools/lvcreate.c -+++ b/tools/lvcreate.c -@@ -403,6 +403,7 @@ static int _update_extents_params(struct volume_group *vg, - lp->segtype, lp->target_attr, - lp->extents, - &lp->pool_metadata_extents, -+ NULL, - &lp->thin_chunk_size_calc_policy, - &lp->chunk_size)) - return_0; diff --git a/lvm2-2_03_12-config-avoid-printing-spaces-before-end-of-line.patch b/lvm2-2_03_12-config-avoid-printing-spaces-before-end-of-line.patch deleted file mode 100644 index ffed82b..0000000 --- a/lvm2-2_03_12-config-avoid-printing-spaces-before-end-of-line.patch +++ /dev/null @@ -1,613 +0,0 @@ - conf/example.conf.in | 146 +++++++++++++++++++++++++------------------------- - conf/lvmlocal.conf.in | 4 +- - lib/config/config.c | 2 +- - 3 files changed, 76 insertions(+), 76 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index d149ed9..cd53147 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -78,14 +78,14 @@ devices { - # routines to acquire this information. For example, this information - # is used to drive LVM filtering like MD component detection, multipath - # component detection, partition detection and others. -- # -+ # - # Accepted values: - # none - # No external device information source is used. - # udev - # Reuse existing udev database records. Applicable only if LVM is - # compiled with udev support. -- # -+ # - external_device_info_source = "none" - - # Configuration option devices/hints. -@@ -94,13 +94,13 @@ devices { - # scanning, and will only scan the listed PVs. Removing the hint file - # will cause lvm to generate a new one. Disable hints if PVs will - # be copied onto devices using non-lvm commands, like dd. -- # -+ # - # Accepted values: - # all - # Use all hints. - # none - # Use no hints. -- # -+ # - # This configuration option has an automatic default value. - # hints = "all" - -@@ -118,11 +118,11 @@ devices { - # Prefer the name with the least number of slashes. - # Prefer a name that is a symlink. - # Prefer the path with least value in lexicographical order. -- # -+ # - # Example - # preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] -- # -- # This configuration option has an automatic default value. -+ # -+ # This configuration option does not have a default value defined. - # preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ] - - # Configuration option devices/filter. -@@ -140,7 +140,7 @@ devices { - # then the device is accepted. Be careful mixing 'a' and 'r' patterns, - # as the combination might produce unexpected results (test changes.) - # Run vgscan after changing the filter to regenerate the cache. -- # -+ # - # Example - # Accept every block device: - # filter = [ "a|.*|" ] -@@ -152,7 +152,7 @@ devices { - # filter = [ "a|loop|", "r|/dev/hdc|", "a|/dev/ide|", "r|.*|" ] - # Use anchors to be very specific: - # filter = [ "a|^/dev/hda8$|", "r|.*|" ] -- # -+ # - # This configuration option has an automatic default value. - # filter = [ "a|.*|" ] - -@@ -170,10 +170,10 @@ devices { - # List of additional acceptable block device types. - # These are of device type names from /proc/devices, followed by the - # maximum number of partitions. -- # -+ # - # Example - # types = [ "fd", 16 ] -- # -+ # - # This configuration option is advanced. - # This configuration option does not have a default value defined. - -@@ -215,7 +215,7 @@ devices { - # Configuration option devices/md_component_checks. - # The checks LVM should use to detect MD component devices. - # MD component devices are block devices used by MD software RAID. -- # -+ # - # Accepted values: - # auto - # LVM will skip scanning the end of devices when it has other -@@ -226,7 +226,7 @@ devices { - # full - # LVM will scan the start and end of devices for MD superblocks. - # This requires an extra read at the end of devices. -- # -+ # - # This configuration option has an automatic default value. - # md_component_checks = "auto" - -@@ -368,7 +368,7 @@ allocation { - # defined here, it will check whether any of them are attached to the - # PVs concerned and then seek to match those PV tags between existing - # extents and new extents. -- # -+ # - # Example - # Use the special tag "@*" as a wildcard to match any PV tag: - # cling_tag_list = [ "@*" ] -@@ -376,7 +376,7 @@ allocation { - # PVs are tagged with either @site1 or @site2 to indicate where - # they are situated: - # cling_tag_list = [ "@site1", "@site2" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option allocation/maximise_cling. -@@ -435,25 +435,25 @@ allocation { - - # Configuration option allocation/cache_metadata_format. - # Sets default metadata format for new cache. -- # -+ # - # Accepted values: - # 0 Automatically detected best available format - # 1 Original format - # 2 Improved 2nd. generation format -- # -+ # - # This configuration option has an automatic default value. - # cache_metadata_format = 0 - - # Configuration option allocation/cache_mode. - # The default cache mode used for new cache. -- # -+ # - # Accepted values: - # writethrough - # Data blocks are immediately written from the cache to disk. - # writeback - # Data blocks are written from the cache back to disk after some - # delay to improve performance. -- # -+ # - # This setting replaces allocation/cache_pool_cachemode. - # This configuration option has an automatic default value. - # cache_mode = "writethrough" -@@ -502,18 +502,18 @@ allocation { - - # Configuration option allocation/thin_pool_discards. - # The discards behaviour of thin pool volumes. -- # -+ # - # Accepted values: - # ignore - # nopassdown - # passdown -- # -+ # - # This configuration option has an automatic default value. - # thin_pool_discards = "passdown" - - # Configuration option allocation/thin_pool_chunk_size_policy. - # The chunk size calculation policy for thin pool volumes. -- # -+ # - # Accepted values: - # generic - # If thin_pool_chunk_size is defined, use it. Otherwise, calculate -@@ -525,7 +525,7 @@ allocation { - # the chunk size for performance based on device hints exposed in - # sysfs - the optimal_io_size. The chunk size is always at least - # 512KiB. -- # -+ # - # This configuration option has an automatic default value. - # thin_pool_chunk_size_policy = "generic" - -@@ -962,7 +962,7 @@ global { - # Configuration option global/mirror_segtype_default. - # The segment type used by the short mirroring option -m. - # The --type mirror|raid1 option overrides this setting. -- # -+ # - # Accepted values: - # mirror - # The original RAID1 implementation from LVM/DM. It is -@@ -982,16 +982,16 @@ global { - # handling a failure. This mirror implementation is not - # cluster-aware and cannot be used in a shared (active/active) - # fashion in a cluster. -- # -+ # - 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! - # This configuration option has an automatic default value. - # support_mirrored_mirror_log = 0 -@@ -1002,7 +1002,7 @@ global { - # The --stripes/-i and --mirrors/-m options can both be specified - # during the creation of a logical volume to use both striping and - # mirroring for the LV. There are two different implementations. -- # -+ # - # Accepted values: - # raid10 - # LVM uses MD's RAID10 personality through DM. This is the -@@ -1012,7 +1012,7 @@ global { - # is done by creating a mirror LV on top of striped sub-LVs, - # effectively creating a RAID 0+1 array. The layering is suboptimal - # in terms of providing redundancy and performance. -- # -+ # - raid10_segtype_default = "@DEFAULT_RAID10_SEGTYPE@" - - # Configuration option global/sparse_segtype_default. -@@ -1020,7 +1020,7 @@ global { - # The --type snapshot|thin option overrides this setting. - # The combination of -V and -L options creates a sparse LV. There are - # two different implementations. -- # -+ # - # Accepted values: - # snapshot - # The original snapshot implementation from LVM/DM. It uses an old -@@ -1032,7 +1032,7 @@ global { - # bigger minimal chunk size (64KiB) and uses a separate volume for - # metadata. It has better performance, especially when more data - # is used. It also supports full snapshots. -- # -+ # - sparse_segtype_default = "@DEFAULT_SPARSE_SEGTYPE@" - - # Configuration option global/lvdisplay_shows_full_device_path. -@@ -1130,20 +1130,20 @@ global { - # causing problems. Features include: block_size, discards, - # discards_non_power_2, external_origin, metadata_resize, - # external_origin_extend, error_if_no_space. -- # -+ # - # Example - # thin_disabled_features = [ "discards", "block_size" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option global/cache_disabled_features. - # Features to not use in the cache driver. - # This can be helpful for testing, or to avoid using a feature that is - # causing problems. Features include: policy_mq, policy_smq, metadata2. -- # -+ # - # Example - # cache_disabled_features = [ "policy_smq" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option global/cache_check_executable. -@@ -1207,7 +1207,7 @@ global { - # or vgimport.) A VG on shared storage devices is accessible only to - # the host with a matching system ID. See 'man lvmsystemid' for - # information on limitations and correct usage. -- # -+ # - # Accepted values: - # none - # The host has no system ID. -@@ -1224,7 +1224,7 @@ global { - # file - # Use the contents of another file (system_id_file) to set the - # system ID. -- # -+ # - system_id_source = "none" - - # Configuration option global/system_id_file. -@@ -1350,7 +1350,7 @@ activation { - # If this list is defined, an LV is only activated if it matches an - # entry in this list. If this list is undefined, it imposes no limits - # on LV activation (all are allowed). -- # -+ # - # Accepted values: - # vgname - # The VG name is matched exactly and selects all LVs in the VG. -@@ -1364,10 +1364,10 @@ activation { - # or VG. See tags/hosttags. If any host tags exist but volume_list - # is not defined, a default single-entry list containing '@*' - # is assumed. -- # -+ # - # Example - # volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option activation/auto_activation_volume_list. -@@ -1387,7 +1387,7 @@ activation { - # commands run directly by a user. A user may also use the 'a' flag - # directly to perform auto-activation. Also see pvscan(8) for more - # information about auto-activation. -- # -+ # - # Accepted values: - # vgname - # The VG name is matched exactly and selects all LVs in the VG. -@@ -1401,10 +1401,10 @@ activation { - # or VG. See tags/hosttags. If any host tags exist but volume_list - # is not defined, a default single-entry list containing '@*' - # is assumed. -- # -+ # - # Example - # auto_activation_volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option activation/read_only_volume_list. -@@ -1413,7 +1413,7 @@ activation { - # against this list, and if it matches, it is activated in read-only - # mode. This overrides the permission setting stored in the metadata, - # e.g. from --permission rw. -- # -+ # - # Accepted values: - # vgname - # The VG name is matched exactly and selects all LVs in the VG. -@@ -1427,10 +1427,10 @@ activation { - # or VG. See tags/hosttags. If any host tags exist but volume_list - # is not defined, a default single-entry list containing '@*' - # is assumed. -- # -+ # - # Example - # read_only_volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ] -- # -+ # - # This configuration option does not have a default value defined. - - # Configuration option activation/raid_region_size. -@@ -1453,13 +1453,13 @@ activation { - - # Configuration option activation/readahead. - # Setting to use when there is no readahead setting in metadata. -- # -+ # - # Accepted values: - # none - # Disable readahead. - # auto - # Use default value chosen by kernel. -- # -+ # - # This configuration option has an automatic default value. - # readahead = "auto" - -@@ -1471,7 +1471,7 @@ activation { - # performed by dmeventd automatically, and the steps perfomed by the - # manual command lvconvert --repair --use-policies. - # Automatic handling requires dmeventd to be monitoring the LV. -- # -+ # - # Accepted values: - # warn - # Use the system log to warn the user that a device in the RAID LV -@@ -1482,7 +1482,7 @@ activation { - # allocate - # Attempt to use any extra physical volumes in the VG as spares and - # replace faulty devices. -- # -+ # - raid_fault_policy = "warn" - - # Configuration option activation/mirror_image_fault_policy. -@@ -1494,7 +1494,7 @@ activation { - # determines the steps perfomed by dmeventd automatically, and the steps - # performed by the manual command lvconvert --repair --use-policies. - # Automatic handling requires dmeventd to be monitoring the LV. -- # -+ # - # Accepted values: - # remove - # Simply remove the faulty device and run without it. If the log -@@ -1519,7 +1519,7 @@ activation { - # the redundant nature of the mirror. This policy acts like - # 'remove' if no suitable device and space can be allocated for the - # replacement. -- # -+ # - mirror_image_fault_policy = "remove" - - # Configuration option activation/mirror_log_fault_policy. -@@ -1534,26 +1534,26 @@ activation { - # The minimum value is 50 (a smaller value is treated as 50.) - # Also see snapshot_autoextend_percent. - # Automatic extension requires dmeventd to be monitoring the LV. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 1G - # snapshot exceeds 700M, it is extended to 1.2G, and when it exceeds - # 840M, it is extended to 1.44G: - # snapshot_autoextend_threshold = 70 -- # -+ # - snapshot_autoextend_threshold = 100 - - # Configuration option activation/snapshot_autoextend_percent. - # Auto-extending a snapshot adds this percent extra space. - # The amount of additional space added to a snapshot is this - # percent of its current size. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 1G - # snapshot exceeds 700M, it is extended to 1.2G, and when it exceeds - # 840M, it is extended to 1.44G: - # snapshot_autoextend_percent = 20 -- # -+ # - snapshot_autoextend_percent = 20 - - # Configuration option activation/thin_pool_autoextend_threshold. -@@ -1562,26 +1562,26 @@ activation { - # The minimum value is 50 (a smaller value is treated as 50.) - # Also see thin_pool_autoextend_percent. - # Automatic extension requires dmeventd to be monitoring the LV. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 1G - # thin pool exceeds 700M, it is extended to 1.2G, and when it exceeds - # 840M, it is extended to 1.44G: - # thin_pool_autoextend_threshold = 70 -- # -+ # - thin_pool_autoextend_threshold = 100 - - # Configuration option activation/thin_pool_autoextend_percent. - # Auto-extending a thin pool adds this percent extra space. - # The amount of additional space added to a thin pool is this - # percent of its current size. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 1G - # thin pool exceeds 700M, it is extended to 1.2G, and when it exceeds - # 840M, it is extended to 1.44G: - # thin_pool_autoextend_percent = 20 -- # -+ # - thin_pool_autoextend_percent = 20 - - # Configuration option activation/vdo_pool_autoextend_threshold. -@@ -1590,13 +1590,13 @@ activation { - # The minimum value is 50 (a smaller value is treated as 50.) - # Also see vdo_pool_autoextend_percent. - # Automatic extension requires dmeventd to be monitoring the LV. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 10G - # VDO pool exceeds 7G, it is extended to 12G, and when it exceeds - # 8.4G, it is extended to 14.4G: - # vdo_pool_autoextend_threshold = 70 -- # -+ # - # This configuration option has an automatic default value. - # vdo_pool_autoextend_threshold = 100 - -@@ -1604,7 +1604,7 @@ activation { - # Auto-extending a VDO pool adds this percent extra space. - # The amount of additional space added to a VDO pool is this - # percent of its current size. -- # -+ # - # Example - # Using 70% autoextend threshold and 20% autoextend size, when a 10G - # VDO pool exceeds 7G, it is extended to 12G, and when it exceeds -@@ -1623,10 +1623,10 @@ activation { - # pages corresponding to lines that match are not pinned. On some - # systems, locale-archive was found to make up over 80% of the memory - # used by the process. -- # -+ # - # Example - # mlock_filter = [ "locale/locale-archive", "gconv/gconv-modules.cache" ] -- # -+ # - # This configuration option is advanced. - # This configuration option does not have a default value defined. - -@@ -1667,7 +1667,7 @@ activation { - # Configuration option activation/activation_mode. - # How LVs with missing devices are activated. - # The --activationmode option overrides this setting. -- # -+ # - # Accepted values: - # complete - # Only allow activation of an LV if all of the Physical Volumes it -@@ -1682,7 +1682,7 @@ activation { - # could cause data loss with a portion of the LV inaccessible. - # This setting should not normally be used, but may sometimes - # assist with data recovery. -- # -+ # - activation_mode = "degraded" - - # Configuration option activation/lock_start_list. -@@ -1730,7 +1730,7 @@ activation { - # Configuration option metadata/pvmetadatacopies. - # Number of copies of metadata to store on each PV. - # The --pvmetadatacopies option overrides this setting. -- # -+ # - # Accepted values: - # 2 - # Two copies of the VG metadata are stored on the PV, one at the -@@ -1740,7 +1740,7 @@ activation { - # 0 - # No copies of VG metadata are stored on the PV. This may be - # useful for VGs containing large numbers of PVs. -- # -+ # - # This configuration option is advanced. - # This configuration option has an automatic default value. - # pvmetadatacopies = 1 -@@ -1890,7 +1890,7 @@ activation { - # sequences are copied verbatim. Each special character sequence is - # introduced by the '%' character and such sequence is then - # substituted with a value as described below. -- # -+ # - # Accepted values: - # %a - # The abbreviated name of the day of the week according to the -@@ -2013,7 +2013,7 @@ activation { - # The timezone name or abbreviation. - # %% - # A literal '%' character. -- # -+ # - # This configuration option has an automatic default value. - # time_format = "%Y-%m-%d %T %z" - -@@ -2282,12 +2282,12 @@ dmeventd { - # applied to the local machine as a 'host tag'. If this subsection is - # empty (has no host_list), then the subsection name is always applied - # as a 'host tag'. -- # -+ # - # Example - # The host tag foo is given to all hosts, and the host tag - # bar is given to the hosts named machine1 and machine2. - # tags { foo { } bar { host_list = [ "machine1", "machine2" ] } } -- # -+ # - # This configuration section has variable name. - # This configuration section has an automatic default value. - # tag { -diff --git a/conf/lvmlocal.conf.in b/conf/lvmlocal.conf.in -index 04414bf..12214ea 100644 ---- a/conf/lvmlocal.conf.in -+++ b/conf/lvmlocal.conf.in -@@ -28,13 +28,13 @@ local { - # main configuration file, e.g. lvm.conf. When used, it must be set to - # a unique value among all hosts sharing access to the storage, - # e.g. a host name. -- # -+ # - # Example - # Set no system ID: - # system_id = "" - # Set the system_id to a specific name: - # system_id = "host1" -- # -+ # - # This configuration option has an automatic default value. - # system_id = "" - -diff --git a/lib/config/config.c b/lib/config/config.c -index a25b7db..f9ca566 100644 ---- a/lib/config/config.c -+++ b/lib/config/config.c -@@ -1738,7 +1738,7 @@ static int _out_prefix_fn(const struct dm_config_node *cn, const char *line, voi - continue; - commentline[0] = '\0'; - } -- fprintf(out->fp, "%s# %s\n", line, commentline); -+ fprintf(out->fp, "%s#%s%s\n", line, commentline[0] ? " " : "", commentline); - /* withsummary prints only the first comment line. */ - if (!out->tree_spec->withcomments) - break; diff --git a/lvm2-2_03_12-dev_get_primary_dev-fix-invalid-path-check.patch b/lvm2-2_03_12-dev_get_primary_dev-fix-invalid-path-check.patch deleted file mode 100644 index add3525..0000000 --- a/lvm2-2_03_12-dev_get_primary_dev-fix-invalid-path-check.patch +++ /dev/null @@ -1,48 +0,0 @@ -From b3719266bd5e3a9e6737d6bda60e543121ddf343 Mon Sep 17 00:00:00 2001 -From: David Teigland -Date: Tue, 9 Feb 2021 09:47:08 -0600 -Subject: [PATCH] dev_get_primary_dev: fix invalid path check - -Fix commit bee9f4efdd81 "filter-mpath: work with nvme devices" -which removed setting the path for readlink. - -(cherry picked from commit f74f94c2ddb1d33d75d325c959344a566a621fd5) - -Conflicts: - lib/device/dev-type.c ---- - lib/device/dev-type.c | 11 ++++++++--- - 1 file changed, 8 insertions(+), 3 deletions(-) - -diff --git a/lib/device/dev-type.c b/lib/device/dev-type.c -index 379afa8..1342e97 100644 ---- a/lib/device/dev-type.c -+++ b/lib/device/dev-type.c -@@ -434,7 +434,7 @@ static int _has_sys_partition(struct device *dev) - int minor = (int) MINOR(dev->dev); - - /* check if dev is a partition */ -- if (dm_snprintf(path, sizeof(path), "%s/dev/block/%d:%d/partition", -+ if (dm_snprintf(path, sizeof(path), "%sdev/block/%d:%d/partition", - dm_sysfs_dir(), major, minor) < 0) { - log_error("dm_snprintf partition failed"); - return 0; -@@ -660,8 +660,13 @@ int dev_get_primary_dev(struct dev_types *dt, struct device *dev, dev_t *result) - * - basename ../../block/md0/md0 = md0 - * Parent's 'dev' sysfs attribute = /sys/block/md0/dev - */ -- if ((size = readlink(dirname(path), temp_path, sizeof(temp_path) - 1)) < 0) { -- log_sys_error("readlink", path); -+ if (dm_snprintf(path, sizeof(path), "%sdev/block/%d:%d", -+ dm_sysfs_dir(), major, minor) < 0) { -+ log_warn("WARNING: %s: major:minor sysfs path is too long.", dev_name(dev)); -+ return 0; -+ } -+ if ((size = readlink(path, temp_path, sizeof(temp_path) - 1)) < 0) { -+ log_warn("WARNING: Readlink of %s failed.", path); - goto out; - } - --- -1.8.3.1 - diff --git a/lvm2-2_03_12-devs-remove-invalid-path-name-aliases.patch b/lvm2-2_03_12-devs-remove-invalid-path-name-aliases.patch deleted file mode 100644 index 0f00653..0000000 --- a/lvm2-2_03_12-devs-remove-invalid-path-name-aliases.patch +++ /dev/null @@ -1,255 +0,0 @@ - lib/device/dev-cache.c | 161 ++++++++++++++++++++++++++++++++++++---------- - test/shell/dev-aliases.sh | 53 +++++++++++++++ - 2 files changed, 179 insertions(+), 35 deletions(-) - create mode 100644 test/shell/dev-aliases.sh - -diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c -index d5f18ff..8082efa 100644 ---- a/lib/device/dev-cache.c -+++ b/lib/device/dev-cache.c -@@ -1428,60 +1428,151 @@ struct device *dev_hash_get(const char *name) - return (struct device *) dm_hash_lookup(_cache.names, name); - } - -+static void _remove_alias(struct device *dev, const char *name) -+{ -+ struct dm_str_list *strl; -+ -+ dm_list_iterate_items(strl, &dev->aliases) { -+ if (!strcmp(strl->str, name)) { -+ dm_list_del(&strl->list); -+ return; -+ } -+ } -+} -+ -+/* -+ * Check that paths for this dev still refer to the same dev_t. This is known -+ * to drop invalid paths in the case where lvm deactivates an LV, which causes -+ * that LV path to go away, but that LV path is not removed from dev-cache (it -+ * probably should be). Later a new path to a different LV is added to -+ * dev-cache, where the new LV has the same major:minor as the previously -+ * deactivated LV. The new LV will find the existing struct dev, and that -+ * struct dev will have dev->aliases entries that refer to the name of the old -+ * deactivated LV. Those old paths are all invalid and are dropped here. -+ */ -+ -+static void _verify_aliases(struct device *dev, const char *newname) -+{ -+ struct dm_str_list *strl, *strl2; -+ struct stat st; -+ -+ dm_list_iterate_items_safe(strl, strl2, &dev->aliases) { -+ /* newname was just stat'd and added by caller */ -+ if (newname && !strcmp(strl->str, newname)) -+ continue; -+ -+ if (stat(strl->str, &st) || (st.st_rdev != dev->dev)) { -+ log_debug("Drop invalid path %s for %d:%d (new path %s).", -+ strl->str, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), newname ?: ""); -+ dm_hash_remove(_cache.names, strl->str); -+ dm_list_del(&strl->list); -+ } -+ } -+} -+ - struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct dev_filter *f) - { -- struct stat buf; -- struct device *d = (struct device *) dm_hash_lookup(_cache.names, name); -- int info_available = 0; -- int ret = 1; -+ struct device *dev = (struct device *) dm_hash_lookup(_cache.names, name); -+ struct stat st; -+ int ret; - -- if (d && (d->flags & DEV_REGULAR)) -- return d; -+ /* -+ * DEV_REGULAR means that is "dev" is actually a file, not a device. -+ * FIXME: I don't think dev-cache is used for files any more and this -+ * can be dropped? -+ */ -+ if (dev && (dev->flags & DEV_REGULAR)) -+ return dev; -+ -+ /* -+ * The requested path is invalid, remove any dev-cache -+ * info for it. -+ */ -+ if (stat(name, &st)) { -+ if (dev) { -+ log_print("Device path %s is invalid for %d:%d %s.", -+ name, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), dev_name(dev)); - -- /* If the entry's wrong, remove it */ -- if (stat(name, &buf) < 0) { -- if (d) - dm_hash_remove(_cache.names, name); -- log_sys_very_verbose("stat", name); -- d = NULL; -- } else -- info_available = 1; - -- if (d && (buf.st_rdev != d->dev)) { -- dm_hash_remove(_cache.names, name); -- d = NULL; -- } -+ _remove_alias(dev, name); - -- if (!d) { -- _insert(name, info_available ? &buf : NULL, 0, obtain_device_list_from_udev()); -- d = (struct device *) dm_hash_lookup(_cache.names, name); -- if (!d) { -- log_debug_devs("Device name not found in dev_cache repeat dev_cache_scan for %s", name); -- dev_cache_scan(); -- d = (struct device *) dm_hash_lookup(_cache.names, name); -+ /* Remove any other names in dev->aliases that are incorrect. */ -+ _verify_aliases(dev, NULL); - } -+ return NULL; - } - -- if (!d) -+ if (!S_ISBLK(st.st_mode)) { -+ log_debug("Not a block device %s.", name); - return NULL; -+ } - -- if (d && (d->flags & DEV_REGULAR)) -- return d; -+ /* -+ * dev-cache has incorrect info for the requested path. -+ * Remove incorrect info and then add new dev-cache entry. -+ */ -+ if (dev && (st.st_rdev != dev->dev)) { -+ log_print("Device path %s does not match %d:%d %s.", -+ name, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), dev_name(dev)); -+ -+ dm_hash_remove(_cache.names, name); -+ -+ _remove_alias(dev, name); -+ -+ /* Remove any other names in dev->aliases that are incorrect. */ -+ _verify_aliases(dev, NULL); -+ -+ /* Add new dev-cache entry next. */ -+ dev = NULL; -+ } -+ -+ /* -+ * Either add a new struct dev for st_rdev and name, -+ * or add name as a new alias for an existing struct dev -+ * for st_rdev. -+ */ -+ if (!dev) { -+ _insert_dev(name, st.st_rdev); - -- if (f && !(d->flags & DEV_REGULAR)) { -- ret = f->passes_filter(cmd, f, d, NULL); -+ /* Get the struct dev that was just added. */ -+ dev = (struct device *) dm_hash_lookup(_cache.names, name); - -- if (ret == -EAGAIN) { -- log_debug_devs("get device by name defer filter %s", dev_name(d)); -- d->flags |= DEV_FILTER_AFTER_SCAN; -- ret = 1; -+ if (!dev) { -+ log_error("Failed to get device %s", name); -+ return NULL; - } -+ -+ _verify_aliases(dev, name); - } - -- if (f && !(d->flags & DEV_REGULAR) && !ret) -+ /* -+ * The caller passed a filter if they only want the dev if it -+ * passes filters. -+ */ -+ -+ if (!f) -+ return dev; -+ -+ ret = f->passes_filter(cmd, f, dev, NULL); -+ -+ /* -+ * This might happen if this function is called before -+ * filters can do i/o. I don't think this will happen -+ * any longer and this EAGAIN case can be removed. -+ */ -+ if (ret == -EAGAIN) { -+ log_debug_devs("dev_cache_get filter deferred %s", dev_name(dev)); -+ dev->flags |= DEV_FILTER_AFTER_SCAN; -+ ret = 1; -+ } -+ -+ if (!ret) { -+ log_debug_devs("dev_cache_get filter excludes %s", dev_name(dev)); - return NULL; -+ } - -- return d; -+ return dev; - } - - static struct device *_dev_cache_seek_devt(dev_t dev) -diff --git a/test/shell/dev-aliases.sh b/test/shell/dev-aliases.sh -new file mode 100644 -index 0000000..c97cd5d ---- /dev/null -+++ b/test/shell/dev-aliases.sh -@@ -0,0 +1,53 @@ -+#!/usr/bin/env bash -+ -+# Copyright (C) 2012 Red Hat, Inc. All rights reserved. -+# -+# This copyrighted material is made available to anyone wishing to use, -+# modify, copy, or redistribute it subject to the terms and conditions -+# of the GNU General Public License v.2. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software Foundation, -+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ -+SKIP_WITH_LVMPOLLD=1 -+ -+. lib/inittest -+ -+aux prepare_devs 3 -+ -+vgcreate $vg $dev1 $dev2 $dev3 -+ -+# -+# This lvconvert command will deactivate LV1, then internally create a new -+# lv, lvol0, as a poolmetadataspare, then activate lvol0 to zero it. -+# lvol0 will get the same major:minor that LV1 had. When the code gets -+# the struct dev for lvol0, the new path to lvol0 is added to the -+# dev-cache with it's major:minor. That major:minor already exists in -+# dev-cache and has the stale LV1 as an alias. So the path to lvol0 is -+# added as an alias to the existing struct dev (with the correct -+# major:minor), but that struct dev has the stale LV1 path on its aliases -+# list. The code will now validate all the aliases before returning the -+# dev for lvol0, and will find that the LV1 path is stale and remove it -+# from the aliases. That will prevent the stale path from being used for -+# the dev in place of the new path. -+# -+# The preferred_name is set to /dev/mapper so that if the stale path still -+# exists, that stale path would be used as the name for the dev, and the -+# wiping code would fail to open that stale name. -+# -+ -+lvcreate -n $lv1 -L32M $vg $dev1 -+lvcreate -n $lv2 -L16M $vg $dev2 -+lvconvert -y --type cache-pool --poolmetadata $lv2 --cachemode writeback $vg/$lv1 --config='devices { preferred_names=["/dev/mapper/"] }' -+lvremove -y $vg/$lv1 -+ -+lvcreate -n $lv1 -L32M $vg $dev1 -+lvcreate -n $lv2 -L16M $vg $dev2 -+lvconvert -y --type cache-pool --poolmetadata $lv2 $vg/$lv1 -+lvremove -y $vg/$lv1 -+ -+# TODO: add more validation of dev aliases being specified as command -+# args in combination with various preferred_names settings. -+ -+vgremove -ff $vg diff --git a/lvm2-2_03_12-filter-mpath-work-with-nvme-devices.patch b/lvm2-2_03_12-filter-mpath-work-with-nvme-devices.patch deleted file mode 100644 index 3778134..0000000 --- a/lvm2-2_03_12-filter-mpath-work-with-nvme-devices.patch +++ /dev/null @@ -1,494 +0,0 @@ - lib/device/dev-type.c | 81 +++++++++++++++++++---- - lib/device/dev-type.h | 2 + - lib/device/device.h | 1 + - lib/filters/filter-mpath.c | 156 ++++++++++++++++++++++++++++++--------------- - 4 files changed, 177 insertions(+), 63 deletions(-) - -diff --git a/lib/device/dev-type.c b/lib/device/dev-type.c -index 896821d..379afa8 100644 ---- a/lib/device/dev-type.c -+++ b/lib/device/dev-type.c -@@ -21,6 +21,7 @@ - #include "lib/metadata/metadata.h" - #include "lib/device/bcache.h" - #include "lib/label/label.h" -+#include "lib/commands/toolcontext.h" - - #ifdef BLKID_WIPING_SUPPORT - #include -@@ -67,6 +68,31 @@ int dev_is_pmem(struct device *dev) - return is_pmem ? 1 : 0; - } - -+/* -+ * An nvme device has major number 259 (BLKEXT), minor number , -+ * and reading /sys/dev/block/259:/device/dev shows a character -+ * device cmajor:cminor where cmajor matches the major number of the -+ * nvme character device entry in /proc/devices. Checking all of that -+ * is excessive and unnecessary compared to just comparing /dev/name*. -+ */ -+ -+int dev_is_nvme(struct dev_types *dt, struct device *dev) -+{ -+ struct dm_str_list *strl; -+ -+ if (dev->flags & DEV_IS_NVME) -+ return 1; -+ -+ dm_list_iterate_items(strl, &dev->aliases) { -+ if (!strncmp(strl->str, "/dev/nvme", 9)) { -+ log_debug("Found nvme device %s", dev_name(dev)); -+ dev->flags |= DEV_IS_NVME; -+ return 1; -+ } -+ } -+ return 0; -+} -+ - int dev_is_lv(struct device *dev) - { - FILE *fp; -@@ -302,6 +328,9 @@ int dev_subsystem_part_major(struct dev_types *dt, struct device *dev) - - const char *dev_subsystem_name(struct dev_types *dt, struct device *dev) - { -+ if (dev->flags & DEV_IS_NVME) -+ return "NVME"; -+ - if (MAJOR(dev->dev) == dt->device_mapper_major) - return "DM"; - -@@ -348,7 +377,6 @@ int major_is_scsi_device(struct dev_types *dt, int major) - return (dt->dev_type_array[major].flags & PARTITION_SCSI_DEVICE) ? 1 : 0; - } - -- - static int _loop_is_with_partscan(struct device *dev) - { - FILE *fp; -@@ -398,6 +426,28 @@ struct partition { - uint32_t nr_sects; - } __attribute__((packed)); - -+static int _has_sys_partition(struct device *dev) -+{ -+ char path[PATH_MAX]; -+ struct stat info; -+ int major = (int) MAJOR(dev->dev); -+ int minor = (int) MINOR(dev->dev); -+ -+ /* check if dev is a partition */ -+ if (dm_snprintf(path, sizeof(path), "%s/dev/block/%d:%d/partition", -+ dm_sysfs_dir(), major, minor) < 0) { -+ log_error("dm_snprintf partition failed"); -+ return 0; -+ } -+ -+ if (stat(path, &info) == -1) { -+ if (errno != ENOENT) -+ log_sys_error("stat", path); -+ return 0; -+ } -+ return 1; -+} -+ - static int _is_partitionable(struct dev_types *dt, struct device *dev) - { - int parts = major_max_partitions(dt, MAJOR(dev->dev)); -@@ -414,6 +464,13 @@ static int _is_partitionable(struct dev_types *dt, struct device *dev) - _loop_is_with_partscan(dev)) - return 1; - -+ if (dev_is_nvme(dt, dev)) { -+ /* If this dev is already a partition then it's not partitionable. */ -+ if (_has_sys_partition(dev)) -+ return 0; -+ return 1; -+ } -+ - if ((parts <= 1) || (MINOR(dev->dev) % parts)) - return 0; - -@@ -557,11 +614,18 @@ int dev_get_primary_dev(struct dev_types *dt, struct device *dev, dev_t *result) - char path[PATH_MAX]; - char temp_path[PATH_MAX]; - char buffer[64]; -- struct stat info; - FILE *fp = NULL; - int parts, residue, size, ret = 0; - - /* -+ * /dev/nvme devs don't use the major:minor numbering like -+ * block dev types that have their own major number, so -+ * the calculation based on minor number doesn't work. -+ */ -+ if (dev_is_nvme(dt, dev)) -+ goto sys_partition; -+ -+ /* - * Try to get the primary dev out of the - * list of known device types first. - */ -@@ -576,23 +640,14 @@ int dev_get_primary_dev(struct dev_types *dt, struct device *dev, dev_t *result) - goto out; - } - -+ sys_partition: - /* - * If we can't get the primary dev out of the list of known device - * types, try to look at sysfs directly then. This is more complex - * way and it also requires certain sysfs layout to be present - * which might not be there in old kernels! - */ -- -- /* check if dev is a partition */ -- if (dm_snprintf(path, sizeof(path), "%s/dev/block/%d:%d/partition", -- sysfs_dir, major, minor) < 0) { -- log_error("dm_snprintf partition failed"); -- goto out; -- } -- -- if (stat(path, &info) == -1) { -- if (errno != ENOENT) -- log_sys_error("stat", path); -+ if (!_has_sys_partition(dev)) { - *result = dev->dev; - ret = 1; - goto out; /* dev is not a partition! */ -diff --git a/lib/device/dev-type.h b/lib/device/dev-type.h -index fdf7791..8b94b79 100644 ---- a/lib/device/dev-type.h -+++ b/lib/device/dev-type.h -@@ -95,6 +95,8 @@ int dev_is_rotational(struct dev_types *dt, struct device *dev); - - int dev_is_pmem(struct device *dev); - -+int dev_is_nvme(struct dev_types *dt, struct device *dev); -+ - int dev_is_lv(struct device *dev); - - int get_fs_block_size(struct device *dev, uint32_t *fs_block_size); -diff --git a/lib/device/device.h b/lib/device/device.h -index a58bff8..816db31 100644 ---- a/lib/device/device.h -+++ b/lib/device/device.h -@@ -38,6 +38,7 @@ - #define DEV_SCAN_FOUND_LABEL 0x00010000 /* label scan read dev and found label */ - #define DEV_IS_MD_COMPONENT 0x00020000 /* device is an md component */ - #define DEV_UDEV_INFO_MISSING 0x00040000 /* we have no udev info for this device */ -+#define DEV_IS_NVME 0x00080000 /* set if dev is nvme */ - - /* - * Support for external device info. -diff --git a/lib/filters/filter-mpath.c b/lib/filters/filter-mpath.c -index 85d1625..40e7df6 100644 ---- a/lib/filters/filter-mpath.c -+++ b/lib/filters/filter-mpath.c -@@ -16,6 +16,7 @@ - #include "lib/misc/lib.h" - #include "lib/filters/filter.h" - #include "lib/activate/activate.h" -+#include "lib/commands/toolcontext.h" - #ifdef UDEV_SYNC_SUPPORT - #include - #include "lib/device/dev-ext-udev-constants.h" -@@ -27,7 +28,6 @@ - - #define MPATH_PREFIX "mpath-" - -- - struct mpath_priv { - struct dm_pool *mem; - struct dev_filter f; -@@ -35,6 +35,9 @@ struct mpath_priv { - struct dm_hash_table *hash; - }; - -+/* -+ * given "/dev/foo" return "foo" -+ */ - static const char *_get_sysfs_name(struct device *dev) - { - const char *name; -@@ -53,6 +56,11 @@ static const char *_get_sysfs_name(struct device *dev) - return name; - } - -+/* -+ * given major:minor -+ * readlink translates /sys/dev/block/major:minor to /sys/.../foo -+ * from /sys/.../foo return "foo" -+ */ - static const char *_get_sysfs_name_by_devt(const char *sysfs_dir, dev_t devno, - char *buf, size_t buf_size) - { -@@ -102,27 +110,28 @@ static int _get_sysfs_string(const char *path, char *buffer, int max_size) - return r; - } - --static int _get_sysfs_get_major_minor(const char *sysfs_dir, const char *kname, int *major, int *minor) -+static int _get_sysfs_dm_mpath(struct dev_types *dt, const char *sysfs_dir, const char *holder_name) - { -- char path[PATH_MAX], buffer[64]; -+ char path[PATH_MAX]; -+ char buffer[128]; - -- if (dm_snprintf(path, sizeof(path), "%s/block/%s/dev", sysfs_dir, kname) < 0) { -+ if (dm_snprintf(path, sizeof(path), "%sblock/%s/dm/uuid", sysfs_dir, holder_name) < 0) { - log_error("Sysfs path string is too long."); - return 0; - } - -+ buffer[0] = '\0'; -+ - if (!_get_sysfs_string(path, buffer, sizeof(buffer))) - return_0; - -- if (sscanf(buffer, "%d:%d", major, minor) != 2) { -- log_error("Failed to parse major minor from %s", buffer); -- return 0; -- } -+ if (!strncmp(buffer, MPATH_PREFIX, 6)) -+ return 1; - -- return 1; -+ return 0; - } - --static int _get_parent_mpath(const char *dir, char *name, int max_size) -+static int _get_holder_name(const char *dir, char *name, int max_size) - { - struct dirent *d; - DIR *dr; -@@ -155,7 +164,7 @@ static int _get_parent_mpath(const char *dir, char *name, int max_size) - } - - #ifdef UDEV_SYNC_SUPPORT --static int _udev_dev_is_mpath(struct device *dev) -+static int _udev_dev_is_mpath_component(struct device *dev) - { - const char *value; - struct dev_ext *ext; -@@ -174,95 +183,148 @@ static int _udev_dev_is_mpath(struct device *dev) - return 0; - } - #else --static int _udev_dev_is_mpath(struct device *dev) -+static int _udev_dev_is_mpath_component(struct device *dev) - { - return 0; - } - #endif - --static int _native_dev_is_mpath(struct dev_filter *f, struct device *dev) -+static int _native_dev_is_mpath_component(struct cmd_context *cmd, struct dev_filter *f, struct device *dev) - { - struct mpath_priv *mp = (struct mpath_priv *) f->private; - struct dev_types *dt = mp->dt; -- const char *part_name, *name; -- struct stat info; -- char path[PATH_MAX], parent_name[PATH_MAX]; -+ const char *part_name; -+ const char *name; /* e.g. "sda" for "/dev/sda" */ -+ char link_path[PATH_MAX]; /* some obscure, unpredictable sysfs path */ -+ char holders_path[PATH_MAX]; /* e.g. "/sys/block/sda/holders/" */ -+ char dm_dev_path[PATH_MAX]; /* e.g. "/dev/dm-1" */ -+ char holder_name[128] = { 0 }; /* e.g. "dm-1" */ - const char *sysfs_dir = dm_sysfs_dir(); -- int major = MAJOR(dev->dev); -- int minor = MINOR(dev->dev); -+ int dev_major = MAJOR(dev->dev); -+ int dev_minor = MINOR(dev->dev); -+ int dm_dev_major; -+ int dm_dev_minor; -+ struct stat info; - dev_t primary_dev; - long look; - -- /* Limit this filter only to SCSI devices */ -- if (!major_is_scsi_device(dt, MAJOR(dev->dev))) -+ /* Limit this filter to SCSI or NVME devices */ -+ if (!major_is_scsi_device(dt, dev_major) && !dev_is_nvme(dt, dev)) - return 0; - - switch (dev_get_primary_dev(dt, dev, &primary_dev)) { -+ - case 2: /* The dev is partition. */ - part_name = dev_name(dev); /* name of original dev for log_debug msg */ -- if (!(name = _get_sysfs_name_by_devt(sysfs_dir, primary_dev, parent_name, sizeof(parent_name)))) -+ -+ /* gets "foo" for "/dev/foo" where "/dev/foo" comes from major:minor */ -+ if (!(name = _get_sysfs_name_by_devt(sysfs_dir, primary_dev, link_path, sizeof(link_path)))) - return_0; -+ - log_debug_devs("%s: Device is a partition, using primary " - "device %s for mpath component detection", - part_name, name); - break; -+ - case 1: /* The dev is already a primary dev. Just continue with the dev. */ -+ -+ /* gets "foo" for "/dev/foo" */ - if (!(name = _get_sysfs_name(dev))) - return_0; - break; -+ - default: /* 0, error. */ -- log_warn("Failed to get primary device for %d:%d.", major, minor); -+ log_warn("Failed to get primary device for %d:%d.", dev_major, dev_minor); - return 0; - } - -- if (dm_snprintf(path, sizeof(path), "%s/block/%s/holders", sysfs_dir, name) < 0) { -+ if (dm_snprintf(holders_path, sizeof(holders_path), "%sblock/%s/holders", sysfs_dir, name) < 0) { - log_warn("Sysfs path to check mpath is too long."); - return 0; - } - - /* also will filter out partitions */ -- if (stat(path, &info)) -+ if (stat(holders_path, &info)) - return 0; - - if (!S_ISDIR(info.st_mode)) { -- log_warn("Path %s is not a directory.", path); -+ log_warn("Path %s is not a directory.", holders_path); - return 0; - } - -- if (!_get_parent_mpath(path, parent_name, sizeof(parent_name))) -+ /* -+ * If holders dir contains an entry such as "dm-1", then this sets -+ * holder_name to "dm-1". -+ * -+ * If holders dir is empty, return 0 (this is generally where -+ * devs that are not mpath components return.) -+ */ -+ if (!_get_holder_name(holders_path, holder_name, sizeof(holder_name))) - return 0; - -- if (!_get_sysfs_get_major_minor(sysfs_dir, parent_name, &major, &minor)) -- return_0; -+ if (dm_snprintf(dm_dev_path, sizeof(dm_dev_path), "%s/%s", cmd->dev_dir, holder_name) < 0) { -+ log_warn("dm device path to check mpath is too long."); -+ return 0; -+ } - -- if (major != dt->device_mapper_major) -+ /* -+ * stat "/dev/dm-1" which is the holder of the dev we're checking -+ * dm_dev_major:dm_dev_minor come from stat("/dev/dm-1") -+ */ -+ if (stat(dm_dev_path, &info)) { -+ log_debug("filter-mpath %s holder %s stat result %d", -+ dev_name(dev), dm_dev_path, errno); - return 0; -+ } -+ dm_dev_major = (int)MAJOR(info.st_rdev); -+ dm_dev_minor = (int)MINOR(info.st_rdev); -+ -+ if (dm_dev_major != dt->device_mapper_major) { -+ log_debug_devs("filter-mpath %s holder %s %d:%d does not have dm major", -+ dev_name(dev), dm_dev_path, dm_dev_major, dm_dev_minor); -+ return 0; -+ } - -- /* Avoid repeated detection of multipath device and use first checked result */ -- look = (long) dm_hash_lookup_binary(mp->hash, &minor, sizeof(minor)); -+ /* -+ * Save the result of checking that "/dev/dm-1" is an mpath device -+ * to avoid repeating it for each path component. -+ * The minor number of "/dev/dm-1" is added to the hash table with -+ * const value 2 meaning that dm minor 1 (for /dev/dm-1) is a multipath dev -+ * and const value 1 meaning that dm minor 1 is not a multipath dev. -+ */ -+ look = (long) dm_hash_lookup_binary(mp->hash, &dm_dev_minor, sizeof(dm_dev_minor)); - if (look > 0) { -- log_debug_devs("%s(%u:%u): already checked as %sbeing mpath.", -- parent_name, major, minor, (look > 1) ? "" : "not "); -+ log_debug_devs("filter-mpath %s holder %s %u:%u already checked as %sbeing mpath.", -+ dev_name(dev), holder_name, dm_dev_major, dm_dev_minor, (look > 1) ? "" : "not "); - return (look > 1) ? 1 : 0; - } - -- if (lvm_dm_prefix_check(major, minor, MPATH_PREFIX)) { -- (void) dm_hash_insert_binary(mp->hash, &minor, sizeof(minor), (void*)2); -+ /* -+ * Returns 1 if /sys/block//dm/uuid indicates that -+ * is a dm device with dm uuid prefix mpath-. -+ * When true, will be something like "dm-1". -+ * -+ * (Is a hash table worth it to avoid reading one sysfs file?) -+ */ -+ if (_get_sysfs_dm_mpath(dt, sysfs_dir, holder_name)) { -+ log_debug_devs("filter-mpath %s holder %s %u:%u ignore mpath component", -+ dev_name(dev), holder_name, dm_dev_major, dm_dev_minor); -+ (void) dm_hash_insert_binary(mp->hash, &dm_dev_minor, sizeof(dm_dev_minor), (void*)2); - return 1; - } - -- (void) dm_hash_insert_binary(mp->hash, &minor, sizeof(minor), (void*)1); -+ (void) dm_hash_insert_binary(mp->hash, &dm_dev_minor, sizeof(dm_dev_minor), (void*)1); - - return 0; - } - --static int _dev_is_mpath(struct dev_filter *f, struct device *dev) -+static int _dev_is_mpath_component(struct cmd_context *cmd, struct dev_filter *f, struct device *dev) - { - if (dev->ext.src == DEV_EXT_NONE) -- return _native_dev_is_mpath(f, dev); -+ return _native_dev_is_mpath_component(cmd, f, dev); - - if (dev->ext.src == DEV_EXT_UDEV) -- return _udev_dev_is_mpath(dev); -+ return _udev_dev_is_mpath_component(dev); - - log_error(INTERNAL_ERROR "Missing hook for mpath recognition " - "using external device info source %s", dev_ext_name(dev)); -@@ -272,11 +334,11 @@ static int _dev_is_mpath(struct dev_filter *f, struct device *dev) - - #define MSG_SKIPPING "%s: Skipping mpath component device" - --static int _ignore_mpath(struct cmd_context *cmd, struct dev_filter *f, struct device *dev, const char *use_filter_name) -+static int _ignore_mpath_component(struct cmd_context *cmd, struct dev_filter *f, struct device *dev, const char *use_filter_name) - { - dev->filtered_flags &= ~DEV_FILTERED_MPATH_COMPONENT; - -- if (_dev_is_mpath(f, dev) == 1) { -+ if (_dev_is_mpath_component(cmd, f, dev) == 1) { - if (dev->ext.src == DEV_EXT_NONE) - log_debug_devs(MSG_SKIPPING, dev_name(dev)); - else -@@ -303,8 +365,8 @@ static void _destroy(struct dev_filter *f) - struct dev_filter *mpath_filter_create(struct dev_types *dt) - { - const char *sysfs_dir = dm_sysfs_dir(); -- struct dm_pool *mem; - struct mpath_priv *mp; -+ struct dm_pool *mem; - struct dm_hash_table *hash; - - if (!*sysfs_dir) { -@@ -328,19 +390,13 @@ struct dev_filter *mpath_filter_create(struct dev_types *dt) - goto bad; - } - -- if (!(mp = dm_pool_zalloc(mem, sizeof(*mp)))) { -- log_error("mpath filter allocation failed."); -- goto bad; -- } -- -- mp->f.passes_filter = _ignore_mpath; -+ mp->f.passes_filter = _ignore_mpath_component; - mp->f.destroy = _destroy; - mp->f.use_count = 0; - mp->f.private = mp; - mp->f.name = "mpath"; -- -- mp->mem = mem; - mp->dt = dt; -+ mp->mem = mem; - mp->hash = hash; - - log_debug_devs("mpath filter initialised."); diff --git a/lvm2-2_03_12-integrity-fix-segfault-on-error-path-when-replacing-.patch b/lvm2-2_03_12-integrity-fix-segfault-on-error-path-when-replacing-.patch deleted file mode 100644 index d4ece0d..0000000 --- a/lvm2-2_03_12-integrity-fix-segfault-on-error-path-when-replacing-.patch +++ /dev/null @@ -1,24 +0,0 @@ - lib/metadata/integrity_manip.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/lib/metadata/integrity_manip.c b/lib/metadata/integrity_manip.c -index 53ab1b3..abf90d8 100644 ---- a/lib/metadata/integrity_manip.c -+++ b/lib/metadata/integrity_manip.c -@@ -773,9 +773,13 @@ int lv_add_integrity_to_raid(struct logical_volume *lv, struct integrity_setting - bad: - log_error("Failed to add integrity."); - -- for (s = 0; s < revert_meta_lvs; s++) { -- if (!lv_remove(imeta_lvs[s])) -- log_error("New integrity metadata LV may require manual removal."); -+ if (revert_meta_lvs) { -+ for (s = 0; s < DEFAULT_RAID_MAX_IMAGES; s++) { -+ if (!imeta_lvs[s]) -+ continue; -+ if (!lv_remove(imeta_lvs[s])) -+ log_error("New integrity metadata LV may require manual removal."); -+ } - } - - if (!vg_write(vg) || !vg_commit(vg)) diff --git a/lvm2-2_03_12-label_scan-fix-missing-free-of-filtered_devs.patch b/lvm2-2_03_12-label_scan-fix-missing-free-of-filtered_devs.patch deleted file mode 100644 index b5bccfb..0000000 --- a/lvm2-2_03_12-label_scan-fix-missing-free-of-filtered_devs.patch +++ /dev/null @@ -1,19 +0,0 @@ - lib/label/label.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/lib/label/label.c b/lib/label/label.c -index e067a6b..e6dd4a1 100644 ---- a/lib/label/label.c -+++ b/lib/label/label.c -@@ -1243,6 +1243,11 @@ int label_scan(struct cmd_context *cmd) - free(devl); - } - -+ dm_list_iterate_items_safe(devl, devl2, &filtered_devs) { -+ dm_list_del(&devl->list); -+ free(devl); -+ } -+ - /* - * If hints were not available/usable, then we scanned all devs, - * and we now know which are PVs. Save this list of PVs we've diff --git a/lvm2-2_03_12-lvcreate-use-lv_passes_readonly_filter.patch b/lvm2-2_03_12-lvcreate-use-lv_passes_readonly_filter.patch deleted file mode 100644 index bb28cd7..0000000 --- a/lvm2-2_03_12-lvcreate-use-lv_passes_readonly_filter.patch +++ /dev/null @@ -1,66 +0,0 @@ - WHATS_NEW | 4 ++++ - lib/activate/activate.c | 5 +++++ - lib/activate/activate.h | 2 ++ - lib/metadata/lv_manip.c | 6 ++++++ - 4 files changed, 17 insertions(+) - -diff --git a/WHATS_NEW b/WHATS_NEW -index 3953c7e..c8f869c 100644 ---- a/WHATS_NEW -+++ b/WHATS_NEW -@@ -1,5 +1,9 @@ - Version 2.03.12 - - =================================== -+ Check if lvcreate passes read_only_volume_list with tags and skips zeroing. -+ Limit pool metadata spare to 16GiB. -+ Improves conversion and allocation of pool metadata. -+ Support thin pool metadata 15.88GiB, adds 64MiB, thin_pool_crop_metadata=0. - Fix problem with wiping of converted LVs. - Fix memleak in scanning (2.03.11). - Fix corner case allocation for thin-pools. -diff --git a/lib/activate/activate.c b/lib/activate/activate.c -index 7ed6441..de866fb 100644 ---- a/lib/activate/activate.c -+++ b/lib/activate/activate.c -@@ -466,6 +466,11 @@ static int _passes_readonly_filter(struct cmd_context *cmd, - return _lv_passes_volumes_filter(cmd, lv, cn, activation_read_only_volume_list_CFG); - } - -+int lv_passes_readonly_filter(const struct logical_volume *lv) -+{ -+ return _passes_readonly_filter(lv->vg->cmd, lv); -+} -+ - int library_version(char *version, size_t size) - { - if (!activation()) -diff --git a/lib/activate/activate.h b/lib/activate/activate.h -index 3f4d128..53c8631 100644 ---- a/lib/activate/activate.h -+++ b/lib/activate/activate.h -@@ -208,6 +208,8 @@ int lvs_in_vg_opened(const struct volume_group *vg); - - int lv_is_active(const struct logical_volume *lv); - -+int lv_passes_readonly_filter(const struct logical_volume *lv); -+ - /* Check is any component LV is active */ - const struct logical_volume *lv_component_is_active(const struct logical_volume *lv); - const struct logical_volume *lv_holder_is_active(const struct logical_volume *lv); -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 445c4ad..5ff64a3 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -7976,6 +7976,12 @@ static int _should_wipe_lv(struct lvcreate_params *lp, - first_seg(first_seg(lv)->pool_lv)->zero_new_blocks)) - return 0; - -+ if (warn && (lv_passes_readonly_filter(lv))) { -+ log_warn("WARNING: Read-only activated logical volume %s not zeroed.", -+ display_lvname(lv)); -+ return 0; -+ } -+ - /* Cannot zero read-only volume */ - if ((lv->status & LVM_WRITE) && - (lp->zero || lp->wipe_signatures)) diff --git a/lvm2-2_03_12-lvmlockd-sscanf-buffer-size-warnings.patch b/lvm2-2_03_12-lvmlockd-sscanf-buffer-size-warnings.patch deleted file mode 100644 index 9bc2f48..0000000 --- a/lvm2-2_03_12-lvmlockd-sscanf-buffer-size-warnings.patch +++ /dev/null @@ -1,29 +0,0 @@ - daemons/lvmlockd/lvmlockd-core.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c -index fea8ee6..c4abf66 100644 ---- a/daemons/lvmlockd/lvmlockd-core.c -+++ b/daemons/lvmlockd/lvmlockd-core.c -@@ -896,8 +896,9 @@ static int read_adopt_file(struct list_head *vg_lockd) - goto fail; - - memset(vg_uuid, 0, sizeof(vg_uuid)); -+ memset(lm_type_str, 0, sizeof(lm_type_str)); - -- if (sscanf(adopt_line, "VG: %63s %64s %16s %64s", -+ if (sscanf(adopt_line, "VG: %63s %64s %15s %64s", - vg_uuid, ls->vg_name, lm_type_str, ls->vg_args) != 4) { - goto fail; - } -@@ -916,8 +917,9 @@ static int read_adopt_file(struct list_head *vg_lockd) - r->type = LD_RT_LV; - - memset(vg_uuid, 0, sizeof(vg_uuid)); -+ memset(mode, 0, sizeof(mode)); - -- if (sscanf(adopt_line, "LV: %64s %64s %s %8s %u", -+ if (sscanf(adopt_line, "LV: %64s %64s %s %7s %u", - vg_uuid, r->name, r->lv_args, mode, &r->version) != 5) { - goto fail; - } diff --git a/lvm2-2_03_12-make-generate.patch b/lvm2-2_03_12-make-generate.patch deleted file mode 100644 index 2f4f682..0000000 --- a/lvm2-2_03_12-make-generate.patch +++ /dev/null @@ -1,18 +0,0 @@ - man/lvconvert.8_pregen | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/man/lvconvert.8_pregen b/man/lvconvert.8_pregen -index a47ccac..170eec8 100644 ---- a/man/lvconvert.8_pregen -+++ b/man/lvconvert.8_pregen -@@ -772,6 +772,10 @@ Add a cache to an LV, using a specified cache device. - .br - .RS 4 - .ad l -+[ \fB-c\fP|\fB--chunksize\fP \fISize\fP[k|UNIT] ] -+.ad b -+.br -+.ad l - [ \fB--cachesize\fP \fISize\fP[m|UNIT] ] - .ad b - .br diff --git a/lvm2-2_03_12-man-update-lvmthin.patch b/lvm2-2_03_12-man-update-lvmthin.patch deleted file mode 100644 index f61660f..0000000 --- a/lvm2-2_03_12-man-update-lvmthin.patch +++ /dev/null @@ -1,86 +0,0 @@ - man/lvmthin.7_main | 37 +++++++++++++++++++++++++------------ - 1 file changed, 25 insertions(+), 12 deletions(-) - -diff --git a/man/lvmthin.7_main b/man/lvmthin.7_main -index ce23431..e6f1d63 100644 ---- a/man/lvmthin.7_main -+++ b/man/lvmthin.7_main -@@ -394,7 +394,7 @@ the pmspare LV. - \& - - If thin pool metadata is damaged, it may be repairable. --Checking and repairing thin pool metadata is analagous to -+Checking and repairing thin pool metadata is analogous to - running fsck/repair on a file system. - - When a thin pool LV is activated, lvm runs the thin_check command -@@ -437,14 +437,24 @@ copy to the VG's pmspare LV. - If step 1 is successful, the thin pool metadata LV is replaced - with the pmspare LV containing the corrected metadata. - The previous thin pool metadata LV, containing the damaged metadata, --becomes visible with the new name ThinPoolLV_tmetaN (where N is 0,1,...). -- --If the repair works, the thin pool LV and its thin LVs can be activated, --and the LV containing the damaged thin pool metadata can be removed. --It may be useful to move the new metadata LV (previously pmspare) to a --better PV. -- --If the repair does not work, the thin pool LV and its thin LVs are lost. -+becomes visible with the new name ThinPoolLV_metaN (where N is 0,1,...). -+ -+If the repair works, the thin pool LV and its thin LVs can be activated. -+User should manually check if repaired thin pool kernel metadata -+has all data for all lvm2 known LVs by individual activation of -+every thin LV. When all works, user should continue with fsck of -+all filesystems present these such volumes. -+Once the thin pool is considered fully functional user may remove ThinPoolLV_metaN -+(the LV containing the damaged thin pool metadata) for possible -+space reuse. -+For a better performance it may be useful to pvmove the new repaired metadata LV -+(written to previous pmspare volume) to a better PV (i.e. SSD) -+ -+If the repair operation fails, the thin pool LV and its thin LVs -+are not accessible and it may be necessary to restore their content -+from a backup. In such case the content of unmodified original damaged -+ThinPoolLV_metaN volume can be used by your support for more -+advanced recovery methods. - - If metadata is manually restored with thin_repair directly, - the pool metadata LV can be manually swapped with another LV -@@ -452,6 +462,9 @@ containing new metadata: - - .B lvconvert --thinpool VG/ThinPoolLV --poolmetadata VG/NewThinMetaLV - -+Note: Thin pool metadata is compact so even small corruptions -+in them may result in significant portions of mappings to be lost. -+It is recommended to use fast resilient storage for them. - - .SS Activation of thin snapshots - -@@ -549,7 +562,7 @@ Command to extend thin pool data space: - .fi - - Other methods of increasing free data space in a thin pool LV --include removing a thin LV and its related snapsots, or running -+include removing a thin LV and its related snapshots, or running - fstrim on the file system using a thin LV. - - -@@ -689,7 +702,7 @@ with two configuration settings: - .B thin_pool_autoextend_threshold - .br - is a percentage full value that defines when the thin pool LV should be --extended. Setting this to 100 disables automatic extention. The minimum -+extended. Setting this to 100 disables automatic extension. The minimum - value is 50. - - .BR lvm.conf (5) -@@ -716,7 +729,7 @@ the --ignoremonitoring option can be used. With this option, the command - will not ask dmeventd to monitor the thin pool LV. - - .IP \[bu] --Setting thin_pool_autoextend_threshould to 100 disables automatic -+Setting thin_pool_autoextend_threshold to 100 disables automatic - extension of thin pool LVs, even if they are being monitored by dmeventd. - - .P diff --git a/lvm2-2_03_12-pool-limit-pmspare-to-16GiB.patch b/lvm2-2_03_12-pool-limit-pmspare-to-16GiB.patch deleted file mode 100644 index b41b370..0000000 --- a/lvm2-2_03_12-pool-limit-pmspare-to-16GiB.patch +++ /dev/null @@ -1,39 +0,0 @@ - lib/metadata/pool_manip.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c -index b67882e..1975cb4 100644 ---- a/lib/metadata/pool_manip.c -+++ b/lib/metadata/pool_manip.c -@@ -697,6 +697,8 @@ static struct logical_volume *_alloc_pool_metadata_spare(struct volume_group *vg - int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - struct dm_list *pvh, int poolmetadataspare) - { -+ /* Max usable size of any spare volume is currently 16GiB rouned to extent size */ -+ const uint64_t MAX_SIZE = (UINT64_C(2 * 16) * 1024 * 1024 + vg->extent_size - 1) / vg->extent_size; - struct logical_volume *lv = vg->pool_metadata_spare_lv; - uint32_t seg_mirrors; - struct lv_segment *seg; -@@ -706,8 +708,11 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - /* Find maximal size of metadata LV */ - dm_list_iterate_items(lvl, &vg->lvs) - if (lv_is_pool_metadata(lvl->lv) && -- (lvl->lv->le_count > extents)) -+ (lvl->lv->le_count > extents)) { - extents = lvl->lv->le_count; -+ if (extents >= MAX_SIZE) -+ break; -+ } - - if (!poolmetadataspare) { - /* TODO: Not showing when lvm.conf would define 'n' ? */ -@@ -718,6 +723,9 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - return 1; - } - -+ if (extents > MAX_SIZE) -+ extents = MAX_SIZE; -+ - if (!lv) { - if (!_alloc_pool_metadata_spare(vg, extents, pvh)) - return_0; diff --git a/lvm2-2_03_12-pools-fix-removal-of-spare-volume.patch b/lvm2-2_03_12-pools-fix-removal-of-spare-volume.patch deleted file mode 100644 index bec2210..0000000 --- a/lvm2-2_03_12-pools-fix-removal-of-spare-volume.patch +++ /dev/null @@ -1,92 +0,0 @@ - lib/metadata/lv_manip.c | 48 ++++++++++++++++++++++++------------------------ - 1 file changed, 24 insertions(+), 24 deletions(-) - -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 443d32c..c740ba2 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -1470,6 +1470,8 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete) - struct logical_volume *external_lv = NULL; - int is_raid10 = 0; - uint32_t data_copies = 0; -+ struct lv_list *lvl; -+ int is_last_pool = lv_is_pool(lv); - - if (!dm_list_empty(&lv->segments)) { - seg = first_seg(lv); -@@ -1581,6 +1583,28 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete) - !lv_update_and_reload(external_lv)) - return_0; - -+ /* When removing last pool, automatically drop the spare volume */ -+ if (is_last_pool && lv->vg->pool_metadata_spare_lv) { -+ /* TODO: maybe use a list of pools or a counter to avoid linear search through VG */ -+ dm_list_iterate_items(lvl, &lv->vg->lvs) -+ if (lv_is_thin_type(lvl->lv) || -+ lv_is_cache_type(lvl->lv)) { -+ is_last_pool = 0; -+ break; -+ } -+ -+ if (is_last_pool) { -+ /* This is purely internal LV volume, no question */ -+ if (!deactivate_lv(lv->vg->cmd, lv->vg->pool_metadata_spare_lv)) { -+ log_error("Unable to deactivate spare logical volume %s.", -+ display_lvname(lv->vg->pool_metadata_spare_lv)); -+ return 0; -+ } -+ if (!lv_remove(lv->vg->pool_metadata_spare_lv)) -+ return_0; -+ } -+ } -+ - return 1; - } - -@@ -6433,10 +6457,8 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, - struct logical_volume *lock_lv = lv; - struct lv_segment *cache_seg = NULL; - int ask_discard; -- struct lv_list *lvl; - struct seg_list *sl; - struct lv_segment *seg = first_seg(lv); -- int is_last_pool = lv_is_pool(lv); - - vg = lv->vg; - -@@ -6558,9 +6580,6 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, - */ - struct logical_volume *cachevol_lv = first_seg(lv)->pool_lv; - -- if (lv_is_cache_pool(cachevol_lv)) -- is_last_pool = 1; -- - if (!archive(vg)) - return_0; - -@@ -6667,25 +6686,6 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, - return 0; - } - -- if (is_last_pool && vg->pool_metadata_spare_lv) { -- /* When removed last pool, also remove the spare */ -- dm_list_iterate_items(lvl, &vg->lvs) -- if (lv_is_pool_metadata(lvl->lv)) { -- is_last_pool = 0; -- break; -- } -- if (is_last_pool) { -- /* This is purely internal LV volume, no question */ -- if (!deactivate_lv(cmd, vg->pool_metadata_spare_lv)) { -- log_error("Unable to deactivate spare logical volume %s.", -- display_lvname(vg->pool_metadata_spare_lv)); -- return 0; -- } -- if (!lv_remove(vg->pool_metadata_spare_lv)) -- return_0; -- } -- } -- - /* store it on disks */ - if (!vg_write(vg) || !vg_commit(vg)) - return_0; diff --git a/lvm2-2_03_12-pvck-fix-warning-and-exit-code-for-non-4k-mda1-offse.patch b/lvm2-2_03_12-pvck-fix-warning-and-exit-code-for-non-4k-mda1-offse.patch deleted file mode 100644 index 63020bd..0000000 --- a/lvm2-2_03_12-pvck-fix-warning-and-exit-code-for-non-4k-mda1-offse.patch +++ /dev/null @@ -1,24 +0,0 @@ - tools/pvck.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/tools/pvck.c b/tools/pvck.c -index c36e182..88350de 100644 ---- a/tools/pvck.c -+++ b/tools/pvck.c -@@ -1140,9 +1140,13 @@ static int _dump_label_and_pv_header(struct cmd_context *cmd, uint64_t labelsect - *mda1_offset = xlate64(dlocn->offset); - *mda1_size = xlate64(dlocn->size); - -- if (*mda1_offset != 4096) { -- log_print("CHECK: pv_header.disk_locn[%d].offset expected 4096 # for first mda", di); -- bad++; -+ /* -+ * mda1 offset is page size from machine that created it, -+ * warn if it's not one of the expected page sizes. -+ */ -+ if ((*mda1_offset != 4096) && (*mda1_offset != 8192) && (*mda1_offset != 65536)) { -+ log_print("WARNING: pv_header.disk_locn[%d].offset %llu is unexpected # for first mda", -+ di, (unsigned long long)*mda1_offset); - } - } else { - *mda2_offset = xlate64(dlocn->offset); diff --git a/lvm2-2_03_12-test-check-read_only_volume_list-tagging-works.patch b/lvm2-2_03_12-test-check-read_only_volume_list-tagging-works.patch deleted file mode 100644 index bdcc15b..0000000 --- a/lvm2-2_03_12-test-check-read_only_volume_list-tagging-works.patch +++ /dev/null @@ -1,19 +0,0 @@ - test/shell/tags.sh | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/test/shell/tags.sh b/test/shell/tags.sh -index fd1b332..5b636a8 100644 ---- a/test/shell/tags.sh -+++ b/test/shell/tags.sh -@@ -52,6 +52,11 @@ check lv_field @firstlvtag1 tags "firstlvtag1" - not check lv_field @secondlvtag1 tags "firstlvtag1" - check lv_field $vg1/$lv2 tags "secondlvtag1" - not check lv_field $vg1/$lv1 tags "secondlvtag1" -+ -+# LV is not zeroed when tag matches read only volume list -+lvcreate -l1 $vg1 --addtag "RO" --config "activation/read_only_volume_list = [ \"@RO\" ]" 2>&1 | tee out -+grep "not zeroed" out -+ - vgremove -f $vg1 - - # lvchange with --addtag and --deltag diff --git a/lvm2-2_03_12-tests-check-16G-thin-pool-metadata-size.patch b/lvm2-2_03_12-tests-check-16G-thin-pool-metadata-size.patch deleted file mode 100644 index ae05b76..0000000 --- a/lvm2-2_03_12-tests-check-16G-thin-pool-metadata-size.patch +++ /dev/null @@ -1,98 +0,0 @@ - test/shell/thin-16g.sh | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 88 insertions(+) - create mode 100644 test/shell/thin-16g.sh - -diff --git a/test/shell/thin-16g.sh b/test/shell/thin-16g.sh -new file mode 100644 -index 0000000..ee7e22e ---- /dev/null -+++ b/test/shell/thin-16g.sh -@@ -0,0 +1,88 @@ -+#!/usr/bin/env bash -+ -+# Copyright (C) 2021 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 usability of 16g thin pool metadata LV -+ -+ -+SKIP_WITH_LVMPOLLD=1 -+ -+. lib/inittest -+ -+aux have_thin 1 0 0 || skip -+ -+aux prepare_vg 1 50000 -+ -+lvcreate -T -L10 --poolmetadatasize 16g $vg/pool -+check lv_field $vg/pool_tmeta size "<15.88g" -+lvremove -f $vg -+ -+# Cropped way -+lvcreate -T -L10 --poolmetadatasize 16g --config 'allocation/thin_pool_crop_metadata=1' $vg/pool -+check lv_field $vg/pool_tmeta size "15.81g" -+lvremove -f $vg -+ -+lvcreate -L16G -n meta $vg -+lvcreate -L10 -n pool $vg -+lvconvert --yes --thinpool $vg/pool --poolmetadata meta -+# Uncropped size 33554432 sectors - 16GiB -+dmsetup table ${vg}-pool_tmeta | grep 33554432 -+lvremove -f $vg -+ -+# Uses 20G metadata volume, but crops the size in DM table -+lvcreate -L20G -n meta $vg -+lvcreate -L10 -n pool $vg -+lvconvert --yes --thinpool $vg/pool --poolmetadata meta --config 'allocation/thin_pool_crop_metadata=1' -+check lv_field $vg/lvol0_pmspare size "16.00g" -+# Size should be cropped to 33161216 sectors ~15.81GiB -+dmsetup table ${vg}-pool_tmeta | grep 33161216 -+ -+# Also size remains unchanged with activation has no cropping, -+# but metadata have no CROP_METADATA flag set -+lvchange -an $vg -+lvchange -ay $vg -+# Size still stays cropped to 33161216 sectors ~15.81GiB -+dmsetup table ${vg}-pool_tmeta | grep 33161216 -+lvremove -f $vg -+ -+# Minimal size is 2M -+lvcreate -L1M -n meta $vg -+lvcreate -L10 -n pool $vg -+not lvconvert --yes --thinpool $vg/pool --poolmetadata meta -+lvremove -f $vg -+ -+# Uses 20G metadata volume, but crops the size in DM table -+lvcreate -L1 --poolmetadatasize 10G -T $vg/pool -+lvresize -L+10G $vg/pool_tmeta --config 'allocation/thin_pool_crop_metadata=1' -+check lv_field $vg/lvol0_pmspare size "15.81g" -+# Size should be cropped to 33161216 sectors ~15.81GiB -+dmsetup table ${vg}-pool_tmeta | grep 33161216 -+ -+# Without cropping we can grop to ~15.88GiB -+lvresize -L+10G $vg/pool_tmeta -+check lv_field $vg/lvol0_pmspare size "<15.88g" -+lvremove -f $vg -+ -+# User has already 'bigger' metadata and wants them uncropped -+lvcreate -L16G -n meta $vg -+lvcreate -L10 -n pool $vg -+lvconvert --yes --thinpool $vg/pool --poolmetadata meta --config 'allocation/thin_pool_crop_metadata=1' -+ -+# No change with cropping -+lvresize -l+1 $vg/pool_tmeta --config 'allocation/thin_pool_crop_metadata=1' -+dmsetup table ${vg}-pool_tmeta | grep 33161216 -+ -+# Resizes to 'uncropped' size 16GiB with ANY size -+lvresize -l+1 $vg/pool_tmeta -+dmsetup table ${vg}-pool_tmeta | grep 33554432 -+check lv_field $vg/pool_tmeta size "16.00g" -+ -+vgremove -ff $vg diff --git a/lvm2-2_03_12-tests-check-full-zeroing-of-thin-pool-metadata.patch b/lvm2-2_03_12-tests-check-full-zeroing-of-thin-pool-metadata.patch deleted file mode 100644 index d7edcc7..0000000 --- a/lvm2-2_03_12-tests-check-full-zeroing-of-thin-pool-metadata.patch +++ /dev/null @@ -1,78 +0,0 @@ - test/shell/thin-zero-meta.sh | 68 ++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 68 insertions(+) - create mode 100644 test/shell/thin-zero-meta.sh - -diff --git a/test/shell/thin-zero-meta.sh b/test/shell/thin-zero-meta.sh -new file mode 100644 -index 0000000..6a15a73 ---- /dev/null -+++ b/test/shell/thin-zero-meta.sh -@@ -0,0 +1,68 @@ -+#!/usr/bin/env bash -+ -+# Copyright (C) 2021 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 how zeroing of thin-pool metadata works -+ -+SKIP_WITH_LVMLOCKD=1 -+SKIP_WITH_LVMPOLLD=1 -+ -+export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false} -+ -+. lib/inittest -+ -+# -+# Main -+# -+aux have_thin 1 3 0 || skip -+aux have_cache 1 3 0 || skip -+ -+aux prepare_vg 3 40000 -+ -+# Create mostly-zero devs only front of it has some 'real' back-end -+aux zero_dev "$dev1" "$(( $(get first_extent_sector "$dev1") + 8192 )):" -+aux zero_dev "$dev2" "$(( $(get first_extent_sector "$dev2") + 8192 )):" -+aux zero_dev "$dev3" "$(( $(get first_extent_sector "$dev3") + 8192 )):" -+ -+# Prepare randomly filled 4M LV on dev2 -+lvcreate -L16G -n $lv1 $vg "$dev2" -+dd if=/dev/urandom of="$DM_DEV_DIR/$vg/$lv1" bs=1M count=4 oflag=direct || true -+lvremove -f $vg -+ -+for i in 0 1 -+do -+ aux lvmconf "allocation/zero_metadata = $i" -+ -+ # Lvm2 should allocate metadata on dev2 -+ lvcreate -T -L10G --poolmetadatasize 16G $vg/pool "$dev1" "$dev2" -+ lvchange -an $vg -+ -+ lvs -ao+seg_pe_ranges $vg -+ lvchange -ay $vg/pool_tmeta --yes -+ -+ # Skip past 1.2M which is 'created' by thin-pool initialization -+ hexdump -C -n 200 -s 2000000 "$DM_DEV_DIR/$vg/pool_tmeta" | tee out -+ -+ # When fully zeroed, it should be zero - so almost no output from hexdump -+ case "$i" in -+ 0) test $(wc -l < out) -ge 10 ;; # should not be zeroed -+ 1) test $(wc -l < out) -le 10 ;; # should be zeroed -+ esac -+ -+ lvremove -f $vg/pool -+done -+ -+# Check lvm2 spots error during full zeroing of metadata device -+aux error_dev "$dev2" "$(( $(get first_extent_sector "$dev2") + 32 )):" -+not lvcreate -T -L10G --poolmetadatasize 16G $vg/pool "$dev1" "$dev2" |& tee err -+grep "Failed to initialize logical volume" err -+ -+vgremove -ff $vg diff --git a/lvm2-2_03_12-tests-check-support-for-online-vdo-rename.patch b/lvm2-2_03_12-tests-check-support-for-online-vdo-rename.patch deleted file mode 100644 index 6c5ad63..0000000 --- a/lvm2-2_03_12-tests-check-support-for-online-vdo-rename.patch +++ /dev/null @@ -1,128 +0,0 @@ - test/shell/lvcreate-vdo-cache.sh | 17 +------- - test/shell/lvrename-vdo.sh | 88 ++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 90 insertions(+), 15 deletions(-) - create mode 100644 test/shell/lvrename-vdo.sh - -diff --git a/test/shell/lvcreate-vdo-cache.sh b/test/shell/lvcreate-vdo-cache.sh -index c31cccc..6cf8437 100644 ---- a/test/shell/lvcreate-vdo-cache.sh -+++ b/test/shell/lvcreate-vdo-cache.sh -@@ -32,22 +32,9 @@ export MKE2FS_CONFIG="$TESTDIR/lib/mke2fs.conf" - - aux prepare_vg 1 9000 - --lvcreate --vdo -L4G -V2G --name $lv1 $vg/vpool1 -- -+lvcreate --vdo -L4G -V2G --name $lv1 $vg/vpool - # Test caching VDOPoolLV --lvcreate -H -L10 $vg/vpool1 -- --# Current VDO target driver cannot handle online rename --# once this will be supported - update this test --not lvrename $vg/vpool1 $vg/vpool 2>&1 | tee out --grep "Cannot rename" out -- --lvchange -an $vg -- --# Ofline should work --lvrename $vg/vpool1 $vg/vpool -- --lvchange -ay $vg -+lvcreate -H -L10 $vg/vpool - - mkfs.ext4 -E nodiscard "$DM_DEV_DIR/$vg/$lv1" - -diff --git a/test/shell/lvrename-vdo.sh b/test/shell/lvrename-vdo.sh -new file mode 100644 -index 0000000..1417d9f ---- /dev/null -+++ b/test/shell/lvrename-vdo.sh -@@ -0,0 +1,88 @@ -+#!/usr/bin/env bash -+ -+# Copyright (C) 2021 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 -+ -+# Check online renaming of VDO devices works -+ -+ -+SKIP_WITH_LVMPOLLD=1 -+ -+. lib/inittest -+ -+# -+# Main -+# -+ -+aux have_vdo 6 2 1 || skip -+aux have_cache 1 3 0 || skip -+aux have_raid 1 3 0 || skip -+ -+aux prepare_vg 2 5000 -+ -+lvcreate --vdo -L4G -V2G --name $lv1 $vg/vpool1 -+lvrename $vg/vpool1 vpool2 -+check lv_exists $vg $lv1 vpool2 vpool2_vdata -+ -+lvremove -ff $vg -+ -+# With version >= 6.2.3 online rename should work -+if aux have_vdo 6 2 3 ; then -+ -+### CACHE #### -+lvcreate --vdo -L4G -V2G --name $lv1 $vg/vpool1 -+lvcreate -H -L10 $vg/vpool1 -+lvrename $vg/vpool1 $vg/vpool2 -+check lv_exists $vg vpool2 vpool2_vdata -+lvremove -ff $vg -+ -+### RAID #### -+lvcreate --type raid1 -L4G --nosync --name vpool1 $vg -+lvconvert --yes --type vdo-pool $vg/vpool1 -+lvrename $vg/vpool1 $vg/vpool2 -+check lv_exists $vg vpool2 vpool2_vdata vpool2_vdata_rimage_0 -+lvremove -ff $vg -+ -+fi # >= 6.2.3 -+ -+# Check when VDO target does not support online resize -+aux lvmconf "global/vdo_disabled_features = [ \"online_rename\" ]" -+ -+ -+### CACHE #### -+lvcreate --vdo -L4G -V2G --name $lv1 $vg/vpool1 -+lvcreate -H -L10 $vg/vpool1 -+ -+# VDO target driver cannot handle online rename -+not lvrename $vg/vpool1 $vg/vpool2 2>&1 | tee out -+grep "Cannot rename" out -+ -+# Ofline should work -+lvchange -an $vg -+lvrename $vg/vpool1 $vg/vpool2 -+lvchange -ay $vg -+check lv_exists $vg $lv1 vpool2 vpool2_vdata -+lvremove -ff $vg -+ -+ -+### RAID #### -+lvcreate --type raid1 -L4G --nosync --name vpool1 $vg -+lvconvert --yes --type vdo-pool $vg/vpool1 -+not lvrename $vg/vpool1 $vg/vpool2 2>&1 | tee out -+grep "Cannot rename" out -+ -+# Ofline should work -+lvchange -an $vg -+lvrename $vg/vpool1 $vg/vpool2 -+lvchange -ay $vg -+check lv_exists $vg vpool2 vpool2_vdata vpool2_vdata_rimage_0 -+lvremove -ff $vg -+ -+vgremove -ff $vg diff --git a/lvm2-2_03_12-tests-check-thin-pool-corner-case-allocs.patch b/lvm2-2_03_12-tests-check-thin-pool-corner-case-allocs.patch deleted file mode 100644 index 04962b8..0000000 --- a/lvm2-2_03_12-tests-check-thin-pool-corner-case-allocs.patch +++ /dev/null @@ -1,47 +0,0 @@ - test/shell/lvcreate-thin-limits.sh | 30 ++++++++++++++++++++++++++---- - 1 file changed, 26 insertions(+), 4 deletions(-) - -diff --git a/test/shell/lvcreate-thin-limits.sh b/test/shell/lvcreate-thin-limits.sh -index 6a9c33d..5dcc160 100644 ---- a/test/shell/lvcreate-thin-limits.sh -+++ b/test/shell/lvcreate-thin-limits.sh -@@ -27,13 +27,35 @@ aux can_use_16T || skip - aux have_thin 1 0 0 || skip - which mkfs.ext4 || skip - --aux prepare_pvs 1 16777216 -+# 16T device -+aux prepare_pvs 2 8388608 - get_devs - --vgcreate $SHARED -s 4K "$vg" "${DEVICES[@]}" -+# gives 16777215M device -+vgcreate $SHARED -s 4M "$vg" "${DEVICES[@]}" - --not lvcreate -T -L15.995T --poolmetadatasize 5G $vg/pool -+# For 1st. pass only single PV -+lvcreate -l100%PV --name $lv1 $vg "$dev2" - --lvs -ao+seg_pe_ranges $vg -+for i in 1 0 -+do -+ SIZE=$(get vg_field "$vg" vg_free --units m) -+ SIZE=${SIZE%%\.*} -+ -+ # ~16T - 2 * 5G + something -> should not fit -+ not lvcreate -Zn -T -L$(( SIZE - 2 * 5 * 1024 + 1 )) --poolmetadatasize 5G $vg/pool -+ -+ check vg_field "$vg" lv_count "$i" -+ -+ # Should fit data + metadata + pmspare -+ lvcreate -Zn -T -L$(( SIZE - 2 * 5 * 1024 )) --poolmetadatasize 5G $vg/pool -+ -+ check vg_field "$vg" vg_free "0" -+ -+ lvs -ao+seg_pe_ranges $vg -+ -+ # Remove everything for 2nd. pass -+ lvremove -ff $vg -+done - - vgremove -ff $vg diff --git a/lvm2-2_03_12-tests-update-thin-and-cache-checked-messages.patch b/lvm2-2_03_12-tests-update-thin-and-cache-checked-messages.patch deleted file mode 100644 index f4ccd37..0000000 --- a/lvm2-2_03_12-tests-update-thin-and-cache-checked-messages.patch +++ /dev/null @@ -1,77 +0,0 @@ - test/shell/lvconvert-thin.sh | 2 +- - test/shell/lvcreate-cache.sh | 12 +++++------- - test/shell/lvcreate-thin-big.sh | 10 +++++----- - 3 files changed, 11 insertions(+), 13 deletions(-) - -diff --git a/test/shell/lvconvert-thin.sh b/test/shell/lvconvert-thin.sh -index 1319655..ee85691 100644 ---- a/test/shell/lvconvert-thin.sh -+++ b/test/shell/lvconvert-thin.sh -@@ -128,7 +128,7 @@ lvcreate -L1T -n $lv1 $vg - lvcreate -L32G -n $lv2 $vg - # Warning about bigger then needed - lvconvert --yes --thinpool $vg/$lv1 --poolmetadata $vg/$lv2 2>&1 | tee err --grep "WARNING: Maximum" err -+grep -i "maximum" err - lvremove -f $vg - - -diff --git a/test/shell/lvcreate-cache.sh b/test/shell/lvcreate-cache.sh -index 2c46e21..4d9d75e 100644 ---- a/test/shell/lvcreate-cache.sh -+++ b/test/shell/lvcreate-cache.sh -@@ -27,7 +27,6 @@ aux prepare_vg 5 80000 - - aux lvmconf 'global/cache_disabled_features = [ "policy_smq" ]' - -- - ####################### - # Cache_Pool creation # - ####################### -@@ -173,17 +172,16 @@ dmsetup table ${vg}-$lv1 | grep cache # ensure it is loaded in kernel - - lvremove -f $vg - -- - # Check minimum cache pool metadata size --lvcreate -l 1 --type cache-pool --poolmetadatasize 1 $vg 2>out --grep "WARNING: Minimum" out -+lvcreate -l 1 --type cache-pool --poolmetadatasize 1 $vg 2>&1 | tee out -+grep -i "minimal" out -+ - - # FIXME: This test is failing in allocator with smaller VG sizes --lvcreate -l 1 --type cache-pool --poolmetadatasize 17G $vg 2>out --grep "WARNING: Maximum" out -+lvcreate -l 1 --type cache-pool --poolmetadatasize 17G $vg 2>&1 | tee out -+grep -i "maximum" out - - lvremove -f $vg -- - ######################################## - # Cache conversion and r/w permissions # - ######################################## -diff --git a/test/shell/lvcreate-thin-big.sh b/test/shell/lvcreate-thin-big.sh -index 0b622b7..2549035 100644 ---- a/test/shell/lvcreate-thin-big.sh -+++ b/test/shell/lvcreate-thin-big.sh -@@ -31,14 +31,14 @@ vgcreate $SHARED -s 64K "$vg" "${DEVICES[@]}" - - # Size 0 is not valid - invalid lvcreate -L4M --chunksize 128 --poolmetadatasize 0 -T $vg/pool1 2>out --lvcreate -Zn -L4M --chunksize 128 --poolmetadatasize 16k -T $vg/pool1 2>out --grep "WARNING: Minimum" out -+lvcreate -Zn -L4M --chunksize 128 --poolmetadatasize 16k -T $vg/pool1 2>&1 >out -+grep -i "minimal" out - # FIXME: metadata allocation fails, if PV doesn't have at least 16GB - # i.e. pool metadata device cannot be multisegment --lvcreate -Zn -L4M --chunksize 64k --poolmetadatasize 17G -T $vg/pool2 2>out --grep "WARNING: Maximum" out -+lvcreate -Zn -L4M --chunksize 64k --poolmetadatasize 17G -T $vg/pool2 2>&1 >out -+grep "maximum" out - check lv_field $vg/pool1_tmeta size "2.00m" --check lv_field $vg/pool2_tmeta size "15.81g" -+check lv_field $vg/pool2_tmeta size "<15.88g" - - # Check we do report correct percent values. - lvcreate --type zero -L3G $vg -n pool3 diff --git a/lvm2-2_03_12-thin-improve-16g-support-for-thin-pool-metadata.patch b/lvm2-2_03_12-thin-improve-16g-support-for-thin-pool-metadata.patch deleted file mode 100644 index 8347ad4..0000000 --- a/lvm2-2_03_12-thin-improve-16g-support-for-thin-pool-metadata.patch +++ /dev/null @@ -1,694 +0,0 @@ - conf/example.conf.in | 7 +++ - device_mapper/all.h | 16 +++++-- - device_mapper/libdm-deptree.c | 39 ++++++++++++----- - lib/activate/dev_manager.c | 8 ++-- - lib/config/config_settings.h | 5 +++ - lib/config/defaults.h | 2 + - lib/format_text/flags.c | 1 + - lib/metadata/lv_manip.c | 31 ++++++++++++++ - lib/metadata/merge.c | 2 + - lib/metadata/metadata-exported.h | 11 +++++ - lib/metadata/metadata.h | 13 ++++++ - lib/metadata/pool_manip.c | 46 ++++++++++++++++++++ - lib/metadata/thin_manip.c | 92 ++++++++++++++++++++++++++-------------- - lib/thin/thin.c | 22 +++++++--- - man/lvmthin.7_main | 10 ++++- - tools/lvconvert.c | 4 ++ - tools/lvcreate.c | 2 + - 17 files changed, 256 insertions(+), 55 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index d149ed9..107a071 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -494,6 +494,13 @@ allocation { - # This configuration option has an automatic default value. - # thin_pool_metadata_require_separate_pvs = 0 - -+ # Configuration option allocation/thin_pool_crop_metadata. -+ # Older version of lvm2 cropped pool's metadata size to 15.81 GiB. -+ # This is slightly less then the actual maximum 15.88 GiB. -+ # For compatibility with older version and use of cropped size set to 1. -+ # This configuration option has an automatic default value. -+ # thin_pool_crop_metadata = 0 -+ - # Configuration option allocation/thin_pool_zero. - # Thin pool data chunks are zeroed before they are first used. - # Zeroing with a larger thin pool chunk size reduces performance. -diff --git a/device_mapper/all.h b/device_mapper/all.h -index 1080d25..489ca1c 100644 ---- a/device_mapper/all.h -+++ b/device_mapper/all.h -@@ -1072,10 +1072,10 @@ int dm_tree_node_add_replicator_dev_target(struct dm_tree_node *node, - #define DM_THIN_MIN_DATA_BLOCK_SIZE (UINT32_C(128)) - #define DM_THIN_MAX_DATA_BLOCK_SIZE (UINT32_C(2097152)) - /* -- * Max supported size for thin pool metadata device (17112760320 bytes) -- * Limitation is hardcoded into the kernel and bigger device size -- * is not accepted. -+ * Max supported size for thin pool metadata device (17045913600 bytes) - * drivers/md/dm-thin-metadata.h THIN_METADATA_MAX_SECTORS -+ * But here DM_THIN_MAX_METADATA_SIZE got defined incorrectly -+ * Correct size is (UINT64_C(255) * ((1 << 14) - 64) * (4096 / (1 << 9))) - */ - #define DM_THIN_MAX_METADATA_SIZE (UINT64_C(255) * (1 << 14) * (4096 / (1 << 9)) - 256 * 1024) - -@@ -1088,6 +1088,16 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node, - uint64_t low_water_mark, - unsigned skip_block_zeroing); - -+int dm_tree_node_add_thin_pool_target_v1(struct dm_tree_node *node, -+ uint64_t size, -+ uint64_t transaction_id, -+ const char *metadata_uuid, -+ const char *pool_uuid, -+ uint32_t data_block_size, -+ uint64_t low_water_mark, -+ unsigned skip_block_zeroing, -+ unsigned crop_metadata); -+ - /* Supported messages for thin provision target */ - typedef enum { - DM_THIN_MESSAGE_CREATE_SNAP, /* device_id, origin_id */ -diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c -index 6ce956f..5b60dc9 100644 ---- a/device_mapper/libdm-deptree.c -+++ b/device_mapper/libdm-deptree.c -@@ -3979,6 +3979,24 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node, - uint64_t low_water_mark, - unsigned skip_block_zeroing) - { -+ return dm_tree_node_add_thin_pool_target_v1(node, size, transaction_id, -+ metadata_uuid, pool_uuid, -+ data_block_size, -+ low_water_mark, -+ skip_block_zeroing, -+ 1); -+} -+ -+int dm_tree_node_add_thin_pool_target_v1(struct dm_tree_node *node, -+ uint64_t size, -+ uint64_t transaction_id, -+ const char *metadata_uuid, -+ const char *pool_uuid, -+ uint32_t data_block_size, -+ uint64_t low_water_mark, -+ unsigned skip_block_zeroing, -+ unsigned crop_metadata) -+{ - struct load_segment *seg, *mseg; - uint64_t devsize = 0; - -@@ -4005,17 +4023,18 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node, - if (!_link_tree_nodes(node, seg->metadata)) - return_0; - -- /* FIXME: more complex target may need more tweaks */ -- dm_list_iterate_items(mseg, &seg->metadata->props.segs) { -- devsize += mseg->size; -- if (devsize > DM_THIN_MAX_METADATA_SIZE) { -- log_debug_activation("Ignoring %" PRIu64 " of device.", -- devsize - DM_THIN_MAX_METADATA_SIZE); -- mseg->size -= (devsize - DM_THIN_MAX_METADATA_SIZE); -- devsize = DM_THIN_MAX_METADATA_SIZE; -- /* FIXME: drop remaining segs */ -+ if (crop_metadata) -+ /* FIXME: more complex target may need more tweaks */ -+ dm_list_iterate_items(mseg, &seg->metadata->props.segs) { -+ devsize += mseg->size; -+ if (devsize > DM_THIN_MAX_METADATA_SIZE) { -+ log_debug_activation("Ignoring %" PRIu64 " of device.", -+ devsize - DM_THIN_MAX_METADATA_SIZE); -+ mseg->size -= (devsize - DM_THIN_MAX_METADATA_SIZE); -+ devsize = DM_THIN_MAX_METADATA_SIZE; -+ /* FIXME: drop remaining segs */ -+ } - } -- } - - if (!(seg->pool = dm_tree_find_node_by_uuid(node->dtree, pool_uuid))) { - log_error("Missing pool uuid %s.", pool_uuid); -diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c -index 8d27bd3..9a25482 100644 ---- a/lib/activate/dev_manager.c -+++ b/lib/activate/dev_manager.c -@@ -261,7 +261,7 @@ static int _info_run(const char *dlid, struct dm_info *dminfo, - int dmtask; - int with_flush; /* TODO: arg for _info_run */ - void *target = NULL; -- uint64_t target_start, target_length, start, length; -+ uint64_t target_start, target_length, start, length, length_crop = 0; - char *target_name, *target_params; - const char *devname; - -@@ -297,7 +297,7 @@ static int _info_run(const char *dlid, struct dm_info *dminfo, - /* Uses max DM_THIN_MAX_METADATA_SIZE sectors for metadata device */ - if (lv_is_thin_pool_metadata(seg_status->seg->lv) && - (length > DM_THIN_MAX_METADATA_SIZE)) -- length = DM_THIN_MAX_METADATA_SIZE; -+ length_crop = DM_THIN_MAX_METADATA_SIZE; - - /* Uses virtual size with headers for VDO pool device */ - if (lv_is_vdo_pool(seg_status->seg->lv)) -@@ -310,7 +310,9 @@ static int _info_run(const char *dlid, struct dm_info *dminfo, - target = dm_get_next_target(dmt, target, &target_start, - &target_length, &target_name, &target_params); - -- if ((start == target_start) && (length == target_length)) -+ if ((start == target_start) && -+ ((length == target_length) || -+ (length_crop && (length_crop == target_length)))) - break; /* Keep target_params when matching segment is found */ - - target_params = NULL; /* Marking this target_params unusable */ -diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index 3c4032e..cb4e23a 100644 ---- a/lib/config/config_settings.h -+++ b/lib/config/config_settings.h -@@ -628,6 +628,11 @@ cfg(allocation_cache_pool_max_chunks_CFG, "cache_pool_max_chunks", allocation_CF - cfg(allocation_thin_pool_metadata_require_separate_pvs_CFG, "thin_pool_metadata_require_separate_pvs", allocation_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_THIN_POOL_METADATA_REQUIRE_SEPARATE_PVS, vsn(2, 2, 89), NULL, 0, NULL, - "Thin pool metadata and data will always use different PVs.\n") - -+cfg(allocation_thin_pool_crop_metadata_CFG, "thin_pool_crop_metadata", allocation_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_THIN_POOL_CROP_METADATA, vsn(2, 3, 12), NULL, 0, NULL, -+ "Older version of lvm2 cropped pool's metadata size to 15.81 GiB.\n" -+ "This is slightly less then the actual maximum 15.88 GiB.\n" -+ "For compatibility with older version and use of cropped size set to 1.\n") -+ - cfg(allocation_thin_pool_zero_CFG, "thin_pool_zero", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_THIN_POOL_ZERO, vsn(2, 2, 99), NULL, 0, NULL, - "Thin pool data chunks are zeroed before they are first used.\n" - "Zeroing with a larger thin pool chunk size reduces performance.\n") -diff --git a/lib/config/defaults.h b/lib/config/defaults.h -index 708a575..bcc20cc 100644 ---- a/lib/config/defaults.h -+++ b/lib/config/defaults.h -@@ -118,6 +118,8 @@ - #define DEFAULT_THIN_REPAIR_OPTION1 "" - #define DEFAULT_THIN_REPAIR_OPTIONS_CONFIG "#S" DEFAULT_THIN_REPAIR_OPTION1 - #define DEFAULT_THIN_POOL_METADATA_REQUIRE_SEPARATE_PVS 0 -+#define DEFAULT_THIN_POOL_CROP_METADATA 0 -+#define DEFAULT_THIN_POOL_MAX_METADATA_SIZE_V1_KB (UINT64_C(255) * ((1 << 14) - 64) * 4) /* KB */ /* 0x3f8040 blocks */ - #define DEFAULT_THIN_POOL_MAX_METADATA_SIZE (DM_THIN_MAX_METADATA_SIZE / 2) /* KB */ - #define DEFAULT_THIN_POOL_MIN_METADATA_SIZE 2048 /* KB */ - #define DEFAULT_THIN_POOL_OPTIMAL_METADATA_SIZE (128 * 1024) /* KB */ -diff --git a/lib/format_text/flags.c b/lib/format_text/flags.c -index bc93a5d..4cee14a 100644 ---- a/lib/format_text/flags.c -+++ b/lib/format_text/flags.c -@@ -72,6 +72,7 @@ static const struct flag _lv_flags[] = { - {LV_ACTIVATION_SKIP, "ACTIVATION_SKIP", COMPATIBLE_FLAG}, - {LV_ERROR_WHEN_FULL, "ERROR_WHEN_FULL", COMPATIBLE_FLAG}, - {LV_METADATA_FORMAT, "METADATA_FORMAT", SEGTYPE_FLAG}, -+ {LV_CROP_METADATA, "CROP_METADATA", SEGTYPE_FLAG}, - {LV_CACHE_VOL, "CACHE_VOL", COMPATIBLE_FLAG}, - {LV_CACHE_USES_CACHEVOL, "CACHE_USES_CACHEVOL", SEGTYPE_FLAG}, - {LV_NOSCAN, NULL, 0}, -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index 443d32c..445c4ad 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -5384,6 +5384,8 @@ static int _lvresize_adjust_extents(struct logical_volume *lv, - uint32_t existing_extents; - uint32_t seg_size = 0; - uint32_t new_extents; -+ uint64_t max_metadata_size; -+ thin_crop_metadata_t crop; - int reducing = 0; - - seg_last = last_seg(lv); -@@ -5544,6 +5546,33 @@ static int _lvresize_adjust_extents(struct logical_volume *lv, - return 1; - } - } -+ } else if (lv_is_thin_pool_metadata(lv)) { -+ if (!(seg = get_only_segment_using_this_lv(lv))) -+ return_0; -+ -+ max_metadata_size = get_thin_pool_max_metadata_size(cmd, vg->profile, &crop); -+ -+ if (((uint64_t)lp->extents * vg->extent_size) > max_metadata_size) { -+ lp->extents = (max_metadata_size + vg->extent_size - 1) / vg->extent_size; -+ log_print_unless_silent("Reached maximum pool metadata size %s (%" PRIu32 " extents).", -+ display_size(vg->cmd, max_metadata_size), lp->extents); -+ } -+ -+ if (existing_logical_extents >= lp->extents) -+ lp->extents = existing_logical_extents; -+ -+ crop = get_thin_pool_crop_metadata(cmd, crop, (uint64_t)lp->extents * vg->extent_size); -+ -+ if (seg->crop_metadata != crop) { -+ seg->crop_metadata = crop; -+ seg->lv->status |= LV_CROP_METADATA; -+ /* Crop change require reload even if there no size change */ -+ lp->size_changed = 1; -+ log_print_unless_silent("Thin pool will use metadata without cropping."); -+ } -+ -+ if (!(seg_size = lp->extents - existing_logical_extents)) -+ return 1; /* No change in metadata size */ - } - } else { /* If reducing, find stripes, stripesize & size of last segment */ - if (lp->stripes || lp->stripe_size || lp->mirrors) -@@ -8388,6 +8417,8 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, - first_seg(lv)->chunk_size = lp->chunk_size; - first_seg(lv)->zero_new_blocks = lp->zero_new_blocks; - first_seg(lv)->discards = lp->discards; -+ if ((first_seg(lv)->crop_metadata = lp->crop_metadata) == THIN_CROP_METADATA_NO) -+ lv->status |= LV_CROP_METADATA; - if (!recalculate_pool_chunk_size_with_dev_hints(lv, lp->thin_chunk_size_calc_policy)) { - stack; - goto revert_new_lv; -diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c -index 0aa2293..eff59ae 100644 ---- a/lib/metadata/merge.c -+++ b/lib/metadata/merge.c -@@ -495,6 +495,8 @@ static void _check_lv_segment(struct logical_volume *lv, struct lv_segment *seg, - seg_error("sets discards"); - if (!dm_list_empty(&seg->thin_messages)) - seg_error("sets thin_messages list"); -+ if (seg->lv->status & LV_CROP_METADATA) -+ seg_error("sets CROP_METADATA flag"); - } - - if (seg_is_thin_volume(seg)) { -diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h -index 54dc29f..0e57722 100644 ---- a/lib/metadata/metadata-exported.h -+++ b/lib/metadata/metadata-exported.h -@@ -143,6 +143,7 @@ - - #define LV_REMOVE_AFTER_RESHAPE UINT64_C(0x0400000000000000) /* LV needs to be removed after a shrinking reshape */ - #define LV_METADATA_FORMAT UINT64_C(0x0800000000000000) /* LV has segments with metadata format */ -+#define LV_CROP_METADATA UINT64_C(0x0000000000000400) /* LV - also VG CLUSTERED */ - - #define LV_RESHAPE UINT64_C(0x1000000000000000) /* Ongoing reshape (number of stripes, stripesize or raid algorithm change): - used as SEGTYPE_FLAG to prevent activation on old runtime */ -@@ -326,6 +327,12 @@ typedef enum { - } thin_discards_t; - - typedef enum { -+ THIN_CROP_METADATA_UNSELECTED = 0, /* 'auto' selects */ -+ THIN_CROP_METADATA_NO, -+ THIN_CROP_METADATA_YES, -+} thin_crop_metadata_t; -+ -+typedef enum { - CACHE_MODE_UNSELECTED = 0, - CACHE_MODE_WRITETHROUGH, - CACHE_MODE_WRITEBACK, -@@ -502,6 +509,7 @@ struct lv_segment { - uint64_t transaction_id; /* For thin_pool, thin */ - thin_zero_t zero_new_blocks; /* For thin_pool */ - thin_discards_t discards; /* For thin_pool */ -+ thin_crop_metadata_t crop_metadata; /* For thin_pool */ - struct dm_list thin_messages; /* For thin_pool */ - struct logical_volume *external_lv; /* For thin */ - struct logical_volume *pool_lv; /* For thin, cache */ -@@ -885,6 +893,8 @@ int update_thin_pool_params(struct cmd_context *cmd, - unsigned attr, - uint32_t pool_data_extents, - uint32_t *pool_metadata_extents, -+ struct logical_volume *metadata_lv, -+ unsigned *crop_metadata, - int *chunk_size_calc_method, uint32_t *chunk_size, - thin_discards_t *discards, thin_zero_t *zero_new_blocks); - -@@ -1011,6 +1021,7 @@ struct lvcreate_params { - - uint64_t permission; /* all */ - unsigned error_when_full; /* when segment supports it */ -+ thin_crop_metadata_t crop_metadata; - uint32_t read_ahead; /* all */ - int approx_alloc; /* all */ - alloc_policy_t alloc; /* all */ -diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h -index 2c22450..0f230e4 100644 ---- a/lib/metadata/metadata.h -+++ b/lib/metadata/metadata.h -@@ -512,8 +512,21 @@ int pool_below_threshold(const struct lv_segment *pool_seg); - int pool_check_overprovisioning(const struct logical_volume *lv); - int create_pool(struct logical_volume *pool_lv, const struct segment_type *segtype, - struct alloc_handle *ah, uint32_t stripes, uint32_t stripe_size); -+uint64_t get_thin_pool_max_metadata_size(struct cmd_context *cmd, struct profile *profile, -+ thin_crop_metadata_t *crop); -+thin_crop_metadata_t get_thin_pool_crop_metadata(struct cmd_context *cmd, -+ thin_crop_metadata_t crop, -+ uint64_t metadata_size); - uint64_t estimate_thin_pool_metadata_size(uint32_t data_extents, uint32_t extent_size, uint32_t chunk_size); - -+int update_pool_metadata_min_max(struct cmd_context *cmd, -+ uint32_t extent_size, -+ uint64_t min_metadata_size, /* required min */ -+ uint64_t max_metadata_size, /* writable max */ -+ uint64_t *metadata_size, /* current calculated */ -+ struct logical_volume *metadata_lv, /* name of converted LV or NULL */ -+ uint32_t *metadata_extents); /* resulting extent count */ -+ - /* - * Begin skeleton for external LVM library - */ -diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c -index a9dc611..b67882e 100644 ---- a/lib/metadata/pool_manip.c -+++ b/lib/metadata/pool_manip.c -@@ -742,6 +742,52 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents, - return 1; - } - -+int update_pool_metadata_min_max(struct cmd_context *cmd, -+ uint32_t extent_size, -+ uint64_t min_metadata_size, /* required min */ -+ uint64_t max_metadata_size, /* writable max */ -+ uint64_t *metadata_size, /* current calculated */ -+ struct logical_volume *metadata_lv, /* name of converted LV or NULL */ -+ uint32_t *metadata_extents) /* resulting extent count */ -+{ -+ max_metadata_size = dm_round_up(max_metadata_size, extent_size); -+ min_metadata_size = dm_round_up(min_metadata_size, extent_size); -+ -+ if (*metadata_size > max_metadata_size) { -+ if (metadata_lv) { -+ log_print_unless_silent("Size %s of pool metadata volume %s is bigger then maximum usable size %s.", -+ display_size(cmd, *metadata_size), -+ display_lvname(metadata_lv), -+ display_size(cmd, max_metadata_size)); -+ } else { -+ if (*metadata_extents) -+ log_print_unless_silent("Reducing pool metadata size %s to maximum usable size %s.", -+ display_size(cmd, *metadata_size), -+ display_size(cmd, max_metadata_size)); -+ *metadata_size = max_metadata_size; -+ } -+ } else if (*metadata_size < min_metadata_size) { -+ if (metadata_lv) { -+ log_error("Can't use volume %s with size %s as pool metadata. Minimal required size is %s.", -+ display_lvname(metadata_lv), -+ display_size(cmd, *metadata_size), -+ display_size(cmd, min_metadata_size)); -+ return 0; -+ } else { -+ if (*metadata_extents) -+ log_print_unless_silent("Extending pool metadata size %s to required minimal size %s.", -+ display_size(cmd, *metadata_size), -+ display_size(cmd, min_metadata_size)); -+ *metadata_size = min_metadata_size; -+ } -+ } -+ -+ if (!(*metadata_extents = extents_from_size(cmd, *metadata_size, extent_size))) -+ return_0; -+ -+ return 1; -+} -+ - int vg_set_pool_metadata_spare(struct logical_volume *lv) - { - char new_name[NAME_LEN]; -diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c -index 4591dd7..451c382 100644 ---- a/lib/metadata/thin_manip.c -+++ b/lib/metadata/thin_manip.c -@@ -610,9 +610,9 @@ static uint64_t _estimate_metadata_size(uint32_t data_extents, uint32_t extent_s - } - - /* Estimate maximal supportable thin pool data size for given chunk_size */ --static uint64_t _estimate_max_data_size(uint32_t chunk_size) -+static uint64_t _estimate_max_data_size(uint64_t max_metadata_size, uint32_t chunk_size) - { -- return chunk_size * (DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2) * SECTOR_SIZE / UINT64_C(64); -+ return max_metadata_size * chunk_size * SECTOR_SIZE / UINT64_C(64); - } - - /* Estimate thin pool chunk size from data and metadata size (in sector units) */ -@@ -662,6 +662,38 @@ int get_default_allocation_thin_pool_chunk_size(struct cmd_context *cmd, struct - return 1; - } - -+/* Return max supported metadata size with selected cropping */ -+uint64_t get_thin_pool_max_metadata_size(struct cmd_context *cmd, struct profile *profile, -+ thin_crop_metadata_t *crop) -+{ -+ *crop = find_config_tree_bool(cmd, allocation_thin_pool_crop_metadata_CFG, profile) ? -+ THIN_CROP_METADATA_YES : THIN_CROP_METADATA_NO; -+ -+ return (*crop == THIN_CROP_METADATA_NO) ? -+ (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE_V1_KB) : (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE); -+} -+ -+/* -+ * With existing crop method, check if the metadata_size would need cropping. -+ * If not, set UNSELECTED, otherwise print some verbose info about selected cropping -+ */ -+thin_crop_metadata_t get_thin_pool_crop_metadata(struct cmd_context *cmd, -+ thin_crop_metadata_t crop, -+ uint64_t metadata_size) -+{ -+ const uint64_t crop_size = (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE); -+ -+ if (metadata_size > crop_size) { -+ if (crop == THIN_CROP_METADATA_NO) -+ log_verbose("Using metadata size without cropping."); -+ else -+ log_verbose("Cropping metadata size to %s.", display_size(cmd, crop_size)); -+ } else -+ crop = THIN_CROP_METADATA_UNSELECTED; -+ -+ return crop; -+} -+ - int update_thin_pool_params(struct cmd_context *cmd, - struct profile *profile, - uint32_t extent_size, -@@ -669,10 +701,13 @@ int update_thin_pool_params(struct cmd_context *cmd, - unsigned attr, - uint32_t pool_data_extents, - uint32_t *pool_metadata_extents, -+ struct logical_volume *metadata_lv, -+ thin_crop_metadata_t *crop_metadata, - int *chunk_size_calc_method, uint32_t *chunk_size, - thin_discards_t *discards, thin_zero_t *zero_new_blocks) - { -- uint64_t pool_metadata_size = (uint64_t) *pool_metadata_extents * extent_size; -+ uint64_t pool_metadata_size; -+ uint64_t max_metadata_size; - uint32_t estimate_chunk_size; - uint64_t max_pool_data_size; - const char *str; -@@ -702,7 +737,9 @@ int update_thin_pool_params(struct cmd_context *cmd, - *zero_new_blocks = find_config_tree_bool(cmd, allocation_thin_pool_zero_CFG, profile) - ? THIN_ZERO_YES : THIN_ZERO_NO; - -- if (!pool_metadata_size) { -+ max_metadata_size = get_thin_pool_max_metadata_size(cmd, profile, crop_metadata); -+ -+ if (!*pool_metadata_extents) { - if (!*chunk_size) { - if (!get_default_allocation_thin_pool_chunk_size(cmd, profile, - chunk_size, -@@ -723,20 +760,20 @@ int update_thin_pool_params(struct cmd_context *cmd, - } else { - pool_metadata_size = _estimate_metadata_size(pool_data_extents, extent_size, *chunk_size); - -- if (pool_metadata_size > (DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2)) { -+ if (pool_metadata_size > max_metadata_size) { - /* Suggest bigger chunk size */ - estimate_chunk_size = - _estimate_chunk_size(pool_data_extents, extent_size, -- (DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2), attr); -+ max_metadata_size, attr); - log_warn("WARNING: Chunk size is too small for pool, suggested minimum is %s.", - display_size(cmd, estimate_chunk_size)); - } - } - - /* Round up to extent size silently */ -- if (pool_metadata_size % extent_size) -- pool_metadata_size += extent_size - pool_metadata_size % extent_size; -+ pool_metadata_size = dm_round_up(pool_metadata_size, extent_size); - } else { -+ pool_metadata_size = (uint64_t) *pool_metadata_extents * extent_size; - estimate_chunk_size = _estimate_chunk_size(pool_data_extents, extent_size, - pool_metadata_size, attr); - -@@ -751,7 +788,19 @@ int update_thin_pool_params(struct cmd_context *cmd, - } - } - -- max_pool_data_size = _estimate_max_data_size(*chunk_size); -+ /* Use not rounded max for data size */ -+ max_pool_data_size = _estimate_max_data_size(max_metadata_size, *chunk_size); -+ -+ if (!update_pool_metadata_min_max(cmd, extent_size, -+ 2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE, -+ max_metadata_size, -+ &pool_metadata_size, -+ metadata_lv, -+ pool_metadata_extents)) -+ return_0; -+ -+ *crop_metadata = get_thin_pool_crop_metadata(cmd, *crop_metadata, pool_metadata_size); -+ - if ((max_pool_data_size / extent_size) < pool_data_extents) { - log_error("Selected chunk size %s cannot address more then %s of thin pool data space.", - display_size(cmd, *chunk_size), display_size(cmd, max_pool_data_size)); -@@ -764,22 +813,6 @@ int update_thin_pool_params(struct cmd_context *cmd, - if (!validate_thin_pool_chunk_size(cmd, *chunk_size)) - return_0; - -- if (pool_metadata_size > (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE)) { -- pool_metadata_size = 2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE; -- if (*pool_metadata_extents) -- log_warn("WARNING: Maximum supported pool metadata size is %s.", -- display_size(cmd, pool_metadata_size)); -- } else if (pool_metadata_size < (2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE)) { -- pool_metadata_size = 2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE; -- if (*pool_metadata_extents) -- log_warn("WARNING: Minimum supported pool metadata size is %s.", -- display_size(cmd, pool_metadata_size)); -- } -- -- if (!(*pool_metadata_extents = -- extents_from_size(cmd, pool_metadata_size, extent_size))) -- return_0; -- - if ((uint64_t) *chunk_size > (uint64_t) pool_data_extents * extent_size) { - log_error("Size of %s data volume cannot be smaller than chunk size %s.", - segtype->name, display_size(cmd, *chunk_size)); -@@ -958,12 +991,5 @@ int validate_thin_pool_chunk_size(struct cmd_context *cmd, uint32_t chunk_size) - - uint64_t estimate_thin_pool_metadata_size(uint32_t data_extents, uint32_t extent_size, uint32_t chunk_size) - { -- uint64_t sz = _estimate_metadata_size(data_extents, extent_size, chunk_size); -- -- if (sz > (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE)) -- sz = 2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE; -- else if (sz < (2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE)) -- sz = 2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE; -- -- return sz; -+ return _estimate_metadata_size(data_extents, extent_size, chunk_size); - } -diff --git a/lib/thin/thin.c b/lib/thin/thin.c -index ba0da71..51bc269 100644 ---- a/lib/thin/thin.c -+++ b/lib/thin/thin.c -@@ -86,6 +86,7 @@ static int _thin_pool_text_import(struct lv_segment *seg, - struct logical_volume *pool_data_lv, *pool_metadata_lv; - const char *discards_str = NULL; - uint32_t zero = 0; -+ uint32_t crop = 0; - - if (!dm_config_get_str(sn, "metadata", &lv_name)) - return SEG_LOG_ERROR("Metadata must be a string in"); -@@ -131,6 +132,13 @@ static int _thin_pool_text_import(struct lv_segment *seg, - - seg->zero_new_blocks = (zero) ? THIN_ZERO_YES : THIN_ZERO_NO; - -+ if (dm_config_has_node(sn, "crop_metadata")) { -+ if (!dm_config_get_uint32(sn, "crop_metadata", &crop)) -+ return SEG_LOG_ERROR("Could not read crop_metadata for"); -+ seg->crop_metadata = (crop) ? THIN_CROP_METADATA_YES : THIN_CROP_METADATA_NO; -+ seg->lv->status |= LV_CROP_METADATA; -+ } -+ - /* Read messages */ - for (; sn; sn = sn->sib) - if (!(sn->v) && !_thin_pool_add_message(seg, sn->key, sn->child)) -@@ -177,6 +185,9 @@ static int _thin_pool_text_export(const struct lv_segment *seg, struct formatter - return 0; - } - -+ if (seg->crop_metadata != THIN_CROP_METADATA_UNSELECTED) -+ outf(f, "crop_metadata = %u", (seg->crop_metadata == THIN_CROP_METADATA_YES) ? 1 : 0); -+ - dm_list_iterate_items(tmsg, &seg->thin_messages) { - /* Extra validation */ - switch (tmsg->type) { -@@ -307,11 +318,12 @@ static int _thin_pool_add_target_line(struct dev_manager *dm, - else - low_water_mark = 0; - -- if (!dm_tree_node_add_thin_pool_target(node, len, -- seg->transaction_id, -- metadata_dlid, pool_dlid, -- seg->chunk_size, low_water_mark, -- (seg->zero_new_blocks == THIN_ZERO_YES) ? 0 : 1)) -+ if (!dm_tree_node_add_thin_pool_target_v1(node, len, -+ seg->transaction_id, -+ metadata_dlid, pool_dlid, -+ seg->chunk_size, low_water_mark, -+ (seg->zero_new_blocks == THIN_ZERO_YES) ? 0 : 1, -+ (seg->crop_metadata == THIN_CROP_METADATA_YES) ? 1 : 0)) - return_0; - - if (attr & THIN_FEATURE_DISCARDS) { -diff --git a/man/lvmthin.7_main b/man/lvmthin.7_main -index e6f1d63..3ce34a5 100644 ---- a/man/lvmthin.7_main -+++ b/man/lvmthin.7_main -@@ -1104,7 +1104,7 @@ The default value is shown by: - The amount of thin metadata depends on how many blocks are shared between - thin LVs (i.e. through snapshots). A thin pool with many snapshots may - need a larger metadata LV. Thin pool metadata LV sizes can be from 2MiB --to 16GiB. -+to approximately 16GiB. - - When using lvcreate to create what will become a thin metadata LV, the - size is specified with the -L|--size option. -@@ -1119,6 +1119,14 @@ needed, so it is recommended to start with a size of 1GiB which should be - enough for all practical purposes. A thin pool metadata LV can later be - manually or automatically extended if needed. - -+Configurable setting -+.BR lvm.conf (5) -+.BR allocation / thin_pool_crop_metadata -+gives control over cropping to 15.81GiB to stay backward compatible with older -+versions of lvm2. With enabled cropping there can be observed some problems when -+using volumes above this size with thin tools (i.e. thin_repair). -+Cropping should be enabled only when compatibility is required. -+ - - .SS Create a thin snapshot of an external, read only LV - -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index 7b74afb..ce90279 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -3032,6 +3032,7 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, - const char *policy_name; - struct dm_config_tree *policy_settings = NULL; - int pool_metadata_spare; -+ thin_crop_metadata_t crop_metadata; - thin_discards_t discards; - thin_zero_t zero_new_blocks; - int r = 0; -@@ -3196,6 +3197,8 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, - pool_segtype, target_attr, - lv->le_count, - &meta_extents, -+ metadata_lv, -+ &crop_metadata, - &chunk_calc, - &chunk_size, - &discards, &zero_new_blocks)) -@@ -3401,6 +3404,7 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, - goto_bad; - } else { - seg->transaction_id = 0; -+ seg->crop_metadata = crop_metadata; - seg->chunk_size = chunk_size; - seg->discards = discards; - seg->zero_new_blocks = zero_new_blocks; -diff --git a/tools/lvcreate.c b/tools/lvcreate.c -index e384291..1ee9e14 100644 ---- a/tools/lvcreate.c -+++ b/tools/lvcreate.c -@@ -391,6 +391,8 @@ static int _update_extents_params(struct volume_group *vg, - lp->segtype, lp->target_attr, - lp->extents, - &lp->pool_metadata_extents, -+ NULL, -+ &lp->crop_metadata, - &lp->thin_chunk_size_calc_policy, - &lp->chunk_size, - &lp->discards, diff --git a/lvm2-2_03_12-vdo-support-online-rename.patch b/lvm2-2_03_12-vdo-support-online-rename.patch deleted file mode 100644 index ab2bc0e..0000000 --- a/lvm2-2_03_12-vdo-support-online-rename.patch +++ /dev/null @@ -1,194 +0,0 @@ - conf/example.conf.in | 10 ++++++++++ - lib/config/config_settings.h | 9 +++++++++ - lib/metadata/lv_manip.c | 14 +++++++++++--- - lib/metadata/segtype.h | 2 ++ - lib/vdo/vdo.c | 46 ++++++++++++++++++++++++++++++++++++-------- - 5 files changed, 70 insertions(+), 11 deletions(-) - -diff --git a/conf/example.conf.in b/conf/example.conf.in -index cd53147..d02965e 100644 ---- a/conf/example.conf.in -+++ b/conf/example.conf.in -@@ -1195,6 +1195,16 @@ global { - # This configuration option has an automatic default value. - # vdo_format_options = [ "" ] - -+ # Configuration option global/vdo_disabled_features. -+ # Features to not use in the vdo driver. -+ # This can be helpful for testing, or to avoid using a feature that is -+ # causing problems. Features include: online_rename -+ # -+ # Example -+ # vdo_disabled_features = [ "online_rename" ] -+ # -+ # This configuration option does not have a default value defined. -+ - # Configuration option global/fsadm_executable. - # The full path to the fsadm command. - # LVM uses this command to help with lvresize -r operations. -diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h -index 3c4032e..f844594 100644 ---- a/lib/config/config_settings.h -+++ b/lib/config/config_settings.h -@@ -1206,6 +1206,15 @@ cfg(global_vdo_format_executable_CFG, "vdo_format_executable", global_CFG_SECTIO - cfg_array(global_vdo_format_options_CFG, "vdo_format_options", global_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_VDO_FORMAT_OPTIONS_CONFIG, VDO_1ST_VSN, NULL, 0, NULL, - "List of options passed added to standard vdoformat command.\n") - -+cfg_array(global_vdo_disabled_features_CFG, "vdo_disabled_features", global_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(2, 3, 11), NULL, 0, NULL, -+ "Features to not use in the vdo driver.\n" -+ "This can be helpful for testing, or to avoid using a feature that is\n" -+ "causing problems. Features include: online_rename\n" -+ "#\n" -+ "Example\n" -+ "vdo_disabled_features = [ \"online_rename\" ]\n" -+ "#\n") -+ - cfg(global_fsadm_executable_CFG, "fsadm_executable", global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_FSADM_PATH, vsn(2, 2, 170), "@FSADM_PATH@", 0, NULL, - "The full path to the fsadm command.\n" - "LVM uses this command to help with lvresize -r operations.\n") -diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c -index c740ba2..6c71263 100644 ---- a/lib/metadata/lv_manip.c -+++ b/lib/metadata/lv_manip.c -@@ -4738,6 +4738,8 @@ int lv_rename_update(struct cmd_context *cmd, struct logical_volume *lv, - struct lv_names lv_names = { .old = lv->name }; - int old_lv_is_historical = lv_is_historical(lv); - int historical; -+ unsigned attrs; -+ const struct segment_type *segtype; - - /* - * rename is not allowed on sub LVs except for pools -@@ -4763,9 +4765,15 @@ int lv_rename_update(struct cmd_context *cmd, struct logical_volume *lv, - } - - if (lv_is_vdo_pool(lv) && lv_is_active(lv_lock_holder(lv))) { -- log_error("Cannot rename active VDOPOOL volume %s.", -- display_lvname(lv)); -- return 0; -+ segtype = first_seg(lv)->segtype; -+ if (!segtype->ops->target_present || -+ !segtype->ops->target_present(lv->vg->cmd, NULL, &attrs) || -+ !(attrs & VDO_FEATURE_ONLINE_RENAME)) { -+ log_error("Cannot rename active VDOPOOL volume %s, " -+ "VDO target feature support is missing.", -+ display_lvname(lv)); -+ return 0; -+ } - } - - if (update_mda && !archive(vg)) -diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h -index 08ddc35..2714a6b 100644 ---- a/lib/metadata/segtype.h -+++ b/lib/metadata/segtype.h -@@ -349,6 +349,8 @@ int init_cache_segtypes(struct cmd_context *cmd, struct segtype_library *seglib) - int init_vdo_segtypes(struct cmd_context *cmd, struct segtype_library *seglib); - #endif - -+#define VDO_FEATURE_ONLINE_RENAME (1U << 0) /* version 6.2.3 */ -+ - int init_writecache_segtypes(struct cmd_context *cmd, struct segtype_library *seglib); - - int init_integrity_segtypes(struct cmd_context *cmd, struct segtype_library *seglib); -diff --git a/lib/vdo/vdo.c b/lib/vdo/vdo.c -index c43a5dc..bb7c784 100644 ---- a/lib/vdo/vdo.c -+++ b/lib/vdo/vdo.c -@@ -25,6 +25,7 @@ - #include "lib/metadata/segtype.h" - #include "base/memory/zalloc.h" - -+static const char _vdo_module[] = MODULE_NAME_VDO; - static unsigned _feature_mask; - - static int _bad_field(const char *field) -@@ -391,18 +392,21 @@ static int _vdo_target_present(struct cmd_context *cmd, - static const struct feature { - uint32_t maj; - uint32_t min; -+ uint32_t patchlevel; - unsigned vdo_feature; - const char *feature; - } _features[] = { -- { 1, 1, 0, "" }, -- //{ 9, 9, VDO_FEATURE_RESIZE, "resize" }, -+ { 6, 2, 3, VDO_FEATURE_ONLINE_RENAME, "online_rename" }, - }; -- //static const char _lvmconf[] = "global/vdo_disabled_features"; -+ static const char _lvmconf[] = "global/vdo_disabled_features"; - static int _vdo_checked = 0; - static int _vdo_present = 0; - static unsigned _vdo_attrs = 0; - uint32_t i, maj, min, patchlevel; - const struct segment_type *segtype; -+ const struct dm_config_node *cn; -+ const struct dm_config_value *cv; -+ const char *str; - - if (!activation()) - return 0; -@@ -419,8 +423,8 @@ static int _vdo_target_present(struct cmd_context *cmd, - } - - if (maj < 6 || (maj == 6 && min < 2)) { -- log_warn("WARNING: VDO target version %u.%u.%u is too old.", -- maj, min, patchlevel); -+ log_warn("WARNING: Target %s version %u.%u.%u is too old.", -+ _vdo_module, maj, min, patchlevel); - return 0; - } - -@@ -437,15 +441,41 @@ static int _vdo_target_present(struct cmd_context *cmd, - /* Prepare for adding supported features */ - for (i = 0; i < DM_ARRAY_SIZE(_features); ++i) - if ((maj > _features[i].maj) || -- (maj == _features[i].maj && min >= _features[i].min)) -+ ((maj == _features[i].maj) && (min > _features[i].min)) || -+ ((maj == _features[i].maj) && (min == _features[i].min) && (patchlevel >= _features[i].patchlevel))) - _vdo_attrs |= _features[i].vdo_feature; - else - log_very_verbose("Target %s does not support %s.", -- TARGET_NAME_VDO, -+ _vdo_module, - _features[i].feature); - } - - if (attributes) { -+ if (!_feature_mask) { -+ /* Support runtime lvm.conf changes, N.B. avoid 32 feature */ -+ if ((cn = find_config_tree_array(cmd, global_vdo_disabled_features_CFG, NULL))) { -+ for (cv = cn->v; cv; cv = cv->next) { -+ if (cv->type != DM_CFG_STRING) { -+ log_warn("WARNING: Ignoring invalid string in config file %s.", -+ _lvmconf); -+ continue; -+ } -+ str = cv->v.str; -+ if (!*str) -+ continue; -+ for (i = 0; i < DM_ARRAY_SIZE(_features); ++i) -+ if (strcasecmp(str, _features[i].feature) == 0) -+ _feature_mask |= _features[i].vdo_feature; -+ } -+ } -+ _feature_mask = ~_feature_mask; -+ for (i = 0; i < DM_ARRAY_SIZE(_features); ++i) -+ if ((_vdo_attrs & _features[i].vdo_feature) && -+ !(_feature_mask & _features[i].vdo_feature)) -+ log_very_verbose("Target %s %s support disabled by %s.", -+ _vdo_module, -+ _features[i].feature, _lvmconf); -+ } - *attributes = _vdo_attrs & _feature_mask; - } - -@@ -456,7 +486,7 @@ static int _vdo_modules_needed(struct dm_pool *mem, - const struct lv_segment *seg __attribute__((unused)), - struct dm_list *modules) - { -- if (!str_list_add(mem, modules, MODULE_NAME_VDO)) { -+ if (!str_list_add(mem, modules, _vdo_module)) { - log_error("String list allocation failed for VDO module."); - return 0; - } diff --git a/lvm2-2_03_12-writecache-use-cleaner-message-instead-of-table-relo.patch b/lvm2-2_03_12-writecache-use-cleaner-message-instead-of-table-relo.patch deleted file mode 100644 index 9f08576..0000000 --- a/lvm2-2_03_12-writecache-use-cleaner-message-instead-of-table-relo.patch +++ /dev/null @@ -1,45 +0,0 @@ - lib/metadata/writecache_manip.c | 10 +++++++--- - tools/lvconvert.c | 2 ++ - 2 files changed, 9 insertions(+), 3 deletions(-) - -diff --git a/lib/metadata/writecache_manip.c b/lib/metadata/writecache_manip.c -index 5004aa9..8150d07 100644 ---- a/lib/metadata/writecache_manip.c -+++ b/lib/metadata/writecache_manip.c -@@ -75,7 +75,7 @@ static int _get_writecache_kernel_status(struct cmd_context *cmd, - return 0; - } - -- if (!lv_info_with_seg_status(cmd, first_seg(lv), &status, 1, 1)) { -+ if (!lv_info_with_seg_status(cmd, first_seg(lv), &status, 0, 0)) { - log_error("Failed to get device mapper status for %s", display_lvname(lv)); - goto fail; - } -@@ -434,8 +434,12 @@ int lv_writecache_set_cleaner(struct logical_volume *lv) - seg->writecache_settings.cleaner_set = 1; - - if (lv_is_active(lv)) { -- if (!lv_update_and_reload(lv)) { -- log_error("Failed to update VG and reload LV."); -+ if (!vg_write(lv->vg) || !vg_commit(lv->vg)) { -+ log_error("Failed to update VG."); -+ return 0; -+ } -+ if (!lv_writecache_message(lv, "cleaner")) { -+ log_error("Failed to set writecache cleaner for %s.", display_lvname(lv)); - return 0; - } - } else { -diff --git a/tools/lvconvert.c b/tools/lvconvert.c -index 4323965..7b74afb 100644 ---- a/tools/lvconvert.c -+++ b/tools/lvconvert.c -@@ -5720,6 +5720,8 @@ static int _lvconvert_detach_writecache_when_clean(struct cmd_context *cmd, - return 0; - } - -+ log_debug("detach writecache check clean reading vg %s", id->vg_name); -+ - vg = vg_read(cmd, id->vg_name, NULL, READ_FOR_UPDATE, lockd_state, &error_flags, NULL); - - if (!vg) { diff --git a/lvm2.spec b/lvm2.spec index d4c8002..7233c6a 100644 --- a/lvm2.spec +++ b/lvm2.spec @@ -1,8 +1,8 @@ -%global device_mapper_version 1.02.177 +%global device_mapper_version 1.02.179 %global enable_cache 1 %global enable_cluster 1 -%global enable_cmirror 1 +%global enable_cmirror 0 %global enable_lvmdbusd 1 %global enable_lvmlockd 1 %global enable_lvmpolld 1 @@ -57,8 +57,8 @@ Name: lvm2 %if 0%{?rhel} Epoch: %{rhel} %endif -Version: 2.03.12 -Release: 4%{?dist} +Version: 2.03.13 +Release: 1%{?dist} License: GPLv2 URL: http://sourceware.org/lvm2 Source0: ftp://sourceware.org/pub/lvm2/releases/LVM2.%{version}.tgz @@ -68,11 +68,13 @@ Patch3: 0002-config-change-default-use_devicesfile-to-1.patch Patch4: 0003-system_id-new-appmachineid-option.patch Patch5: 0004-pvscan-add-options-listlvs-listvg-checkcomplete.patch Patch6: 0005-logging-to-the-systemd-journal.patch -Patch7: 0006-new-udev-and-systemd-autoactivation.patch -Patch8: 0007-tests-add-udev-pvscan-vgchange.patch -Patch9: 0008-add-pvscan-udev-initrd.sh.patch -Patch10: 0009-pvscan-don-t-get-info-from-udev.patch -Patch11: 0010-configure-update.patch +Patch7: 0006-new-udev-autoactivation.patch +Patch8: 0007-configure-update.patch +Patch9: 0008-add-dracut-files.patch +Patch10: 0009-lvmdbusd-Use-ID_FS_TYPE-UDev-property-in-udevwatch.patch +Patch11: 0010-udev-vgchange-skip-hints-and-keep-transient-service-.patch +Patch12: 0011-make-generate.patch +Patch13: 0012-test-Fix-system_id-test.patch BuildRequires: make BuildRequires: gcc @@ -140,6 +142,8 @@ or more physical volumes and creating one or more logical volumes %patch9 -p1 -b .backup9 %patch10 -p1 -b .backup10 %patch11 -p1 -b .backup11 +%patch12 -p1 -b .backup12 +%patch13 -p1 -b .backup13 %build %global _default_pid_dir /run @@ -258,6 +262,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %if %{enable_lvmpolld} %{_sbindir}/lvmpolld %endif +%{_sbindir}/vdoimport # Other files %defattr(444,root,root,-) @@ -343,6 +348,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_mandir}/man8/pvresize.8.gz %{_mandir}/man8/pvs.8.gz %{_mandir}/man8/pvscan.8.gz +%{_mandir}/man8/vdoimport.8.gz %{_mandir}/man8/vgcfgbackup.8.gz %{_mandir}/man8/vgcfgrestore.8.gz %{_mandir}/man8/vgchange.8.gz @@ -392,7 +398,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_tmpfilesdir}/%{name}.conf %{_unitdir}/blk-availability.service %{_unitdir}/lvm2-monitor.service -%{_unitdir}/lvm-vgchange@.service +#%{_unitdir}/lvm-vgchange@.service %attr(555, -, -) %{_prefix}/lib/systemd/system-generators/lvm2-activation-generator %if %{enable_lvmpolld} %{_unitdir}/lvm2-lvmpolld.socket @@ -748,6 +754,11 @@ An extensive functional testsuite for LVM2. %endif %changelog +* Wed Aug 11 2021 Marian Csontos - 2.03.13-1 +- Update to upstream version 2.03.13. +- Change in obtain_devices_list_from_udev default. +- See WHATS_NEW and WHATS_NEW_DM for more information. + * Mon Aug 09 2021 Mohan Boddu - 8:2.03.12-4 - Rebuilt for IMA sigs, glibc 2.34, aarch64 flags Related: rhbz#1991688 diff --git a/sources b/sources index b65776a..1a5fb6a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (LVM2.2.03.12.tgz) = e4d3bfb38b346251a2ea2cee7b79f2e12ed407652b659b35b65f58c8bb252943cee1c511713aeec8ff3400790e0e99ea6b83e8740050defe5cbb118f18bf7700 +SHA512 (LVM2.2.03.13.tgz) = 8b4fb6da5dd46ddeb754436189072bea79be594fab6d57d9be63c6ce3e3cb68d38601a2c031c493681321281cfb1f1459ace19974c00beb569364f44863cfc4a diff --git a/tests/tests.yml b/tests/tests.yml index 31136e8..357af21 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -29,6 +29,7 @@ #- shell/duplicate-pvs-md1.sh - shell/integrity # An unknown issue, likely in kernel - writecache-blocksize # A new test not working properly + - system_id.sh skip_tests: - read-ahead.sh # tuned is interfering with tests diff --git a/upstream b/upstream index d8182fd..5ec66e0 100644 --- a/upstream +++ b/upstream @@ -1 +1 @@ -LVM2.2.03.12.tgz +LVM2.2.03.13.tgz