[lvm-devel] master - activation: check subLV before skipping resume

Zdenek Kabelac zkabelac at sourceware.org
Wed Nov 15 13:09:43 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=9e2a68a981a44579b19108554b8f89a860eb9d59
Commit:        9e2a68a981a44579b19108554b8f89a860eb9d59
Parent:        c820b43fc053689eac0a60cd732347c8eb30ad5d
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Fri Nov 10 21:15:50 2017 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Wed Nov 15 14:03:22 2017 +0100

activation: check subLV before skipping resume

LV is asked for resume, and its already resume and tool
is inside 'critical_section()' check if there is any suspended sub LV.
In that case 'resume' operation will not be skipped.
---
 lib/activate/activate.c |   27 +++++++++++++++++++++++----
 1 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 5542f84..05aea85 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -2276,6 +2276,17 @@ int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned o
 	return _lv_suspend(cmd, lvid_s, &laopts, 0, lv, lv_pre);
 }
 
+static int _check_suspended_lv(struct logical_volume *lv, void *data)
+{
+	struct lvinfo info;
+
+	if (lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) && info.exists && info.suspended) {
+		log_debug("Found suspended LV %s in critical section().", display_lvname(lv));
+		return 0; /* There is suspended subLV in the tree */
+	}
+
+	return 1;
+}
 
 static int _lv_resume(struct cmd_context *cmd, const char *lvid_s,
 		      struct lv_activate_opts *laopts, int error_if_not_active,
@@ -2315,10 +2326,18 @@ static int _lv_resume(struct cmd_context *cmd, const char *lvid_s,
 	if (!info.exists || !info.suspended) {
 		if (error_if_not_active)
 			goto_out;
-		r = 1;
-		if (!info.suspended)
-			critical_section_dec(cmd, "already resumed");
-		goto out;
+
+		if (!info.suspended && critical_section()) {
+			/* check if any subLV is suspended */
+			if ((r = for_each_sub_lv((struct logical_volume *)lv, &_check_suspended_lv, NULL))) {
+				/* Everything seems resumed */
+				critical_section_dec(cmd, "already resumed");
+				goto out;
+			}
+		} else {
+			r = 1;
+			goto out;
+		}
 	}
 
 	laopts->read_only = _passes_readonly_filter(cmd, lv);




More information about the lvm-devel mailing list