[libvirt PATCH 4/4] conf: add control over COW for storage pool directories
Peter Krempa
pkrempa at redhat.com
Thu Jul 23 13:06:03 UTC 2020
On Mon, Jul 20, 2020 at 18:33:22 +0100, Daniel Berrange wrote:
> The storage pool code now attempts to disable COW by default on btrfs,
> but management applications may wish to override this behaviour. Thus we
> introduce a concept of storage pool features:
>
> <features>
> <cow state='yes|no'/>
> </features>
>
> If the <cow> feature policy is set, it will be enforced. It will always
> return an hard error if COW cannot be explicitly set or unset.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> docs/formatstorage.html.in | 25 ++++++++++
> docs/schemas/storagepool.rng | 30 ++++++++++++
> src/conf/storage_conf.c | 49 ++++++++++++++++++++
> src/conf/storage_conf.h | 8 ++++
> src/storage/storage_util.c | 2 +-
> tests/storagepoolxml2xmlin/pool-dir-cow.xml | 10 ++++
> tests/storagepoolxml2xmlout/pool-dir-cow.xml | 15 ++++++
> tests/storagepoolxml2xmltest.c | 1 +
> 8 files changed, 139 insertions(+), 1 deletion(-)
> create mode 100644 tests/storagepoolxml2xmlin/pool-dir-cow.xml
> create mode 100644 tests/storagepoolxml2xmlout/pool-dir-cow.xml
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index 65d9b33049..4e63865b39 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -839,6 +839,33 @@ virStoragePoolDefRefreshFormat(virBufferPtr buf,
> }
>
>
> +static int
> +virStoragePoolDefParseFeatures(virStoragePoolDefPtr def,
> + xmlXPathContextPtr ctxt)
> +{
> + g_autofree char *cow = virXPathString("string(./features/cow/@state)", ctxt);
> +
> + if (cow) {
> + int val;
> + if (def->type != VIR_STORAGE_POOL_FS &&
> + def->type != VIR_STORAGE_POOL_DIR) {
> + virReportError(VIR_ERR_NO_SUPPORT, "%s",
> + _("cow feature may only be used for 'fs' and 'dir' pools"));
> + return -1;
> + }
> + if ((val = virTristateBoolTypeFromString(cow)) < 0) {
<= 0
> + virReportError(VIR_ERR_XML_ERROR,
> + _("invalid storage pool cow feature state '%s'"),
> + cow);
> + return -1;
> + }
> + def->features.cow = val;
> + }
> +
> + return 0;
> +}
> +
> +
> virStoragePoolDefPtr
> virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
> {
> @@ -910,6 +937,9 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
> }
> }
>
> + if (virStoragePoolDefParseFeatures(def, ctxt) < 0)
> + return NULL;
> +
> if (options->flags & VIR_STORAGE_POOL_SOURCE_HOST) {
> if (!def->source.nhost) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> @@ -1131,6 +1161,23 @@ virStoragePoolSourceFormat(virBufferPtr buf,
> }
>
>
> +static void
> +virStoragePoolDefFormatFeatures(virBufferPtr buf,
> + virStoragePoolDefPtr def)
> +{
> + if (!def->features.cow)
> + return;
> +
> + virBufferAddLit(buf, "<features>\n");
> + virBufferAdjustIndent(buf, 2);
> + if (def->features.cow)
def->features.cow != VIR_TRISTATE_BOOL_ABSENT
> + virBufferAsprintf(buf, "<cow state='%s'/>\n",
> + virTristateBoolTypeToString(def->features.cow));
> + virBufferAdjustIndent(buf, -2);
> + virBufferAddLit(buf, "</features>\n");
> +}
More information about the libvir-list
mailing list