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