[lvm-devel] master - lvextend: refresh shared LV using select option

David Teigland teigland at sourceware.org
Fri Mar 22 19:40:30 UTC 2019


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=86b96ede2af32404d0b7b5f516a35dafc4da442e
Commit:        86b96ede2af32404d0b7b5f516a35dafc4da442e
Parent:        85e68a8333722b7694d607652dd1f834fadfd8c4
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Fri Mar 22 14:28:02 2019 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Fri Mar 22 14:35:02 2019 -0500

lvextend: refresh shared LV using select option

Using --select 'lvname=LV && vgname=VG' avoids the problem
of the lvchange exit code not distinguishing an actual error
result vs the VG or LV not existing.  (This is in case there
is an odd dlm/gfs2 setup where some nodes are running the dlm
but do not have access to the VG.)
---
 daemons/lvmlockd/lvmlockd-dlm.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/daemons/lvmlockd/lvmlockd-dlm.c b/daemons/lvmlockd/lvmlockd-dlm.c
index 385d533..21aaa2d 100644
--- a/daemons/lvmlockd/lvmlockd-dlm.c
+++ b/daemons/lvmlockd/lvmlockd-dlm.c
@@ -781,15 +781,47 @@ int lm_is_running_dlm(void)
 
 int lm_refresh_lv_start_dlm(struct action *act)
 {
+	char path[PATH_MAX];
 	char command[DLMC_RUN_COMMAND_LEN];
 	char run_uuid[DLMC_RUN_UUID_LEN];
+	char *p, *vgname, *lvname;
 	int rv;
 
+	/* split /dev/vgname/lvname into vgname and lvname strings */
+	strncpy(path, act->path, strlen(act->path));
+
+	/* skip past dev */
+	p = strchr(path + 1, '/');
+
+	/* skip past slashes */
+	while (*p == '/')
+		p++;
+
+	/* start of vgname */
+	vgname = p;
+
+	/* skip past vgname */
+	while (*p != '/')
+		p++;
+
+	/* terminate vgname */
+	*p = '\0';
+	p++;
+
+	/* skip past slashes */
+	while (*p == '/')
+		p++;
+
+	lvname = p;
+
 	memset(command, 0, sizeof(command));
 	memset(run_uuid, 0, sizeof(run_uuid));
 
+	/* todo: add --readonly */
+
 	snprintf(command, DLMC_RUN_COMMAND_LEN,
-		 "lvm lvchange --refresh --nolocking %s", act->path);
+		 "lvm lvchange --refresh --partial --nolocking --select 'lvname=%s && vgname=%s'",
+		 lvname, vgname);
 
 	rv = dlmc_run_start(command, strlen(command), 0,
 			    DLMC_FLAG_RUN_START_NODE_NONE,




More information about the lvm-devel mailing list