 0da9856851
			
		
	
	
		0da9856851
		
	
	
	
	
		
			
			When querying image extents for raw image, qemu-nbd reports holes as
zero:
$ qemu-nbd -t -r -f raw empty-6g.raw
$ qemu-img map --output json nbd://localhost
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": true, "offset": 0}]
$ qemu-img map --output json empty-6g.raw
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": false, "offset": 0}]
Turns out that qemu-img map reports a hole based on BDRV_BLOCK_DATA, but
nbd server reports a hole based on BDRV_BLOCK_ALLOCATED.
The NBD protocol says:
    NBD_STATE_HOLE (bit 0): if set, the block represents a hole (and
    future writes to that area may cause fragmentation or encounter an
    NBD_ENOSPC error); if clear, the block is allocated or the server
    could not otherwise determine its status.
qemu-img manual says:
    whether the sectors contain actual data or not (boolean field data;
    if false, the sectors are either unallocated or stored as
    optimized all-zero clusters);
To me, data=false looks compatible with NBD_STATE_HOLE. From user point
of view, getting same results from qemu-nbd and qemu-img is more
important than being more correct about allocation status.
Changing nbd server to report holes using BDRV_BLOCK_DATA makes qemu-nbd
results compatible with qemu-img map:
$ qemu-img map --output json nbd://localhost
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": false, "offset": 0}]
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
Message-Id: <20210219160752.1826830-1-nsoffer@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
		
	
			
		
			
				
	
	
		
			29 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| QA output created by 241
 | |
| 
 | |
| === Exporting unaligned raw image, natural alignment ===
 | |
| 
 | |
|   size:  1024
 | |
|   min block: 1
 | |
| [{ "start": 0, "length": 1000, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
 | |
| { "start": 1000, "length": 24, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
 | |
| 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)
 | |
| 
 | |
| === Exporting unaligned raw image, forced server sector alignment ===
 | |
| 
 | |
|   size:  1024
 | |
|   min block: 512
 | |
| [{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
 | |
| 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)
 | |
| WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
 | |
|          Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
 | |
|          Specify the 'raw' format explicitly to remove the restrictions.
 | |
| 
 | |
| === Exporting unaligned raw image, forced client sector alignment ===
 | |
| 
 | |
|   size:  1024
 | |
|   min block: 1
 | |
| [{ "start": 0, "length": 1000, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
 | |
| { "start": 1000, "length": 24, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
 | |
| 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)
 | |
| *** done
 |