From c4e7c1f212f600f61aba606cd00d7d5ed4eb49b6 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 5 Mar 2018 15:13:41 +0100 Subject: [PATCH] conf: disk: Separate virStorageSource formatting Move out formatting of 'startuPolicy' which is a property of the disk out of the element. Extracting the code formating the content and attributes will also allow reuse in other parts of the code. Signed-off-by: Peter Krempa --- src/conf/domain_conf.c | 146 +++++++++++++++++++++------------------ src/conf/domain_conf.h | 7 ++ src/libvirt_private.syms | 1 + 3 files changed, 88 insertions(+), 66 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b77cc8ed9f..1c79d2b49b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -22798,6 +22798,74 @@ virDomainDiskSourceFormatPrivateData(virBufferPtr buf, } +int +virDomainStorageSourceFormat(virBufferPtr attrBuf, + virBufferPtr childBuf, + virStorageSourcePtr src, + unsigned int flags, + bool skipSeclabels) +{ + switch ((virStorageType)src->type) { + case VIR_STORAGE_TYPE_FILE: + virBufferEscapeString(attrBuf, " file='%s'", src->path); + break; + + case VIR_STORAGE_TYPE_BLOCK: + virBufferEscapeString(attrBuf, " dev='%s'", src->path); + break; + + case VIR_STORAGE_TYPE_DIR: + virBufferEscapeString(attrBuf, " dir='%s'", src->path); + break; + + case VIR_STORAGE_TYPE_NETWORK: + if (virDomainDiskSourceFormatNetwork(attrBuf, childBuf, + src, flags) < 0) + return -1; + break; + + case VIR_STORAGE_TYPE_VOLUME: + if (src->srcpool) { + virBufferEscapeString(attrBuf, " pool='%s'", src->srcpool->pool); + virBufferEscapeString(attrBuf, " volume='%s'", + src->srcpool->volume); + if (src->srcpool->mode) + virBufferAsprintf(attrBuf, " mode='%s'", + virStorageSourcePoolModeTypeToString(src->srcpool->mode)); + } + + break; + + case VIR_STORAGE_TYPE_NONE: + case VIR_STORAGE_TYPE_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected disk type %d"), src->type); + return -1; + } + + if (!skipSeclabels && src->type != VIR_STORAGE_TYPE_NETWORK) + virDomainSourceDefFormatSeclabel(childBuf, src->nseclabels, + src->seclabels, flags); + + /* Storage Source formatting will not carry through the blunder + * that disk source formatting had at one time to format the + * for a volume source type. The information is + * kept in the storage pool and would be overwritten anyway. + * So avoid formatting it for volumes. */ + if (src->auth && src->authInherited && + src->type != VIR_STORAGE_TYPE_VOLUME) + virStorageAuthDefFormat(childBuf, src->auth); + + /* If we found encryption as a child of , then format it + * as we found it. */ + if (src->encryption && src->encryptionInherited && + virStorageEncryptionFormat(childBuf, src->encryption) < 0) + return -1; + + return 0; +} + + static int virDomainDiskSourceFormatInternal(virBufferPtr buf, virStorageSourcePtr src, @@ -22808,84 +22876,30 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, { virBuffer attrBuf = VIR_BUFFER_INITIALIZER; virBuffer childBuf = VIR_BUFFER_INITIALIZER; + int ret = -1; virBufferSetChildIndent(&childBuf, buf); - switch ((virStorageType)src->type) { - case VIR_STORAGE_TYPE_FILE: - virBufferEscapeString(&attrBuf, " file='%s'", src->path); - break; + if (virDomainStorageSourceFormat(&attrBuf, &childBuf, src, flags, + skipSeclabels) < 0) + goto cleanup; - case VIR_STORAGE_TYPE_BLOCK: - virBufferEscapeString(&attrBuf, " dev='%s'", src->path); - break; - - case VIR_STORAGE_TYPE_DIR: - virBufferEscapeString(&attrBuf, " dir='%s'", src->path); - break; - - case VIR_STORAGE_TYPE_NETWORK: - if (virDomainDiskSourceFormatNetwork(&attrBuf, &childBuf, - src, flags) < 0) - goto error; - break; - - case VIR_STORAGE_TYPE_VOLUME: - if (src->srcpool) { - virBufferEscapeString(&attrBuf, " pool='%s'", src->srcpool->pool); - virBufferEscapeString(&attrBuf, " volume='%s'", - src->srcpool->volume); - if (src->srcpool->mode) - virBufferAsprintf(&attrBuf, " mode='%s'", - virStorageSourcePoolModeTypeToString(src->srcpool->mode)); - } - - break; - - case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected disk type %d"), src->type); - goto error; - } - - if (src->type != VIR_STORAGE_TYPE_NETWORK) { - if (policy) - virBufferEscapeString(&attrBuf, " startupPolicy='%s'", - virDomainStartupPolicyTypeToString(policy)); - - if (!skipSeclabels) - virDomainSourceDefFormatSeclabel(&childBuf, src->nseclabels, - src->seclabels, flags); - } - - /* Storage Source formatting will not carry through the blunder - * that disk source formatting had at one time to format the - * for a volume source type. The information is - * kept in the storage pool and would be overwritten anyway. - * So avoid formatting it for volumes. */ - if (src->auth && src->authInherited && - src->type != VIR_STORAGE_TYPE_VOLUME) - virStorageAuthDefFormat(&childBuf, src->auth); - - /* If we found encryption as a child of , then format it - * as we found it. */ - if (src->encryption && src->encryptionInherited && - virStorageEncryptionFormat(&childBuf, src->encryption) < 0) - goto error; + if (policy && src->type != VIR_STORAGE_TYPE_NETWORK) + virBufferEscapeString(&attrBuf, " startupPolicy='%s'", + virDomainStartupPolicyTypeToString(policy)); if (virDomainDiskSourceFormatPrivateData(&childBuf, src, flags, xmlopt) < 0) - goto error; + goto cleanup; if (virXMLFormatElement(buf, "source", &attrBuf, &childBuf) < 0) - goto error; + goto cleanup; - return 0; + ret = 0; - error: + cleanup: virBufferFreeAndReset(&attrBuf); virBufferFreeAndReset(&childBuf); - return -1; + return ret; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 337ce79425..61379e50fe 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3427,6 +3427,13 @@ int virDomainDiskDefCheckDuplicateInfo(const virDomainDiskDef *a, const virDomainDiskDef *b) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int virDomainStorageSourceFormat(virBufferPtr attrBuf, + virBufferPtr childBuf, + virStorageSourcePtr src, + unsigned int flags, + bool skipSeclabels) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); + int virDomainDefGetVcpuPinInfoHelper(virDomainDefPtr def, int maplen, int ncpumaps, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3766e20d3b..c67bce7389 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -542,6 +542,7 @@ virDomainStateReasonFromString; virDomainStateReasonToString; virDomainStateTypeFromString; virDomainStateTypeToString; +virDomainStorageSourceFormat; virDomainTaintTypeFromString; virDomainTaintTypeToString; virDomainTimerModeTypeFromString;