[lvm-devel] main - mirror_percent: support interruptible check

Zdenek Kabelac zkabelac at sourceware.org
Tue Apr 6 20:07:27 UTC 2021


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ff8aaadec912398598fd4b16de99ed700b97b130
Commit:        ff8aaadec912398598fd4b16de99ed700b97b130
Parent:        1f17b1c56526abc7b7c8edacfba683b396f95705
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Tue Apr 6 14:47:11 2021 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Apr 6 22:02:31 2021 +0200

mirror_percent: support interruptible check

When checking for mirror percentage with WAITEVENT (i.e. during pvmove)
handle intrruption (^C) of such wait.
---
 lib/activate/dev_manager.c | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 172a6bab1..c4a673901 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -26,6 +26,7 @@
 #include "lib/activate/activate.h"
 #include "lib/misc/lvm-exec.h"
 #include "lib/datastruct/str_list.h"
+#include "lib/misc/lvm-signal.h"
 
 #include <limits.h>
 #include <dirent.h>
@@ -1123,7 +1124,8 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 			const char *dlid,
 			const char *target_type, int wait,
 			const struct logical_volume *lv, dm_percent_t *overall_percent,
-			uint32_t *event_nr, int fail_if_percent_unsupported)
+			uint32_t *event_nr, int fail_if_percent_unsupported,
+			int *interrupted)
 {
 	int r = 0;
 	struct dm_task *dmt;
@@ -1144,9 +1146,12 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 	if (!(segtype = get_segtype_from_string(dm->cmd, target_type)))
 		return_0;
 
+	if (wait)
+		sigint_allow();
+
 	if (!(dmt = _setup_task_run(wait ? DM_DEVICE_WAITEVENT : DM_DEVICE_STATUS, &info,
 				    name, dlid, event_nr, 0, 0, 0, 0, 0)))
-		return_0;
+		goto_bad;
 
 	if (!info.exists)
 		goto_out;
@@ -1214,8 +1219,19 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 			     display_percent(dm->cmd, *overall_percent));
 	r = 1;
 
-      out:
+    out:
 	dm_task_destroy(dmt);
+
+    bad:
+	if (wait) {
+		sigint_restore();
+
+		if (sigint_caught()) {
+			*interrupted = 1;
+			return_0;
+		}
+	}
+
 	return r;
 }
 
@@ -1224,20 +1240,24 @@ static int _percent(struct dev_manager *dm, const char *name, const char *dlid,
 		    const struct logical_volume *lv, dm_percent_t *percent,
 		    uint32_t *event_nr, int fail_if_percent_unsupported)
 {
+	int interrupted = 0;
+
 	if (dlid && *dlid) {
 		if (_percent_run(dm, NULL, dlid, target_type, wait, lv, percent,
-				 event_nr, fail_if_percent_unsupported))
+				 event_nr, fail_if_percent_unsupported, &interrupted))
 			return 1;
 
-		if (_original_uuid_format_check_required(dm->cmd) &&
+		if (!interrupted &&
+		    _original_uuid_format_check_required(dm->cmd) &&
 		    _percent_run(dm, NULL, dlid + sizeof(UUID_PREFIX) - 1,
 				 target_type, wait, lv, percent,
-				 event_nr, fail_if_percent_unsupported))
+				 event_nr, fail_if_percent_unsupported, &interrupted))
 			return 1;
 	}
 
-	if (name && _percent_run(dm, name, NULL, target_type, wait, lv, percent,
-				 event_nr, fail_if_percent_unsupported))
+	if (!interrupted && name &&
+	    _percent_run(dm, name, NULL, target_type, wait, lv, percent,
+				 event_nr, fail_if_percent_unsupported, &interrupted))
 		return 1;
 
 	return_0;




More information about the lvm-devel mailing list