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, "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 size: 4194304 67 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 68 min block: 1 69 opt block: 4096 70 max block: 33554432 71 available meta contexts: 2 72 base:allocation 73 qemu:dirty-bitmap:b2 74 75=== Contrast normal status to large granularity dirty-bitmap === 76 77read 512/512 bytes at offset 512 78512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 79read 524288/524288 bytes at offset 524288 80512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 81read 1048576/1048576 bytes at offset 1048576 821 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 83read 2097152/2097152 bytes at offset 2097152 842 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 85[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 86{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 87{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 88[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 89{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 90{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 91 92=== Contrast to small granularity dirty-bitmap === 93 94[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 95{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 96{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 97{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 98 99=== End qemu NBD server === 100 101{"execute":"nbd-server-remove", "arguments":{"name":"n"}} 102{"return": {}} 103{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 104{"return": {}} 105{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 106{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 107{"execute":"nbd-server-stop"} 108{"return": {}} 109{"execute":"nbd-server-stop"} 110{"error": {"class": "GenericError", "desc": "NBD server not running"}} 111 112=== Set up NBD with iothread access === 113 114{"execute":"x-blockdev-set-iothread", "arguments":{"node-name":"n", "iothread":"io0"}} 115{"return": {}} 116{"execute":"nbd-server-add", "arguments":{"device":"n"}} 117{"error": {"class": "GenericError", "desc": "NBD server not running"}} 118{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd"}}}} 119{"return": {}} 120{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd1"}}}} 121{"error": {"class": "GenericError", "desc": "NBD server already running"}} 122exports available: 0 123{"execute":"nbd-server-add", "arguments":{"device":"n", "bitmap":"b"}} 124{"return": {}} 125{"execute":"nbd-server-add", "arguments":{"device":"nosuch"}} 126{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}} 127{"execute":"nbd-server-add", "arguments":{"device":"n"}} 128{"error": {"class": "GenericError", "desc": "NBD server already has export named 'n'"}} 129{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}} 130{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 131{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}} 132{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 133{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "bitmap":"b2"}} 134{"return": {}} 135exports available: 2 136 export: 'n' 137 size: 4194304 138 flags: 0x58f ( readonly flush fua df multi cache ) 139 min block: 1 140 opt block: 4096 141 max block: 33554432 142 available meta contexts: 2 143 base:allocation 144 qemu:dirty-bitmap:b 145 export: 'n2' 146 size: 4194304 147 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 148 min block: 1 149 opt block: 4096 150 max block: 33554432 151 available meta contexts: 2 152 base:allocation 153 qemu:dirty-bitmap:b2 154 155=== Contrast normal status to large granularity dirty-bitmap === 156 157read 512/512 bytes at offset 512 158512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 159read 524288/524288 bytes at offset 524288 160512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 161read 1048576/1048576 bytes at offset 1048576 1621 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 163read 2097152/2097152 bytes at offset 2097152 1642 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 165[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 166{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 167{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 168[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 169{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 170{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 171 172=== Contrast to small granularity dirty-bitmap === 173 174[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 175{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 176{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 177{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 178 179=== End qemu NBD server === 180 181{"execute":"nbd-server-remove", "arguments":{"name":"n"}} 182{"return": {}} 183{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 184{"return": {}} 185{"execute":"nbd-server-remove", "arguments":{"name":"n2"}} 186{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 187{"execute":"nbd-server-stop"} 188{"return": {}} 189{"execute":"nbd-server-stop"} 190{"error": {"class": "GenericError", "desc": "NBD server not running"}} 191{"execute":"quit"} 192{"return": {}} 193{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 194 195=== Use qemu-nbd as server === 196 197[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 198{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 199{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 200[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 201{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 202{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 203{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 204*** done 205