[lvm-devel] [PATCH 7/7][retry remove] Add support for "retry_deactivation" lvm.conf option

Peter Rajnoha prajnoha at redhat.com
Tue Sep 20 12:59:16 UTC 2011


...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(-)

diff --git a/doc/example.conf.in b/doc/example.conf.in
index 94c632f..e588a34 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -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 
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index b5b4b9e..0a3c29c 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -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)
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 3dccc18..38ec577 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -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));
 
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index a517943..16b524d 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -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
diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c
index 7358a34..69de623 100644
--- a/lib/misc/lvm-globals.c
+++ b/lib/misc/lvm-globals.c
@@ -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;
diff --git a/lib/misc/lvm-globals.h b/lib/misc/lvm-globals.h
index fcba687..ba10417 100644
--- a/lib/misc/lvm-globals.h
+++ b/lib/misc/lvm-globals.h
@@ -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 -1
 int dmeventd_monitor_mode(void);




More information about the lvm-devel mailing list