On 12/07/2016 10:16 AM, Kevin Wolf wrote: > Am 02.12.2016 um 20:22 hat Eric Blake geschrieben: >> Use blkdebug's new geometry constraints to emulate setups that >> have caused recent regression fixes: write zeroes asserting >> when running through a loopback block device with max-transfer >> smaller than cluster size, and discard rounding away portions >> of requests not aligned to preferred boundaries. Also, add >> coverage that the block layer is honoring max transfer limits. >> >> For now, a single iotest performs all actions, with the idea >> that we can add future blkdebug constraint test cases in the >> same file; but it can be split into multiple iotests if we find >> reason to run one portion of the test in more setups than what >> are possible in the other. >>
>> + >> +_supported_fmt qcow2 >> +_supported_proto file >> + >> +CLUSTER_SIZE=1M >> +size=128M >> +options=driver=blkdebug,image.driver=qcow2 >> + >> +echo >> +echo "== setting up files ==" >> + >> +_make_test_img $size >> +$QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG" | _filter_qemu_io >> +mv "$TEST_IMG" "$TEST_IMG.base" > > I know that you declared "_supported_proto file", but if you don't use > mv after creating the image, it might actually work with other > protocols. > > Most other tests use something like this: > > TEST_IMG="$TEST_IMG.base" _make_test_img $size > > And for the qemu-io invocation you can just use the right filename. Thanks. I obviously copied-and-pasted from an earlier test, rather than a later one, so I'll make the tweaks in v4. >> +# non-power-of-2 write-zero/discard alignments >> +echo >> +echo "== non-power-of-2 write zeroes ==" > > "non-power-of-2 write zeroes _limits_". The request offset/size is a > power of two. Indeed. > >> +limits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M >> +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ >> + -c "write -z 32M 32M" | _filter_qemu_io >> + >> +echo >> +echo "== non-power-of-2 discard ==" > > Here limits, too. > >> +limits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M >> +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ >> + -c "discard 80000001 30M" | _filter_qemu_io >> + >> +echo >> +echo "== verify image content ==" >> + >> +function verify_io() >> +{ >> + if ($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | >> + grep "compat: 0.10" > /dev/null); then >> + # For v2 images, discarded clusters are read from the backing file >> + discarded=11 >> + else >> + # Discarded clusters are zeroed for v3 or later >> + discarded=0 >> + fi >> + >> + echo read -P 22 0 1000 >> + echo read -P 33 1000 128k >> + echo read -P 22 132072 7871512 >> + echo read -P 0 8003584 2093056 >> + echo read -P 22 10096640 23457792 >> + echo read -P 0 32M 32M >> + echo read -P 22 64M 13M >> + echo read -P $discarded 77M 29M > > Hm, why is this exactly 77M? > > The original request starts at 80000001, 77M is 80740352. We have a > discard limit of 15M, but that is only used for splitting the request > (and wouldn't match 77M anyway). We still pass the partial requests at > the head and the tail to the driver, and what it enforces is align, i.e. > 512. The next 512 byte boundary from 80000001 would be 80000512. > > I'm almost sure that the patch is correct and I'm just missing a piece, > but what is it? We are using a qcow2 image with 1M clusters. Discarding visible through qcow2 is therefore at 1M boundaries, regardless of whether we can discard at finer granularity elsewhere. Stepping through the request, we have: qemu-io: discard 30M at 80000001, passed to blkdebug blkdebug: discard 511 bytes at 80000001, -ENOTSUP (smaller than blkdebug's 512 align) blkdebug: discard 14371328 bytes at 80000512, passed to qcow2 qcow2: discard 739840 bytes at 80000512, -ENOTSUP (smaller than qcow2's 1M align) qcow2: discard 13M bytes at 77M, succeeds blkdebug: discard 15M bytes at 90M, passed to qcow2 qcow2: discard 15M bytes at 90M, succeeds blkdebug: discard 1356800 bytes at 105M, passed to qcow2 qcow2: discard 1M at 105M, succeeds qcow2: discard 308224 bytes at 106M, -ENOTSUP (smaller than qcow2's 1M align) blkdebug: discard 1 byte at 111457280, -ENOTSUP (smaller than blkdebug's 512 align) -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature