[libvirt PATCH 2/2] qemu: do not use deprecated options for new virtiofsd

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

 



Use the to-be-introduced virtiofsd capability to mark whether
new options are safe to use.

Depends on:
https://gitlab.com/virtio-fs/virtiofsd/-/merge_requests/231

https://issues.redhat.com/browse/RHEL-7108

Signed-off-by: Ján Tomko <jtomko@xxxxxxxxxx>
---
 src/qemu/qemu_vhost_user.c |  5 ++-
 src/qemu/qemu_virtiofs.c   | 79 +++++++++++++++++++++++++-------------
 2 files changed, 56 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_vhost_user.c b/src/qemu/qemu_vhost_user.c
index b916412bc0..a31fe6ed53 100644
--- a/src/qemu/qemu_vhost_user.c
+++ b/src/qemu/qemu_vhost_user.c
@@ -450,6 +450,7 @@ qemuVhostUserFillFSCapabilities(virBitmap **caps,
     if (!(featuresJSON = virJSONValueObjectGetArray(doc, "features")))
         return 0;
 
+    features = virBitmapNew(1);
     nfeatures = virJSONValueArraySize(featuresJSON);
 
     for (i = 0; i < nfeatures; i++) {
@@ -457,8 +458,8 @@ qemuVhostUserFillFSCapabilities(virBitmap **caps,
         const char *tmpStr = virJSONValueGetString(item);
         int tmp;
 
-        if ((tmp = qemuVhostUserFSFeatureTypeFromString(tmpStr)) <= 0) {
-            VIR_DEBUG("ignoring unknown QEMU vhost-user feature '%s'", tmpStr);
+        if ((tmp = qemuVhostUserFSFeatureTypeFromString(tmpStr)) < 0) {
+            VIR_DEBUG("ignoring unknown QEMU virtiofs feature '%s'", tmpStr);
             continue;
         }
         virBitmapSetBitExpand(features, tmp);
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
index aba6a19562..f16e0c8532 100644
--- a/src/qemu/qemu_virtiofs.c
+++ b/src/qemu/qemu_virtiofs.c
@@ -139,36 +139,63 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfig *cfg,
     virCommandPassFD(cmd, *fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
     *fd = -1;
 
-    virCommandAddArg(cmd, "-o");
-    virBufferAddLit(&opts, "source=");
-    virQEMUBuildBufferEscapeComma(&opts, fs->src->path);
-    if (fs->cache)
-        virBufferAsprintf(&opts, ",cache=%s", virDomainFSCacheModeTypeToString(fs->cache));
-    if (fs->sandbox)
-        virBufferAsprintf(&opts, ",sandbox=%s", virDomainFSSandboxModeTypeToString(fs->sandbox));
-
-    if (fs->xattr == VIR_TRISTATE_SWITCH_ON)
-        virBufferAddLit(&opts, ",xattr");
-    else if (fs->xattr == VIR_TRISTATE_SWITCH_OFF)
-        virBufferAddLit(&opts, ",no_xattr");
-
-    if (fs->flock == VIR_TRISTATE_SWITCH_ON)
-        virBufferAddLit(&opts, ",flock");
-    else if (fs->flock == VIR_TRISTATE_SWITCH_OFF)
-        virBufferAddLit(&opts, ",no_flock");
-
-    if (fs->posix_lock == VIR_TRISTATE_SWITCH_ON)
-        virBufferAddLit(&opts, ",posix_lock");
-    else if (fs->posix_lock == VIR_TRISTATE_SWITCH_OFF)
-        virBufferAddLit(&opts, ",no_posix_lock");
-
-    virCommandAddArgBuffer(cmd, &opts);
+    if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_OPTIONS)) {
+        virCommandAddArg(cmd, "--shared-dir");
+        virCommandAddArg(cmd, fs->src->path);
+
+        if (fs->cache) {
+            virCommandAddArg(cmd, "--cache");
+            virCommandAddArg(cmd, virDomainFSCacheModeTypeToString(fs->cache));
+        }
+        if (fs->sandbox) {
+            virCommandAddArg(cmd, "--sandbox");
+            virCommandAddArg(cmd, virDomainFSSandboxModeTypeToString(fs->sandbox));
+        }
+
+        if (fs->xattr == VIR_TRISTATE_SWITCH_ON)
+            virCommandAddArg(cmd, "--xattr");
+
+        if (fs->posix_lock != VIR_TRISTATE_SWITCH_ABSENT ||
+            fs->flock != VIR_TRISTATE_SWITCH_ABSENT) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("locking options are not supported by this virtiofsd"));
+            return NULL;
+        }
+    } else {
+        virCommandAddArg(cmd, "-o");
+        virBufferAddLit(&opts, "source=");
+        virQEMUBuildBufferEscapeComma(&opts, fs->src->path);
+        if (fs->cache)
+            virBufferAsprintf(&opts, ",cache=%s", virDomainFSCacheModeTypeToString(fs->cache));
+        if (fs->sandbox)
+            virBufferAsprintf(&opts, ",sandbox=%s", virDomainFSSandboxModeTypeToString(fs->sandbox));
+
+        if (fs->xattr == VIR_TRISTATE_SWITCH_ON)
+            virBufferAddLit(&opts, ",xattr");
+        else if (fs->xattr == VIR_TRISTATE_SWITCH_OFF)
+            virBufferAddLit(&opts, ",no_xattr");
+
+        if (fs->flock == VIR_TRISTATE_SWITCH_ON)
+            virBufferAddLit(&opts, ",flock");
+        else if (fs->flock == VIR_TRISTATE_SWITCH_OFF)
+            virBufferAddLit(&opts, ",no_flock");
+
+        if (fs->posix_lock == VIR_TRISTATE_SWITCH_ON)
+            virBufferAddLit(&opts, ",posix_lock");
+        else if (fs->posix_lock == VIR_TRISTATE_SWITCH_OFF)
+            virBufferAddLit(&opts, ",no_posix_lock");
+
+        virCommandAddArgBuffer(cmd, &opts);
+    }
 
     if (fs->thread_pool_size >= 0)
         virCommandAddArgFormat(cmd, "--thread-pool-size=%i", fs->thread_pool_size);
 
-    if (cfg->virtiofsdDebug)
-        virCommandAddArg(cmd, "-d");
+    if (cfg->virtiofsdDebug) {
+        if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_OPTIONS))
+            virCommandAddArgList(cmd, "--log-level", "debug", NULL);
+        else
+            virCommandAddArg(cmd, "-d");
+    }
 
     for (i = 0; i < fs->idmap.nuidmap; i++) {
         virCommandAddArgFormat(cmd, "--uid-map=:%u:%u:%u:",
-- 
2.45.2




[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