The virStreamSourceFunc internal_sendall currently returns the first value passed in from the block, which according the ruby-libvirt docs should be zero: The send block should return an array of 2 elements; the first element should be the return code from the block (-1 for error, 0 otherwise) But according to the libvirt docs of virStreamSourceFunc this indicates EOF: Returns: the number of bytes filled, 0 upon end of file, or -1 upon error So return the size of the buffer to unbreak volume uploads. --- ext/libvirt/stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/libvirt/stream.c b/ext/libvirt/stream.c index 1353dc9..c171535 100644 --- a/ext/libvirt/stream.c +++ b/ext/libvirt/stream.c @@ -131,7 +131,7 @@ static int internal_sendall(virStreamPtr RUBY_LIBVIRT_UNUSED(st), char *data, memcpy(data, RSTRING_PTR(buffer), RSTRING_LEN(buffer)); - return NUM2INT(retcode); + return RSTRING_LEN(buffer); } /* -- 2.8.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list