Blame SOURCES/lvm2-2_02_182-fix-clustered-mirror-repair.patch

7dde34
 WHATS_NEW               |  1 +
7dde34
 lib/activate/activate.c |  3 +--
7dde34
 tools/lvchange.c        | 28 +++++++++++++++++++---------
7dde34
 tools/vgchange.c        | 15 +++++++++++++--
7dde34
 4 files changed, 34 insertions(+), 13 deletions(-)
7dde34
7dde34
diff --git a/WHATS_NEW b/WHATS_NEW
7dde34
index d8a24b0..a1da4b7 100644
7dde34
--- a/WHATS_NEW
7dde34
+++ b/WHATS_NEW
7dde34
@@ -1,5 +1,6 @@
7dde34
 Version 2.02.182 - 
7dde34
 ==============================
7dde34
+  Fix change of monitoring in clustered volumes.
7dde34
   Fix lvconvert striped/raid0/raid0_meta -> raid6 regression.
7dde34
   Add After=rbdmap.service to {lvm2-activation-net,blk-availability}.service.
7dde34
   Fix lvconvert conversion attempts to linear.
7dde34
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
7dde34
index 16704f6..0bc857f 100644
7dde34
--- a/lib/activate/activate.c
7dde34
+++ b/lib/activate/activate.c
7dde34
@@ -2061,8 +2061,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
7dde34
 		} else
7dde34
 			continue;
7dde34
 
7dde34
-		if (!vg_write_lock_held() && lv_is_mirror(lv)) {
7dde34
-			mirr_laopts.exclusive = lv_is_active_exclusive_locally(lv) ? 1 : 0;
7dde34
+		if (!cmd->is_clvmd && !vg_write_lock_held() && lv_is_mirror(lv)) {
7dde34
 			/*
7dde34
 			 * Commands vgchange and lvchange do use read-only lock when changing
7dde34
 			 * monitoring (--monitor y|n). All other use cases hold 'write-lock'
7dde34
diff --git a/tools/lvchange.c b/tools/lvchange.c
7dde34
index 6144852..7e5cb5b 100644
7dde34
--- a/tools/lvchange.c
7dde34
+++ b/tools/lvchange.c
7dde34
@@ -148,7 +148,8 @@ static int _lvchange_pool_update(struct cmd_context *cmd,
7dde34
  */
7dde34
 
7dde34
 static int _lvchange_monitoring(struct cmd_context *cmd,
7dde34
-				struct logical_volume *lv)
7dde34
+				struct logical_volume *lv,
7dde34
+				int was_refreshed)
7dde34
 {
7dde34
 	struct lvinfo info;
7dde34
 
7dde34
@@ -163,8 +164,15 @@ static int _lvchange_monitoring(struct cmd_context *cmd,
7dde34
 			log_verbose("Monitoring LV %s", display_lvname(lv));
7dde34
 		else
7dde34
 			log_verbose("Unmonitoring LV %s", display_lvname(lv));
7dde34
-		if (!monitor_dev_for_events(cmd, lv, 0, dmeventd_monitor_mode()))
7dde34
-			return_0;
7dde34
+
7dde34
+		if (!was_refreshed) {
7dde34
+			if (locking_is_clustered()) {
7dde34
+				/* FIXME: doesn't work when the LV is not lockholder */
7dde34
+				if (!lv_refresh(cmd, lv))
7dde34
+					return_0;
7dde34
+			} else if (!monitor_dev_for_events(cmd, lv, 0, dmeventd_monitor_mode()))
7dde34
+				return_0;
7dde34
+		}
7dde34
 	}
7dde34
 
7dde34
 	return 1;
7dde34
@@ -176,7 +184,8 @@ static int _lvchange_monitoring(struct cmd_context *cmd,
7dde34
  */
7dde34
 
7dde34
 static int _lvchange_background_polling(struct cmd_context *cmd,
7dde34
-					struct logical_volume *lv)
7dde34
+					struct logical_volume *lv,
7dde34
+					int was_refreshed)
7dde34
 {
7dde34
 	struct lvinfo info;
7dde34
 
7dde34
@@ -187,7 +196,8 @@ static int _lvchange_background_polling(struct cmd_context *cmd,
7dde34
 
7dde34
 	if (background_polling()) {
7dde34
 		log_verbose("Polling LV %s", display_lvname(lv));
7dde34
-		lv_spawn_background_polling(cmd, lv);
7dde34
+		if (!was_refreshed)
7dde34
+			lv_spawn_background_polling(cmd, lv);
7dde34
 	}
7dde34
 
7dde34
 	return 1;
7dde34
@@ -1444,11 +1454,11 @@ static int _lvchange_refresh_single(struct cmd_context *cmd,
7dde34
 	 * checking poll arg.  Pull that out of lv_refresh.
7dde34
 	 */
7dde34
 	if (arg_is_set(cmd, poll_ARG) &&
7dde34
-	    !_lvchange_background_polling(cmd, lv))
7dde34
+	    !_lvchange_background_polling(cmd, lv, 1))
7dde34
 		return_ECMD_FAILED;
7dde34
 
7dde34
 	if (arg_is_set(cmd, monitor_ARG) &&
7dde34
-	    !_lvchange_monitoring(cmd, lv))
7dde34
+	    !_lvchange_monitoring(cmd, lv, 1))
7dde34
 		return_ECMD_FAILED;
7dde34
 
7dde34
 	return ECMD_PROCESSED;
7dde34
@@ -1606,11 +1616,11 @@ static int _lvchange_monitor_poll_single(struct cmd_context *cmd,
7dde34
 				         struct processing_handle *handle)
7dde34
 {
7dde34
 	if (arg_is_set(cmd, monitor_ARG) &&
7dde34
-	    !_lvchange_monitoring(cmd, lv))
7dde34
+	    !_lvchange_monitoring(cmd, lv, 0))
7dde34
 		return_ECMD_FAILED;
7dde34
 
7dde34
 	if (arg_is_set(cmd, poll_ARG) &&
7dde34
-	    !_lvchange_background_polling(cmd, lv))
7dde34
+	    !_lvchange_background_polling(cmd, lv, 0))
7dde34
 		return_ECMD_FAILED;
7dde34
 
7dde34
 	return ECMD_PROCESSED;
7dde34
diff --git a/tools/vgchange.c b/tools/vgchange.c
7dde34
index 67be3ec..fa2d585 100644
7dde34
--- a/tools/vgchange.c
7dde34
+++ b/tools/vgchange.c
7dde34
@@ -42,7 +42,16 @@ static int _monitor_lvs_in_vg(struct cmd_context *cmd,
7dde34
 		if (lv_is_pvmove(lv))
7dde34
 			continue;
7dde34
 
7dde34
-		if (!monitor_dev_for_events(cmd, lv, 0, reg)) {
7dde34
+		if (locking_is_clustered()) {
7dde34
+			if (lv != lv_lock_holder(lv))
7dde34
+				continue;
7dde34
+			if (!lv_refresh(cmd, lv)) {
7dde34
+				stack;
7dde34
+				r = 0;
7dde34
+				continue;
7dde34
+			}
7dde34
+		} else if (!monitor_dev_for_events(cmd, lv, 0, reg)) {
7dde34
+			stack;
7dde34
 			r = 0;
7dde34
 			continue;
7dde34
 		}
7dde34
@@ -157,8 +166,10 @@ static int _vgchange_monitoring(struct cmd_context *cmd, struct volume_group *vg
7dde34
 
7dde34
 	if (lvs_in_vg_activated(vg) &&
7dde34
 	    dmeventd_monitor_mode() != DMEVENTD_MONITOR_IGNORE) {
7dde34
-		if (!_monitor_lvs_in_vg(cmd, vg, dmeventd_monitor_mode(), &monitored))
7dde34
+		if (!_monitor_lvs_in_vg(cmd, vg, dmeventd_monitor_mode(), &monitored)) {
7dde34
+			stack;
7dde34
 			r = 0;
7dde34
+		}
7dde34
 		log_print_unless_silent("%d logical volume(s) in volume group "
7dde34
 					"\"%s\" %smonitored",
7dde34
 					monitored, vg->name, (dmeventd_monitor_mode()) ? "" : "un");