Make logical pools independent on target path

When using logical pools, we had to trust the target->path provided.
This parameter, however, can be completely ommited and we can use
'/dev/<source.name>' safely and populate it to target.path.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=952973
This commit is contained in:
Martin Kletzander 2013-04-30 13:48:46 +02:00
parent 9e45b3dfe3
commit efab27afbf
8 changed files with 71 additions and 27 deletions

View File

@ -62,7 +62,7 @@
<ref name='commonmetadata'/>
<ref name='sizing'/>
<ref name='sourcelogical'/>
<ref name='target'/>
<ref name='targetlogical'/>
</define>
<define name='pooldisk'>
@ -207,6 +207,17 @@
</element>
</define>
<define name='targetlogical'>
<element name='target'>
<optional>
<element name='path'>
<ref name='absFilePath'/>
</element>
</optional>
<ref name='permissions'/>
</element>
</define>
<define name='sourceinfohost'>
<oneOrMore>
<element name='host'>

View File

@ -1,7 +1,7 @@
/*
* storage_conf.c: config handling for storage driver
*
* Copyright (C) 2006-2012 Red Hat, Inc.
* Copyright (C) 2006-2013 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@ -956,10 +956,17 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
/* When we are working with a virtual disk we can skip the target
* path and permissions */
if (!(options->flags & VIR_STORAGE_POOL_SOURCE_NETWORK)) {
if (!(target_path = virXPathString("string(./target/path)", ctxt))) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("missing storage pool target path"));
goto error;
if (ret->type == VIR_STORAGE_POOL_LOGICAL) {
if (virAsprintf(&target_path, "/dev/%s", ret->source.name) < 0) {
goto error;
}
} else {
target_path = virXPathString("string(./target/path)", ctxt);
if (!target_path) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("missing storage pool target path"));
goto error;
}
}
ret->target.path = virFileSanitizePath(target_path);
if (!ret->target.path)

View File

@ -454,17 +454,7 @@ virStorageBackendLogicalCheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
bool *isActive)
{
char *path;
*isActive = false;
if (virAsprintf(&path, "/dev/%s", pool->def->source.name) < 0)
return -1;
if (access(path, F_OK) == 0)
*isActive = true;
VIR_FREE(path);
*isActive = (access(pool->def->target.path, F_OK) == 0);
return 0;
}
@ -794,21 +784,16 @@ virStorageBackendLogicalDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
unsigned int flags)
{
int ret = -1;
char *volpath = NULL;
virCommandPtr lvchange_cmd = NULL;
virCommandPtr lvremove_cmd = NULL;
virCheckFlags(0, -1);
if (virAsprintf(&volpath, "%s/%s",
pool->def->source.name, vol->name) < 0)
goto cleanup;
virFileWaitForDevices();
lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", volpath, NULL);
lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", volpath, NULL);
lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", vol->target.path, NULL);
lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", vol->target.path, NULL);
if (virCommandRun(lvremove_cmd, NULL) < 0) {
if (virCommandRun(lvchange_cmd, NULL) < 0) {
@ -821,7 +806,6 @@ virStorageBackendLogicalDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
ret = 0;
cleanup:
VIR_FREE(volpath);
virCommandFree(lvchange_cmd);
virCommandFree(lvremove_cmd);
return ret;

View File

@ -1,7 +1,7 @@
/*
* storage_driver.c: core driver for storage APIs
*
* Copyright (C) 2006-2012 Red Hat, Inc.
* Copyright (C) 2006-2013 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or

View File

@ -10,7 +10,7 @@
<device path="/dev/sdb3"/>
</source>
<target>
<path>/dev/HostVG</path>
<path>/invalid/nonexistent/path</path>
<permissions>
<mode>0700</mode>
<owner>0</owner>

View File

@ -0,0 +1,19 @@
<pool type='logical'>
<name>HostVG</name>
<uuid>1c13165a-d0f4-3aee-b447-30fb38789091</uuid>
<capacity>99891544064</capacity>
<allocation>99220455424</allocation>
<available>671088640</available>
<source>
<device path="/dev/sdb1"/>
<device path="/dev/sdb2"/>
<device path="/dev/sdb3"/>
</source>
<target>
<permissions>
<mode>0700</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>

View File

@ -0,0 +1,22 @@
<pool type='logical'>
<name>HostVG</name>
<uuid>1c13165a-d0f4-3aee-b447-30fb38789091</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<device path='/dev/sdb1'/>
<device path='/dev/sdb2'/>
<device path='/dev/sdb3'/>
<name>HostVG</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/HostVG</path>
<permissions>
<mode>0700</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>

View File

@ -87,6 +87,7 @@ mymain(void)
DO_TEST("pool-dir");
DO_TEST("pool-fs");
DO_TEST("pool-logical");
DO_TEST("pool-logical-nopath");
DO_TEST("pool-logical-create");
DO_TEST("pool-disk");
DO_TEST("pool-iscsi");