[lvm-devel] master - lvconvert: disable lvmetad for repair

David Teigland teigland at sourceware.org
Thu Mar 16 16:52:21 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=506d88a2ec8cc4960b907b2cf34ca5786d060943
Commit:        506d88a2ec8cc4960b907b2cf34ca5786d060943
Parent:        e5b6f2685a462fbdd262685b39c2ac186475a051
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Thu Mar 16 10:56:05 2017 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Thu Mar 16 11:50:36 2017 -0500

lvconvert: disable lvmetad for repair

Repairing missing devices does not work reliably
with lvmetad, so disable lvmetad before repair.
A standard lvmetad refresh (pvscan --cache) will
enable lvmetad again.
---
 daemons/lvmetad/lvmetad-client.h |    1 +
 daemons/lvmetad/lvmetad-core.c   |    6 +++++-
 lib/cache/lvmetad.c              |    3 +++
 tools/lvmcmdline.c               |   10 +++++++++-
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/daemons/lvmetad/lvmetad-client.h b/daemons/lvmetad/lvmetad-client.h
index dd6a379..a2adfe6 100644
--- a/daemons/lvmetad/lvmetad-client.h
+++ b/daemons/lvmetad/lvmetad-client.h
@@ -25,6 +25,7 @@
 #define LVMETAD_DISABLE_REASON_LVM1		"LVM1"
 #define LVMETAD_DISABLE_REASON_DUPLICATES	"DUPLICATES"
 #define LVMETAD_DISABLE_REASON_VGRESTORE	"VGRESTORE"
+#define LVMETAD_DISABLE_REASON_REPAIR		"REPAIR"
 
 struct volume_group;
 
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
index 1faae11..aa00329 100644
--- a/daemons/lvmetad/lvmetad-core.c
+++ b/daemons/lvmetad/lvmetad-core.c
@@ -203,8 +203,9 @@ struct vg_info {
 #define GLFL_DISABLE_REASON_LVM1       0x00000008
 #define GLFL_DISABLE_REASON_DUPLICATES 0x00000010
 #define GLFL_DISABLE_REASON_VGRESTORE  0x00000020
+#define GLFL_DISABLE_REASON_REPAIR     0x00000040
 
-#define GLFL_DISABLE_REASON_ALL (GLFL_DISABLE_REASON_DIRECT | GLFL_DISABLE_REASON_LVM1 | GLFL_DISABLE_REASON_DUPLICATES | GLFL_DISABLE_REASON_VGRESTORE)
+#define GLFL_DISABLE_REASON_ALL (GLFL_DISABLE_REASON_DIRECT | GLFL_DISABLE_REASON_REPAIR | GLFL_DISABLE_REASON_LVM1 | GLFL_DISABLE_REASON_DUPLICATES | GLFL_DISABLE_REASON_VGRESTORE)
 
 #define VGFL_INVALID 0x00000001
 
@@ -2355,6 +2356,8 @@ static response set_global_info(lvmetad_state *s, request r)
 	if ((reason = daemon_request_str(r, "disable_reason", NULL))) {
 		if (strstr(reason, LVMETAD_DISABLE_REASON_DIRECT))
 			reason_flags |= GLFL_DISABLE_REASON_DIRECT;
+		if (strstr(reason, LVMETAD_DISABLE_REASON_REPAIR))
+			reason_flags |= GLFL_DISABLE_REASON_REPAIR;
 		if (strstr(reason, LVMETAD_DISABLE_REASON_LVM1))
 			reason_flags |= GLFL_DISABLE_REASON_LVM1;
 		if (strstr(reason, LVMETAD_DISABLE_REASON_DUPLICATES))
@@ -2420,6 +2423,7 @@ static response get_global_info(lvmetad_state *s, request r)
 	if (s->flags & GLFL_DISABLE) {
 		snprintf(reason, REASON_BUF_SIZE - 1, "%s%s%s%s",
 			 (s->flags & GLFL_DISABLE_REASON_DIRECT)     ? LVMETAD_DISABLE_REASON_DIRECT "," : "",
+			 (s->flags & GLFL_DISABLE_REASON_REPAIR)     ? LVMETAD_DISABLE_REASON_REPAIR "," : "",
 			 (s->flags & GLFL_DISABLE_REASON_LVM1)       ? LVMETAD_DISABLE_REASON_LVM1 "," : "",
 			 (s->flags & GLFL_DISABLE_REASON_DUPLICATES) ? LVMETAD_DISABLE_REASON_DUPLICATES "," : "",
 			 (s->flags & GLFL_DISABLE_REASON_VGRESTORE)  ? LVMETAD_DISABLE_REASON_VGRESTORE "," : "");
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index 843e1c3..e67fe31 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -2874,6 +2874,9 @@ int lvmetad_is_disabled(struct cmd_context *cmd, const char **reason)
 		} else if (strstr(reply_reason, LVMETAD_DISABLE_REASON_DIRECT)) {
 			*reason = "the disable flag was set directly";
 
+		} else if (strstr(reply_reason, LVMETAD_DISABLE_REASON_REPAIR)) {
+			*reason = "a repair command was run";
+
 		} else if (strstr(reply_reason, LVMETAD_DISABLE_REASON_LVM1)) {
 			*reason = "LVM1 metadata was found";
 
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index baf5d3b..5386bf3 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -19,6 +19,7 @@
 #include "label.h"
 #include "lvm-version.h"
 #include "lvmlockd.h"
+#include "lvmetad-client.h"
 
 #include "stub.h"
 #include "last-path-component.h"
@@ -2777,11 +2778,18 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 
 	if (!strcmp(cmd->fmt->name, FMT_LVM1_NAME) && lvmetad_used()) {
 		log_warn("WARNING: Disabling lvmetad cache which does not support obsolete metadata.");
-		lvmetad_set_disabled(cmd, "LVM1");
+		lvmetad_set_disabled(cmd, LVMETAD_DISABLE_REASON_LVM1);
 		log_warn("WARNING: Not using lvmetad because lvm1 format is used.");
 		lvmetad_make_unused(cmd);
 	}
 
+	if (cmd->command->command_enum == lvconvert_repair_pvs_or_thinpool_CMD) {
+		log_warn("WARNING: Disabling lvmetad cache for repair command.");
+		lvmetad_set_disabled(cmd, LVMETAD_DISABLE_REASON_REPAIR);
+		log_warn("WARNING: Not using lvmetad because of repair.");
+		lvmetad_make_unused(cmd);
+	}
+
 	if (cmd->metadata_read_only &&
 	    !(cmd->cname->flags & PERMITTED_READ_ONLY)) {
 		log_error("%s: Command not permitted while global/metadata_read_only "




More information about the lvm-devel mailing list