Extract all the code setting up one storage source from the rest which
sets up the whole disk. This will allow us to prepare the whole backing
chain.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/conf/domain_conf.c | 112 ++++++++++++++++++++---------------------
1 file changed, 55 insertions(+), 57 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 531c765032..7bd86d67e5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -31424,37 +31424,28 @@ virDomainDiskTranslateISCSIDirect(virStorageSourcePtr src,
}
-int
-virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
+static int
+virDomainStorageSourceTranslateSourcePool(virStorageSourcePtr src,
+ virConnectPtr conn)
{
virStorageVolInfo info;
g_autoptr(virStoragePoolDef) pooldef = NULL;
g_autofree char *poolxml = NULL;
- g_autoptr(virConnect) conn = NULL;
g_autoptr(virStoragePool) pool = NULL;
g_autoptr(virStorageVol) vol = NULL;
- if (def->src->type != VIR_STORAGE_TYPE_VOLUME)
- return 0;
-
- if (!def->src->srcpool)
- return 0;
-
- if (!(conn = virGetConnectStorage()))
- return -1;
-
- if (!(pool = virStoragePoolLookupByName(conn, def->src->srcpool->pool)))
+ if (!(pool = virStoragePoolLookupByName(conn, src->srcpool->pool)))
return -1;
if (virStoragePoolIsActive(pool) != 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("storage pool '%s' containing volume '%s'
"
"is not active"),
- def->src->srcpool->pool,
def->src->srcpool->volume);
+ src->srcpool->pool, src->srcpool->volume);
return -1;
}
- if (!(vol = virStorageVolLookupByName(pool, def->src->srcpool->volume)))
+ if (!(vol = virStorageVolLookupByName(pool, src->srcpool->volume)))
return -1;
if (virStorageVolGetInfo(vol, &info) < 0)
@@ -31466,22 +31457,22 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
if (!(pooldef = virStoragePoolDefParseString(poolxml)))
return -1;
- def->src->srcpool->pooltype = pooldef->type;
- def->src->srcpool->voltype = info.type;
+ src->srcpool->pooltype = pooldef->type;
+ src->srcpool->voltype = info.type;
- if (def->src->srcpool->mode && pooldef->type !=
VIR_STORAGE_POOL_ISCSI) {
+ if (src->srcpool->mode && pooldef->type != VIR_STORAGE_POOL_ISCSI)
{
virReportError(VIR_ERR_XML_ERROR, "%s",
_("disk source mode is only valid when "
"storage pool is of iscsi type"));
return -1;
}
- VIR_FREE(def->src->path);
- virStorageNetHostDefFree(def->src->nhosts, def->src->hosts);
- def->src->nhosts = 0;
- def->src->hosts = NULL;
- virStorageAuthDefFree(def->src->auth);
- def->src->auth = NULL;
+ VIR_FREE(src->path);
+ virStorageNetHostDefFree(src->nhosts, src->hosts);
+ src->nhosts = 0;
+ src->hosts = NULL;
+ virStorageAuthDefFree(src->auth);
+ src->auth = NULL;
switch ((virStoragePoolType) pooldef->type) {
case VIR_STORAGE_POOL_DIR:
@@ -31492,32 +31483,24 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
case VIR_STORAGE_POOL_SCSI:
case VIR_STORAGE_POOL_ZFS:
case VIR_STORAGE_POOL_VSTORAGE:
- if (!(def->src->path = virStorageVolGetPath(vol)))
+ if (!(src->path = virStorageVolGetPath(vol)))
return -1;
- if (def->startupPolicy && info.type != VIR_STORAGE_VOL_FILE) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("'startupPolicy' is only valid for "
- "'file' type volume"));
- return -1;
- }
-
-
switch (info.type) {
case VIR_STORAGE_VOL_FILE:
- def->src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
+ src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
break;
case VIR_STORAGE_VOL_DIR:
- def->src->srcpool->actualtype = VIR_STORAGE_TYPE_DIR;
+ src->srcpool->actualtype = VIR_STORAGE_TYPE_DIR;
break;
case VIR_STORAGE_VOL_BLOCK:
- def->src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
+ src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
break;
case VIR_STORAGE_VOL_PLOOP:
- def->src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
+ src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
break;
case VIR_STORAGE_VOL_NETWORK:
@@ -31533,39 +31516,25 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
break;
case VIR_STORAGE_POOL_ISCSI_DIRECT:
- if (def->startupPolicy) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("'startupPolicy' is only valid for "
- "'file' type volume"));
- return -1;
- }
-
- if (virDomainDiskTranslateISCSIDirect(def->src, pooldef) < 0)
+ if (virDomainDiskTranslateISCSIDirect(src, pooldef) < 0)
return -1;
break;
case VIR_STORAGE_POOL_ISCSI:
- if (def->startupPolicy) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("'startupPolicy' is only valid for "
- "'file' type volume"));
- return -1;
- }
-
- switch (def->src->srcpool->mode) {
+ switch (src->srcpool->mode) {
case VIR_STORAGE_SOURCE_POOL_MODE_DEFAULT:
case VIR_STORAGE_SOURCE_POOL_MODE_LAST:
- def->src->srcpool->mode = VIR_STORAGE_SOURCE_POOL_MODE_HOST;
+ src->srcpool->mode = VIR_STORAGE_SOURCE_POOL_MODE_HOST;
G_GNUC_FALLTHROUGH;
case VIR_STORAGE_SOURCE_POOL_MODE_HOST:
- def->src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
- if (!(def->src->path = virStorageVolGetPath(vol)))
+ src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
+ if (!(src->path = virStorageVolGetPath(vol)))
return -1;
break;
case VIR_STORAGE_SOURCE_POOL_MODE_DIRECT:
- if (virDomainDiskTranslateISCSIDirect(def->src, pooldef) < 0)
+ if (virDomainDiskTranslateISCSIDirect(src, pooldef) < 0)
return -1;
break;
}
@@ -31587,6 +31556,35 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
}
+int
+virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
+{
+ g_autoptr(virConnect) conn = NULL;
+
+ if (def->src->type != VIR_STORAGE_TYPE_VOLUME)
+ return 0;
+
+ if (!def->src->srcpool)
+ return 0;
+
+ if (!(conn = virGetConnectStorage()))
+ return -1;
+
+ if (virDomainStorageSourceTranslateSourcePool(def->src, conn) < 0)
+ return -1;
+
+ if (def->startupPolicy != 0 &&
+ virStorageSourceGetActualType(def->src) != VIR_STORAGE_VOL_FILE) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("'startupPolicy' is only valid for "
+ "'file' type volume"));
+ return -1;
+ }
+
+ return 0;
+}
+
+
/**
* virDomainDiskGetDetectZeroesMode:
* @discard: disk/image sector discard setting
--
2.24.1