]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Introduce VIR_STORAGE_NET_HOST_TRANS_FD
authorPeter Krempa <pkrempa@redhat.com>
Tue, 25 Mar 2025 16:17:11 +0000 (17:17 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 1 Apr 2025 14:18:29 +0000 (16:18 +0200)
Prepare the parser code and anything using 'virStorageNetHostTransport'
to support passing a FD instead of opening the connection by qemu
itself.

For now this just prepares the parser and data structures, but the code
is dormant.

Only code paths which will actually support FD passing will then enable
it in the future.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Spellchecked-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/backup_conf.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/storage_source_conf.c
src/conf/storage_source_conf.h
src/qemu/qemu_backup.c
src/qemu/qemu_block.c
src/qemu/qemu_monitor_json.c
src/storage_file/storage_file_backend_gluster.c

index 1fea6a2be7359ce43d65cb7d03366364703e7fef..1bdfbfa3d6731e3b9d3b70db8abb77806466aa94 100644 (file)
@@ -228,7 +228,7 @@ virDomainBackupDefParseXML(xmlXPathContextPtr ctxt,
 
         def->server = g_new0(virStorageNetHostDef, 1);
 
-        if (virDomainStorageNetworkParseHost(node, def->server) < 0)
+        if (virDomainStorageNetworkParseHost(node, def->server, false) < 0)
             return NULL;
 
         if (def->server->transport == VIR_STORAGE_NET_HOST_TRANS_RDMA) {
index 1680da3ea68bc3f3e980774acc677ec2be8d18ff..c72463818095845ad0ee016e04b268da84e1feff 100644 (file)
@@ -6014,7 +6014,8 @@ virDomainHostdevSubsysPCIDefParseXML(xmlNodePtr node,
 
 int
 virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
-                                 virStorageNetHostDef *host)
+                                 virStorageNetHostDef *host,
+                                 bool allow_fd)
 {
     g_autofree char *socket = NULL;
 
@@ -6064,6 +6065,25 @@ virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
     }
         break;
 
+    case VIR_STORAGE_NET_HOST_TRANS_FD:
+        if (!allow_fd) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("transport 'fd' is now allowed"));
+            return -1;
+        }
+
+        if (socket) {
+            virReportError(VIR_ERR_XML_ERROR,
+                           _("transport '%1$s' does not support socket attribute"),
+                           virStorageNetHostTransportTypeToString(host->transport));
+            return -1;
+        }
+
+        if (!(host->fdgroup = virXMLPropStringRequired(hostnode, "fdgroup")))
+            return -1;
+
+        break;
+
     case VIR_STORAGE_NET_HOST_TRANS_LAST:
         break;
     }
@@ -6092,7 +6112,7 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node,
     *nhosts = nhostnodes;
 
     for (i = 0; i < nhostnodes; i++) {
-        if (virDomainStorageNetworkParseHost(hostnodes[i], *hosts + i) < 0)
+        if (virDomainStorageNetworkParseHost(hostnodes[i], *hosts + i, false) < 0)
             return -1;
     }
 
index 0d1dd954aee4bada0d7a965f3a00d4ab13f1de12..8dfadbb98df6b73ebeb966ea00d21eaba167de42 100644 (file)
@@ -4024,7 +4024,8 @@ virDomainDiskByTarget(virDomainDef *def,
 
 void virDomainDiskInsert(virDomainDef *def, virDomainDiskDef *disk);
 int virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
-                                     virStorageNetHostDef *host);
+                                     virStorageNetHostDef *host,
+                                     bool allow_fd);
 int virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt,
                                   virDomainDiskDef *def,
                                   const virDomainDef *vmdef);
index ca956a1b7ccd9cd145d6b03768d65ff5e0f814ff..db12dfd961d9620c4decad906eb4d4dce0ac9659 100644 (file)
@@ -97,6 +97,7 @@ VIR_ENUM_IMPL(virStorageNetHostTransport,
               "tcp",
               "unix",
               "rdma",
+              "fd",
 );
 
 
@@ -149,6 +150,7 @@ virStorageNetHostDefClear(virStorageNetHostDef *def)
 
     VIR_FREE(def->name);
     VIR_FREE(def->socket);
+    VIR_FREE(def->fdgroup);
 }
 
 
index e6cbb93c065bec88dde22ba426cca13c14267a81..52ed30365785adbede27addf6bd3a8d9037c9dcb 100644 (file)
@@ -141,6 +141,7 @@ typedef enum {
     VIR_STORAGE_NET_HOST_TRANS_TCP,
     VIR_STORAGE_NET_HOST_TRANS_UNIX,
     VIR_STORAGE_NET_HOST_TRANS_RDMA,
+    VIR_STORAGE_NET_HOST_TRANS_FD,
 
     VIR_STORAGE_NET_HOST_TRANS_LAST
 } virStorageNetHostTransport;
@@ -154,6 +155,8 @@ struct _virStorageNetHostDef {
     unsigned int port;
     virStorageNetHostTransport transport;
     char *socket;  /* path to unix socket */
+
+    char *fdgroup;
 };
 
 
index 43576d135b080163d5a5764c1539d309bc0044a0..2935153cdffc202bb469a93997bfe4fd33763596 100644 (file)
@@ -87,6 +87,7 @@ qemuBackupPrepare(virDomainBackupDef *def)
             break;
 
         case VIR_STORAGE_NET_HOST_TRANS_RDMA:
+        case VIR_STORAGE_NET_HOST_TRANS_FD:
         case VIR_STORAGE_NET_HOST_TRANS_LAST:
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("unexpected transport in <domainbackup>"));
index e370411e1645dcf16df43ca26955ecb37957f537..3ed279af28bb3cae5f749f6b431d7b71ac528863 100644 (file)
@@ -266,6 +266,7 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDef *host)
         break;
 
     case VIR_STORAGE_NET_HOST_TRANS_RDMA:
+    case VIR_STORAGE_NET_HOST_TRANS_FD:
     case VIR_STORAGE_NET_HOST_TRANS_LAST:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("transport protocol '%1$s' is not yet supported"),
index d0de48fb18aa6bd237ac3e177a4bc24e70ef20cd..994cf53d9f066fbe57a8b062880c8d0861de78d8 100644 (file)
@@ -6342,6 +6342,7 @@ qemuMonitorJSONNBDServerStart(qemuMonitor *mon,
         addr = qemuMonitorJSONBuildUnixSocketAddress(server->socket);
         break;
     case VIR_STORAGE_NET_HOST_TRANS_RDMA:
+    case VIR_STORAGE_NET_HOST_TRANS_FD:
     case VIR_STORAGE_NET_HOST_TRANS_LAST:
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("invalid server address"));
index 950f8e81fe8359ae2a143e12b92a8f861f5c5689..df4df0f128a57ec076ca1bb5839dbac2948b4cc4 100644 (file)
@@ -74,6 +74,7 @@ virStorageFileBackendGlusterInitServer(virStorageFileBackendGlusterPriv *priv,
         hoststr = host->socket;
         break;
 
+    case VIR_STORAGE_NET_HOST_TRANS_FD:
     case VIR_STORAGE_NET_HOST_TRANS_LAST:
         break;
     }