Add support for "retry_deactivation" lvm.conf option
PATCH 7/7 Add support for "retry_deactivation" lvm.conf option
...the comment in the lvm.conf would need a few more words to explain, but let's see if this patchset is acceptable first :)
Peter
--- doc/example.conf.in | 3 +++ lib/activate/dev_manager.c | 2 ++ lib/commands/toolcontext.c | 3 +++ lib/config/defaults.h | 1 + lib/misc/lvm-globals.c | 11 +++++++++++ lib/misc/lvm-globals.h | 2 ++ 6 files changed, 22 insertions(+), 0 deletions(-)
doc/example.conf.in +3 -0
@@ -465,6 +465,9 @@ activation { # Useful for diagnosing problems with LVM2/udev interactions. verify_udev_operations = 0 + # Set to 1 to retry the volume deactivation several times + retry_deactivation = 1 + # How to fill in missing stripes if activating an incomplete volume. # Using "error" will make inaccessible parts of the device return # I/O errors on access. You can instead use a device path, in which
lib/activate/dev_manager.c +2 -0
@@ -1782,6 +1782,8 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, goto_out;break ;case DEACTIVATE : +if (retry_deactivation ()) +dm_tree_retry_remove (root);/* Deactivate LV and all devices it references that nothing else has open. */ r =dm_tree_deactivate_children (root, dlid,ID_LEN +sizeof (UUID_PREFIX ) -1 );if (!r)
lib/commands/toolcontext.c +3 -0
@@ -304,6 +304,9 @@ static int _process_config(struct cmd_context *cmd)"activation/udev_sync" , DEFAULT_UDEV_SYNC); +init_retry_deactivation (find_config_tree_int (cmd,"activation/retry_deactivation" , +DEFAULT_RETRY_DEACTIVATION )); +init_activation_checks (find_config_tree_int (cmd,"activation/checks" ,DEFAULT_ACTIVATION_CHECKS ));
lib/config/defaults.h +1 -0
@@ -81,6 +81,7 @@#define DEFAULT_UDEV_RULES 1#define DEFAULT_UDEV_SYNC 1#define DEFAULT_VERIFY_UDEV_OPERATIONS 0 +#define DEFAULT_RETRY_DEACTIVATION 1#define DEFAULT_ACTIVATION_CHECKS 0#define DEFAULT_EXTENT_SIZE 4096/* In KB */ #define DEFAULT_MAX_PV 0
lib/misc/lvm-globals.c +11 -0
@@ -42,6 +42,7 @@ static int _ignore_suspended_devices = 0;static int _error_message_produced =0 ;static unsigned _is_static =0 ;static int _udev_checking =1 ; +static int _retry_deactivation =DEFAULT_RETRY_DEACTIVATION ;static int _activation_checks =0 ;static char _sysfs_dir_path[PATH_MAX ] ="" ;static int _dev_disable_after_error_count =DEFAULT_DISABLE_AFTER_ERROR_COUNT ;
@@ -134,6 +135,11 @@ void init_udev_checking(int checking)log_debug ("LVM udev checking disabled" ); } +void init_retry_deactivation (int retry) +{ + _retry_deactivation = retry; +} +void init_activation_checks (int checks) {if ((_activation_checks = checks))
@@ -272,6 +278,11 @@ int udev_checking(void)return _udev_checking; } +int retry_deactivation (void ) +{ +return _retry_deactivation; +} +int activation_checks (void ) {return _activation_checks;
lib/misc/lvm-globals.h +2 -0
@@ -42,6 +42,7 @@ void init_dev_disable_after_error_count(int value);void init_pv_min_size (uint64_t sectors);void init_activation_checks (int checks);void init_detect_internal_vg_cache_corruption (int detect); +void init_retry_deactivation (int retry);void set_cmd_name (const char *cmd_name);void set_sysfs_dir_path (const char *path);
@@ -67,6 +68,7 @@ const char *sysfs_dir_path(void);uint64_t pv_min_size (void );int activation_checks (void );int detect_internal_vg_cache_corruption (void ); +int retry_deactivation (void );#define DMEVENTD_MONITOR_IGNORE -1int dmeventd_monitor_mode (void );