[PATCH 16/35] qemu: block: Format cache modes for disk storage backends

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When used directly with blockdev-add/-blockdev the cache mode will need
to be specified directly for every image rather than just for the disk
itself. This implements the backing options 'direct' and 'no-flush'.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/qemu/qemu_block.c | 45 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index e3ee169368..3c04707618 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -1038,6 +1038,35 @@ qemuBlockStorageSourceGetVvfatProps(virStorageSourcePtr src)
 }


+static int
+qemuBlockStorageSourceGetBlockdevGetCacheProps(virStorageSourcePtr src,
+                                               virJSONValuePtr props)
+{
+    virJSONValuePtr cacheobj;
+    bool direct = false;
+    bool noflush = false;
+
+    if (src->cachemode == VIR_DOMAIN_DISK_CACHE_DEFAULT)
+        return 0;
+
+    if (qemuDomainDiskCachemodeFlags(src->cachemode, NULL, &direct, &noflush) < 0)
+        return -1;
+
+    if (virJSONValueObjectCreate(&cacheobj,
+                                 "b:direct", direct,
+                                 "b:no-flush", noflush,
+                                 NULL) < 0)
+        return -1;
+
+    if (virJSONValueObjectAppend(props, "cache", cacheobj) < 0) {
+        virJSONValueFree(cacheobj);
+        return -1;
+    }
+
+    return 0;
+}
+
+
 /**
  * qemuBlockStorageSourceGetBackendProps:
  * @src: disk source
@@ -1052,6 +1081,7 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
 {
     int actualType = virStorageSourceGetActualType(src);
     virJSONValuePtr fileprops = NULL;
+    virJSONValuePtr ret = NULL;

     switch ((virStorageType) actualType) {
     case VIR_STORAGE_TYPE_BLOCK:
@@ -1126,10 +1156,17 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
     }

     if (qemuBlockNodeNameValidate(src->nodestorage) < 0 ||
-        virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, NULL) < 0) {
-        virJSONValueFree(fileprops);
-        return NULL;
+        virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, NULL) < 0)
+        goto cleanup;
+
+    if (!legacy) {
+        if (qemuBlockStorageSourceGetBlockdevGetCacheProps(src, fileprops) < 0)
+            goto cleanup;
     }

-    return fileprops;
+    VIR_STEAL_PTR(ret, fileprops);
+
+ cleanup:
+    virJSONValueFree(fileprops);
+    return ret;
 }
-- 
2.16.2

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux