From: Peter Krempa <pkrempa(a)redhat.com>
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 preparse 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(a)redhat.com>
---
src/conf/backup_conf.c | 2 +-
src/conf/domain_conf.c | 24 +++++++++++++++++--
src/conf/domain_conf.h | 3 ++-
src/conf/storage_source_conf.c | 2 ++
src/conf/storage_source_conf.h | 3 +++
src/qemu/qemu_backup.c | 1 +
src/qemu/qemu_block.c | 1 +
src/qemu/qemu_monitor_json.c | 1 +
.../storage_file_backend_gluster.c | 1 +
9 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c
index 1fea6a2be7..1bdfbfa3d6 100644
--- a/src/conf/backup_conf.c
+++ b/src/conf/backup_conf.c
@@ -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) {
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1680da3ea6..c724638180 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -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;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 0d1dd954ae..8dfadbb98d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -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);
diff --git a/src/conf/storage_source_conf.c b/src/conf/storage_source_conf.c
index ca956a1b7c..db12dfd961 100644
--- a/src/conf/storage_source_conf.c
+++ b/src/conf/storage_source_conf.c
@@ -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);
}
diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h
index e6cbb93c06..52ed303657 100644
--- a/src/conf/storage_source_conf.h
+++ b/src/conf/storage_source_conf.h
@@ -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;
};
diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
index 43576d135b..2935153cdf 100644
--- a/src/qemu/qemu_backup.c
+++ b/src/qemu/qemu_backup.c
@@ -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>"));
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index e370411e16..3ed279af28 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -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"),
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index d0de48fb18..994cf53d9f 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -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"));
diff --git a/src/storage_file/storage_file_backend_gluster.c
b/src/storage_file/storage_file_backend_gluster.c
index 950f8e81fe..df4df0f128 100644
--- a/src/storage_file/storage_file_backend_gluster.c
+++ b/src/storage_file/storage_file_backend_gluster.c
@@ -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;
}
--
2.49.0