On Tue, Apr 10, 2018 at 09:52:40AM -0500, Eric Blake wrote:
> Didn't Rich already try to do that?
> 
> +def emulate_zero(h, count, offset):
> +    # qemu-img convert starts by trying to zero/trim the whole device.
> +    # Since we've just created a new disk it's safe to ignore these
> +    # requests as long as they are smaller than the highest write seen.
> +    # After that we must emulate them with writes.
> +    if offset+count < h['highestwrite']:
> 
> Or is the problem that emulate_zero() is only being called if:
> 
> +    # Unlike the trim and flush calls, there is no 'can_zero' method
> +    # so nbdkit could call this even if the server doesn't support
> +    # zeroing.  If this is the case we must emulate.
> +    if not h['can_zero']:
> +        emulate_zero(h, count, offset)
> +        return
> 
> rather than doing the 'highestwrite' check unconditionally even when
> oVirt supports zero requests?

Exactly.

I'm not sure it's always safe to call emulate_zero, as I'm not sure
that we always know that the remote oVirt device starts off empty.

Well in one case it's definitely not true: when we created the disk
with disk_format = types.DiskFormat.COW (qcow2).  However I have
currently disabled conversion to qcow2 in this plugin for other
reasons.  (And I think that imageio shouldn't in any case be exposing
the qcow2 format like this -- the APIs are operating at the wrong
level.  The format should be hidden by the imageio APIs and it should
expose only read/write operations on a logically raw device.)

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html

Reply via email to