[lvm-devel] master - systemid: Add ACCESS_NEEDS_SYSTEM_ID VG flag.

Alasdair Kergon agk at fedoraproject.org
Wed Mar 4 01:17:17 UTC 2015


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=bfbb5d269aa1ed56d9308117b57d4d2da49d53f6
Commit:        bfbb5d269aa1ed56d9308117b57d4d2da49d53f6
Parent:        3562b5ab39b32bd27c81f57185e397facb7690f5
Author:        Alasdair G Kergon <agk at redhat.com>
AuthorDate:    Wed Mar 4 01:16:32 2015 +0000
Committer:     Alasdair G Kergon <agk at redhat.com>
CommitterDate: Wed Mar 4 01:16:32 2015 +0000

systemid: Add ACCESS_NEEDS_SYSTEM_ID VG flag.

Set ACCESS_NEEDS_SYSTEM_ID VG status flag whenever there is
a non-lvm1 system_id set.  Prevents concurrent access from
older LVM2 versions.
Not set on VGs that bear a system_id only due to conversion
from lvm1 metadata.
---
 WHATS_NEW                        |    1 +
 lib/format1/format1.c            |    2 ++
 lib/format1/import-export.c      |    4 +++-
 lib/format_text/flags.c          |    1 +
 lib/format_text/import_vsn1.c    |   20 ++++++++++++--------
 lib/metadata/metadata-exported.h |    3 ++-
 lib/metadata/vg.c                |    3 +++
 tools/vgchange.c                 |    6 +++++-
 8 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index ae8bc70..9beb668 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.117 - 
 ====================================
+  Set ACCESS_NEEDS_SYSTEM_ID VG status flag while system_id is set.
   Preserve original format type field when processing backup files.
   Implement status action for lvm2-monitor initscript to display monitored LVs.
   Allow lvchange -p to change kernel state only if metadata state differs.
diff --git a/lib/format1/format1.c b/lib/format1/format1.c
index 19df8aa..7f37cf5 100644
--- a/lib/format1/format1.c
+++ b/lib/format1/format1.c
@@ -501,6 +501,8 @@ static int _format1_vg_setup(struct format_instance *fid, struct volume_group *v
             !generate_lvm1_system_id(vg->cmd, vg->lvm1_system_id, ""))
 		return_0;
 
+	vg->status &= ~ACCESS_NEEDS_SYSTEM_ID;
+
 	return 1;
 }
 
diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c
index 9b387e2..4846a8b 100644
--- a/lib/format1/import-export.c
+++ b/lib/format1/import-export.c
@@ -69,8 +69,10 @@ int import_pv(const struct format_type *fmt, struct dm_pool *mem,
 	memcpy(&pv->vgid, vgd->vg_uuid, sizeof(vg->id));
 
 	/* Store system_id from first PV if PV belongs to a VG */
-	if (vg && !*vg->lvm1_system_id)
+	if (vg && !*vg->lvm1_system_id) {
 		strncpy(vg->lvm1_system_id, (char *)pvd->system_id, NAME_LEN);
+		vg->status &= ~ACCESS_NEEDS_SYSTEM_ID;
+	}
 
 	if (vg &&
 	    strncmp(vg->lvm1_system_id, (char *)pvd->system_id, sizeof(pvd->system_id)))
diff --git a/lib/format_text/flags.c b/lib/format_text/flags.c
index cf01271..1a4a503 100644
--- a/lib/format_text/flags.c
+++ b/lib/format_text/flags.c
@@ -36,6 +36,7 @@ static const struct flag _vg_flags[] = {
 	{LVM_WRITE, "WRITE", STATUS_FLAG},
 	{CLUSTERED, "CLUSTERED", STATUS_FLAG},
 	{SHARED, "SHARED", STATUS_FLAG},
+	{ACCESS_NEEDS_SYSTEM_ID, "ACCESS_NEEDS_SYSTEM_ID", STATUS_FLAG},
 	{PARTIAL_VG, NULL, 0},
 	{PRECOMMITTED, NULL, 0},
 	{ARCHIVED_VG, NULL, 0},
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index 64c08a0..8ab9363e 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -733,11 +733,10 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 {
 	const struct dm_config_node *vgn;
 	const struct dm_config_value *cv;
-	const char *str, *format_str;
+	const char *str, *system_id, *format_str;
 	struct volume_group *vg;
 	struct dm_hash_table *pv_hash = NULL, *lv_hash = NULL;
 	unsigned scan_done_once = use_cached_pvs;
-	char *system_id;
 
 	/* skip any top-level values */
 	for (vgn = cft->root; (vgn && vgn->v); vgn = vgn->sib)
@@ -751,9 +750,6 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	if (!(vg = alloc_vg("read_vg", fid->fmt->cmd, vgn->key)))
 		return_NULL;
 
-	if (!(system_id = dm_pool_zalloc(vg->vgmem, NAME_LEN + 1)))
-		goto_bad;
-	vg->system_id = system_id;
 
 	/*
 	 * The pv hash memorises the pv section names -> pv
@@ -782,9 +778,6 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 		goto bad;
 	}
 
-	if (dm_config_get_str(vgn, "system_id", &str))
-		strncpy(system_id, str, NAME_LEN);
-
 	if (!_read_id(&vg->id, vgn, "id")) {
 		log_error("Couldn't read uuid for volume group %s.", vg->name);
 		goto bad;
@@ -802,6 +795,17 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 		goto bad;
 	}
 
+	if (dm_config_get_str(vgn, "system_id", &system_id)) {
+		if (!(vg->status & ACCESS_NEEDS_SYSTEM_ID)) {
+			if (!(vg->lvm1_system_id = dm_pool_zalloc(vg->vgmem, NAME_LEN + 1)))
+				goto_bad;
+			strncpy(vg->lvm1_system_id, system_id, NAME_LEN);
+		} else if (!(vg->system_id = dm_pool_strdup(vg->vgmem, system_id))) {
+			log_error("Failed to allocate memory for system_id in vg_set_system_id.");
+			goto bad;
+		}
+	}
+
 	if (!_read_int32(vgn, "extent_size", &vg->extent_size)) {
 		log_error("Couldn't read extent size for volume group %s.",
 			  vg->name);
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 758fa53..5fbfdef 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -60,6 +60,7 @@
 #define LVM_WRITE		UINT64_C(0x0000000000000200)	/* LV, VG */
 
 #define CLUSTERED		UINT64_C(0x0000000000000400)	/* VG */
+#define ACCESS_NEEDS_SYSTEM_ID	UINT64_C(0x0020000000000000)    /* VG */
 //#define SHARED		UINT64_C(0x0000000000000800)	/* VG */
 
 /* FIXME Remove when metadata restructuring is completed */
@@ -122,7 +123,7 @@
 #define PV_ALLOCATION_PROHIBITED	UINT64_C(0x0010000000000000)	/* PV - internal use only - allocation prohibited
 									e.g. to prohibit allocation of a RAID image
 									on a PV already holing an image of the RAID set */
-/* Next unused flag:		UINT64_C(0x0020000000000000)    */
+/* Next unused flag:		UINT64_C(0x0040000000000000)    */
 
 /* Format features flags */
 #define FMT_SEGMENTS		0x00000001U	/* Arbitrary segment params? */
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index 404cc6f..b23063e 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -615,6 +615,7 @@ int vg_set_system_id(struct volume_group *vg, const char *system_id)
 {
 	if (!system_id || !*system_id) {
 		vg->system_id = NULL;
+		vg->status &= ~ACCESS_NEEDS_SYSTEM_ID;
 		return 1;
 	}
 
@@ -632,6 +633,8 @@ int vg_set_system_id(struct volume_group *vg, const char *system_id)
 	if (vg->lvm1_system_id)
 		*vg->lvm1_system_id = '\0';
 
+	vg->status |= ACCESS_NEEDS_SYSTEM_ID;
+
 	return 1;
 }
 
diff --git a/tools/vgchange.c b/tools/vgchange.c
index 36b44a9..557fe34 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -575,10 +575,14 @@ static int _vgchange_system_id(struct cmd_context *cmd, struct volume_group *vg)
 		    vg->name, vg->system_id, system_id);
 
 	vg->system_id = system_id;
-	
 	if (vg->lvm1_system_id)
 		*vg->lvm1_system_id = '\0';
 
+	if (vg->system_id && *vg->system_id)
+		vg->status |= ACCESS_NEEDS_SYSTEM_ID;
+	else
+		vg->status &= ~ACCESS_NEEDS_SYSTEM_ID;
+
 	return 1;
 }
 




More information about the lvm-devel mailing list