[libvirt] [PATCH] qemu: Support readonly filesystem passthrough

Osier Yang jyang at redhat.com
Wed Dec 21 16:26:06 UTC 2011


Upstream QEMU starts to support it from commit 2c74c2cb.
---
 docs/formatdomain.html.in    |    5 +++--
 src/qemu/qemu_capabilities.c |    7 ++++++-
 src/qemu/qemu_capabilities.h |    1 +
 src/qemu/qemu_command.c      |   11 +++++++++++
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index c57b7b3..9cf0f12 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1399,8 +1399,9 @@
 
       <dt><code>readonly</code></dt>
       <dd>
-      An optional <code>readonly</code> attribute is available but currently
-      unused.
+        Enables exporting filesytem as a readonly mount for guest, by
+        default read-write access is given (currently only works for
+        QEMU/KVM driver).
       </dd>
     </dl>
 
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index de2bc13..43c7578 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -143,6 +143,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
               "rombar",
               "ich9-ahci",
               "no-acpi",
+              "fsdev-readonly",
     );
 
 struct qemu_feature_flags {
@@ -981,6 +982,7 @@ qemuCapsComputeCmdFlags(const char *help,
                         virBitmapPtr flags)
 {
     const char *p;
+    const char *fsdev;
 
     if (strstr(help, "-no-kqemu"))
         qemuCapsSet(flags, QEMU_CAPS_KQEMU);
@@ -1077,8 +1079,11 @@ qemuCapsComputeCmdFlags(const char *help,
         qemuCapsSet(flags, QEMU_CAPS_NESTING);
     if (strstr(help, ",menu=on"))
         qemuCapsSet(flags, QEMU_CAPS_BOOT_MENU);
-    if (strstr(help, "-fsdev"))
+    if ((fsdev = strstr(help, "-fsdev"))) {
         qemuCapsSet(flags, QEMU_CAPS_FSDEV);
+        if (strstr(fsdev, "readonly"))
+            qemuCapsSet(flags, QEMU_CAPS_FSDEV_READONLY);
+    }
     if (strstr(help, "-smbios type"))
         qemuCapsSet(flags, QEMU_CAPS_SMBIOS_TYPE);
 
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 08d8457..c759baf 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -116,6 +116,7 @@ enum qemuCapsFlags {
     QEMU_CAPS_PCI_ROMBAR         = 76, /* -device rombar=0|1 */
     QEMU_CAPS_ICH9_AHCI         = 77, /* -device ich9-ahci */
     QEMU_CAPS_NO_ACPI		= 78, /* -no-acpi */
+    QEMU_CAPS_FSDEV_READONLY    =79, /* -fsdev readonly supported */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 9d3bc23..ea1b763 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2108,6 +2108,17 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
     virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
     virBufferAsprintf(&opt, ",path=%s", fs->src);
 
+    if (fs->readonly) {
+        if (qemuCapsGet(qemuCaps, QEMU_CAPS_FSDEV_READONLY)) {
+            virBufferAddLit(&opt, ",readonly");
+        } else {
+            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                            _("readonly filesystem is not supported by this "
+                              "QEMU binary"));
+            goto error;
+        }
+    }
+
     if (virBufferError(&opt)) {
         virReportOOMError();
         goto error;
-- 
1.7.7.3




More information about the libvir-list mailing list