On Thu, Jun 10, 2021 at 9:35 PM Eric Blake <ebl...@redhat.com> wrote: > > On Tue, Jun 08, 2021 at 07:38:10PM +0300, Nir Soffer wrote: > > The example I provided was not detailed enough, what we actually do is: > > > > qemu-nbd .. 'json:{"driver": "qcow2", "backing": null, "file": > > {"driver": "file", "filename": "top.qcow2"}}' > > > > So there is no backing chain and allocation depth is not relevant. > > - Allocated areas should be reported with flags 0 > > - Zero areas which are not holes should be reported as NBD_STATE_ZERO > > - Zero areas which are holes (not allocated in this image) should be > > reported as NBD_STATE_HOLE > > Thinking about this a bit more, here's something I noticed: > > $ qemu-img map --output=json -f raw base.raw > [{ "start": 0, "length": 196608, "depth": 0, "zero": false, "data": true, > "offset": 0}, > { "start": 196608, "length": 65536, "depth": 0, "zero": true, "data": false, > "offset": 196608}] > > which matches what I've said elsewhere in this thread: the entire > image is reported as "depth":0 because the raw file is responsible for > 100% of the content. > > But: > > $ qemu-img map --output=json -f qcow2 json:'{"driver":"qcow2","backing":null, > \ > "file":{"driver":"file","filename":"top.qcow2"}}' > [{ "start": 0, "length": 65536, "depth": 0, "zero": true, "data": false}, > { "start": 65536, "length": 65536, "depth": 0, "zero": false, "data": true, > "offset": 327680}, > { "start": 131072, "length": 131072, "depth": 0, "zero": true, "data": false}] > > also reports the entire file at "depth":0, which is misleading, since > we have just been arguing from the qemu:allocation-depth perspective > (and also from bdrv_block_status) that the qcow2 image is NOT 100% > allocated (in the sense where allocation == data comes locally). > Perhaps it might be better if we tweaked the above qemu-img map to > produce: > > [{ "start": 0, "length": 65536, "depth": -1, "zero": true, "data": false}, > { "start": 65536, "length": 65536, "depth": 0, "zero": false, "data": true, > "offset": 327680}, > { "start": 131072, "length": 65536, "depth": 0, "zero": true, "data": false}, > { "start": 196608, "length": 65536, "depth": -1, "zero": true, "data": false}]
It will be more consistent with "offset" to drop "depth" from output if we don't have it: [{ "start": 0, "length": 65536, "zero": true, "data": false}, { "start": 65536, "length": 65536, "depth": 0, "zero": false, "data": true, "offset": 327680}, { "start": 131072, "length": 65536, "depth": 0, "zero": true, "data": false}, { "start": 196608, "length": 65536, "zero": true, "data": false}]