[PATCH 3/3] remote_driver: Implement virStreamInData() callback

Michal Privoznik mprivozn at redhat.com
Tue Dec 7 15:34:42 UTC 2021


When using the monolithic daemon the driver for virStream is
always virFDStreamDrv and thus calling virStreamInData() results
in calling virFDStreamInData().

But things are different with split daemon, especially when a
client connects to one of hypervisor daemons (e.g. virtqemud) and
then lets the daemon connect to the storage daemon for
vol-upload/vol-download. Here, the hypervisor daemon acts like
both client and server. This is reflected by stream->driver
pointing to remoteStreamDrv, which doesn't have streamInData
callback implemented and thus vol-upload/vol-download with sparse
flag fails.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2026537
Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/remote/remote_driver.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 235c406a5a..5b179a927d 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -5599,6 +5599,31 @@ remoteStreamRecvHole(virStreamPtr st,
 }
 
 
+static int
+remoteStreamInData(virStreamPtr st,
+                   int *data,
+                   long long *length)
+{
+    struct private_data *priv = st->conn->privateData;
+    virNetClientStream *privst = st->privateData;
+    int rv;
+
+    VIR_DEBUG("st=%p data=%p length=%p",
+              st, data, length);
+
+    remoteDriverLock(priv);
+    priv->localUses++;
+    remoteDriverUnlock(priv);
+
+    rv = virNetClientStreamInData(privst, data, length);
+
+    remoteDriverLock(priv);
+    priv->localUses--;
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
+
 struct remoteStreamCallbackData {
     virStreamPtr st;
     virStreamEventCallback cb;
@@ -5745,6 +5770,7 @@ static virStreamDriver remoteStreamDrv = {
     .streamSend = remoteStreamSend,
     .streamSendHole = remoteStreamSendHole,
     .streamRecvHole = remoteStreamRecvHole,
+    .streamInData = remoteStreamInData,
     .streamFinish = remoteStreamFinish,
     .streamAbort = remoteStreamAbort,
     .streamEventAddCallback = remoteStreamEventAddCallback,
-- 
2.32.0




More information about the libvir-list mailing list