1QA output created by 223 2 3=== Create partially sparse image, then add dirty bitmaps === 4 5Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304 6wrote 2097152/2097152 bytes at offset 1048576 72 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 8Testing: 9QMP_VERSION 10{"return": {}} 11{"return": {}} 12{"return": {}} 13{"return": {}} 14{"return": {}} 15{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 16 17 18=== Write part of the file under active bitmap === 19 20wrote 512/512 bytes at offset 512 21512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 22wrote 2097152/2097152 bytes at offset 2097152 232 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 24 25=== End dirty bitmaps, and start serving image over NBD === 26 27{"execute":"qmp_capabilities"} 28{"return": {}} 29{"execute":"blockdev-add", "arguments":{"driver":"IMGFMT", "node-name":"n", "file":{"driver":"file", "filename":"TEST_DIR/t.IMGFMT"}}} 30{"return": {}} 31{"execute":"block-dirty-bitmap-disable", "arguments":{"node":"n", "name":"b"}} 32{"return": {}} 33 34=== Set up NBD with normal access === 35 36{"execute":"nbd-server-add", "arguments":{"device":"n"}} 37{"error": {"class": "GenericError", "desc": "NBD server not running"}} 38{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd"}}}} 39{"return": {}} 40{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd1"}}}} 41{"error": {"class": "GenericError", "desc": "NBD server already running"}} 42exports available: 0 43{"execute":"nbd-server-add", "arguments":{"device":"n", "bitmap":"b"}} 44{"return": {}} 45{"execute":"nbd-server-add", "arguments":{"device":"nosuch"}} 46{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}} 47{"execute":"nbd-server-add", "arguments":{"device":"n"}} 48{"error": {"class": "GenericError", "desc": "NBD server already has export named 'n'"}} 49{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}} 50{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 51{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}} 52{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 53{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}} 54{"return": {}} 55exports available: 2 56 export: 'n' 57 size: 4194304 58 flags: 0x58f ( readonly flush fua df multi cache ) 59 min block: 1 60 opt block: 4096 61 max block: 33554432 62 available meta contexts: 2 63 base:allocation 64 qemu:dirty-bitmap:b 65 export: 'n2' 66 description: some text 67 size: 4194304 68 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 69 min block: 1 70 opt block: 4096 71 max block: 33554432 72 available meta contexts: 2 73 base:allocation 74 qemu:dirty-bitmap:b2 75 76=== Contrast normal status to large granularity dirty-bitmap === 77 78read 512/512 bytes at offset 512 79512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 80read 524288/524288 bytes at offset 524288 81512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 82read 1048576/1048576 bytes at offset 1048576 831 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 84read 2097152/2097152 bytes at offset 2097152 852 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 86[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 87{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 88{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 89[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 90{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 91{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 92 93=== Contrast to small granularity dirty-bitmap === 94 95[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 96{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 97{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 98{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 99 100=== End qemu NBD server === 101 102{"execute":"nbd-server-remove", "arguments":{"name":"n"}} 103{"return": {}} 104{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 105{"return": {}} 106{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 107{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 108{"execute":"nbd-server-stop"} 109{"return": {}} 110{"execute":"nbd-server-stop"} 111{"error": {"class": "GenericError", "desc": "NBD server not running"}} 112 113=== Set up NBD with iothread access === 114 115{"execute":"x-blockdev-set-iothread", "arguments":{"node-name":"n", "iothread":"io0"}} 116{"return": {}} 117{"execute":"nbd-server-add", "arguments":{"device":"n"}} 118{"error": {"class": "GenericError", "desc": "NBD server not running"}} 119{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd"}}}} 120{"return": {}} 121{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd1"}}}} 122{"error": {"class": "GenericError", "desc": "NBD server already running"}} 123exports available: 0 124{"execute":"nbd-server-add", "arguments":{"device":"n", "bitmap":"b"}} 125{"return": {}} 126{"execute":"nbd-server-add", "arguments":{"device":"nosuch"}} 127{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}} 128{"execute":"nbd-server-add", "arguments":{"device":"n"}} 129{"error": {"class": "GenericError", "desc": "NBD server already has export named 'n'"}} 130{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}} 131{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 132{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}} 133{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 134{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}} 135{"return": {}} 136exports available: 2 137 export: 'n' 138 size: 4194304 139 flags: 0x58f ( readonly flush fua df multi cache ) 140 min block: 1 141 opt block: 4096 142 max block: 33554432 143 available meta contexts: 2 144 base:allocation 145 qemu:dirty-bitmap:b 146 export: 'n2' 147 description: some text 148 size: 4194304 149 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 150 min block: 1 151 opt block: 4096 152 max block: 33554432 153 available meta contexts: 2 154 base:allocation 155 qemu:dirty-bitmap:b2 156 157=== Contrast normal status to large granularity dirty-bitmap === 158 159read 512/512 bytes at offset 512 160512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 161read 524288/524288 bytes at offset 524288 162512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 163read 1048576/1048576 bytes at offset 1048576 1641 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 165read 2097152/2097152 bytes at offset 2097152 1662 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 167[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 168{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 169{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 170[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 171{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 172{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 173 174=== Contrast to small granularity dirty-bitmap === 175 176[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 177{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 178{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 179{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 180 181=== End qemu NBD server === 182 183{"execute":"nbd-server-remove", "arguments":{"name":"n"}} 184{"return": {}} 185{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 186{"return": {}} 187{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 188{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 189{"execute":"nbd-server-stop"} 190{"return": {}} 191{"execute":"nbd-server-stop"} 192{"error": {"class": "GenericError", "desc": "NBD server not running"}} 193{"execute":"quit"} 194{"return": {}} 195{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 196 197=== Use qemu-nbd as server === 198 199[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 200{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 201{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 202[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 203{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 204{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 205{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 206*** done 207