https://bugzilla.redhat.com/show_bug.cgi?id=1373711
Add a check for an existing volume group name before trying to build
the volume group. Since the process of building a vg involves wiping
the first 512 bytes and using pvcreate on each source device path before
creating the vg - we could conceivably overwrite something that we
shouldn't be. Also, once a pv is part of a vg, the pvcreate would fail
unless we chose to overwrite the volume.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
Difference w/ v2 is that I'm taking a different approach - disallow the
second pool-build since the vg already exists. NB: libvirt has no API
to extend an existing vg - that's left to an admin anyway.
src/storage/storage_backend_logical.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
index ca05fe1..b241495 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -682,14 +682,31 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn
ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
unsigned int flags)
{
- virCommandPtr vgcmd;
+ virCommandPtr vgcmd = NULL;
int fd;
char zeros[PV_BLANK_SECTOR_SIZE];
int ret = -1;
size_t i;
+ virStoragePoolSourceList sourceList;
virCheckFlags(0, -1);
+ /* Let's make sure the about to be created vg doesn't already exist */
+ memset(&sourceList, 0, sizeof(sourceList));
+ sourceList.type = VIR_STORAGE_POOL_LOGICAL;
+
+ if (virStorageBackendLogicalGetPoolSources(&sourceList) < 0)
+ return -1;
+
+ for (i = 0; i < sourceList.nsources; i++) {
+ if (STREQ(sourceList.sources[i].name, pool->def->source.name)) {
+ virReportError(VIR_ERR_STORAGE_POOL_BUILT,
+ _("volume group with name '%s' already
exists"),
+ pool->def->source.name);
+ goto cleanup;
+ }
+ }
+
memset(zeros, 0, sizeof(zeros));
vgcmd = virCommandNewArgList(VGCREATE, pool->def->source.name, NULL);
@@ -751,6 +768,9 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn
ATTRIBUTE_UNUSED,
ret = 0;
cleanup:
+ for (i = 0; i < sourceList.nsources; i++)
+ virStoragePoolSourceClear(&sourceList.sources[i]);
+ VIR_FREE(sourceList.sources);
virCommandFree(vgcmd);
return ret;
}
--
2.7.4