From: Michal Privoznik Date: Mon, 6 Dec 2021 16:16:09 +0000 (+0100) Subject: remote_driver: Implement virStreamInData() callback X-Git-Tag: v8.0.0-rc1~247 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1b06f5cf04db672e4754c8f57a636dc4ab562c5;p=thirdparty%2Flibvirt.git remote_driver: Implement virStreamInData() callback 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 Reviewed-by: Martin Kletzander --- 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,