[libvirt] [PATCH v3 7/7] qemu: Format 'write-cache' parameter for disk frontends

Peter Krempa pkrempa at redhat.com
Wed Apr 18 15:33:38 UTC 2018


The disk cache mode translates to various frontend and backend
attributes for the qemu block layer. For the frontend device the
'writeback' parameter is used and provided as 'write-cache'. Implement
this so that we can later switch to using -blockdev where we will not
pass the cachemode directly any more.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_command.c                            | 27 ++++++++++++++++++++++
 .../disk-drive-write-cache.x86_64-2.7.0.args       | 10 ++++----
 .../disk-drive-write-cache.x86_64-latest.args      | 10 ++++----
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 238c6ed620..b666f3715f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1824,6 +1824,30 @@ qemuCheckIOThreads(const virDomainDef *def,
 }


+static int
+qemuBuildDriveDevCacheStr(virDomainDiskDefPtr disk,
+                          virBufferPtr buf,
+                          virQEMUCapsPtr qemuCaps)
+{
+    bool wb;
+
+    if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_DEFAULT)
+        return 0;
+
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISK_WRITE_CACHE))
+        return 0;
+
+    if (qemuDomainDiskCachemodeFlags(disk->cachemode, &wb, NULL, NULL) < 0)
+        return -1;
+
+    virBufferStrcat(buf, ",write-cache=",
+                    virTristateSwitchTypeToString(virTristateSwitchFromBool(wb)),
+                    NULL);
+
+    return 0;
+}
+
+
 char *
 qemuBuildDriveDevStr(const virDomainDef *def,
                      virDomainDiskDefPtr disk,
@@ -2140,6 +2164,9 @@ qemuBuildDriveDevStr(const virDomainDef *def,
         }
     }

+    if (qemuBuildDriveDevCacheStr(disk, &opt, qemuCaps) < 0)
+        goto error;
+
     if (virBufferCheckError(&opt) < 0)
         goto error;

diff --git a/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-2.7.0.args b/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-2.7.0.args
index 9af27dbbaf..7b67f4369c 100644
--- a/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-2.7.0.args
+++ b/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-2.7.0.args
@@ -28,16 +28,18 @@ server,nowait \
 -device lsi,id=scsi0,bus=pci.0,addr=0x2 \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\
 cache=writeback \
--device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
+-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\
+write-cache=on \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-scsi0-0-0,\
 cache=none \
--device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0 \
+-device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0,\
+write-cache=on \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-virtio-disk0,\
 cache=writethrough \
 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\
-id=virtio-disk0 \
+id=virtio-disk0,write-cache=off \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-usb-disk1,\
 cache=directsync \
 -device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk1,id=usb-disk1,\
-removable=off \
+removable=off,write-cache=off \
 -msg timestamp=on
diff --git a/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-latest.args b/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-latest.args
index b4bef87529..a63c5b7477 100644
--- a/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/disk-drive-write-cache.x86_64-latest.args
@@ -28,18 +28,20 @@ server,nowait \
 -device lsi,id=scsi0,bus=pci.0,addr=0x2 \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\
 cache=writeback \
--device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
+-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\
+write-cache=on \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-scsi0-0-0,\
 cache=none \
--device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0 \
+-device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0,\
+write-cache=on \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-virtio-disk0,\
 cache=writethrough \
 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\
-id=virtio-disk0 \
+id=virtio-disk0,write-cache=off \
 -drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-usb-disk1,\
 cache=directsync \
 -device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk1,id=usb-disk1,\
-removable=off \
+removable=off,write-cache=off \
 -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
 resourcecontrol=deny \
 -msg timestamp=on
-- 
2.16.2




More information about the libvir-list mailing list