All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Alberto Garcia <berto@igalia.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Derek Su <dereksu@qnap.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: Re: [PATCH v7 32/32] iotests: Add tests for qcow2 images with extended L2 entries
Date: Wed, 27 May 2020 13:30:06 -0500	[thread overview]
Message-ID: <c2bb44f3-bb7e-7bb0-dbbf-ef1d3273802d@redhat.com> (raw)
In-Reply-To: <117ba99f5a1fbea62cfed60fe74a460cc628948f.1590429902.git.berto@igalia.com>

On 5/25/20 1:08 PM, Alberto Garcia wrote:
> Signed-off-by: Alberto Garcia <berto@igalia.com>
> ---
>   tests/qemu-iotests/271     | 705 +++++++++++++++++++++++++++++++++++++
>   tests/qemu-iotests/271.out | 603 +++++++++++++++++++++++++++++++
>   tests/qemu-iotests/group   |   1 +
>   3 files changed, 1309 insertions(+)
>   create mode 100755 tests/qemu-iotests/271
>   create mode 100644 tests/qemu-iotests/271.out
> 

> +_cleanup()
> +{
> +	_cleanup_test_img
> +        rm -f "$TEST_IMG.raw"

TAB damage.


> +
> +l2_offset=262144 # 0x40000

If desired, you could write:

l2_offset=$((0x40000))

if that is more legible.

> +
> +_verify_img()
> +{
> +    $QEMU_IMG compare "$TEST_IMG" "$TEST_IMG.raw" | grep -v 'Images are identical'
> +    $QEMU_IMG check "$TEST_IMG" | _filter_qemu_img_check | \
> +        grep -v 'No errors were found on the image'
> +}
> +
> +# Compare the bitmap of an extended L2 entry against an expected value
> +_verify_l2_bitmap()
> +{
> +    entry_no="$1"            # L2 entry number, starting from 0
> +    expected_alloc="$alloc"  # Space-separated list of allocated subcluster indexes
> +    expected_zero="$zero"    # Space-separated list of zero subcluster indexes
> +
> +    offset=$(($l2_offset + $entry_no * 16))
> +    entry=`peek_file_be "$TEST_IMG" $offset 8`

I find $() easier to read than ``.

> +    offset=$(($offset + 8))
> +    bitmap=`peek_file_be "$TEST_IMG" $offset 8`
> +
> +    expected_bitmap=0
> +    for bit in $expected_alloc; do
> +        expected_bitmap=$(($expected_bitmap | (1 << $bit)))
> +    done
> +    for bit in $expected_zero; do
> +        expected_bitmap=$(($expected_bitmap | (1 << (32 + $bit))))
> +    done
> +    expected_bitmap=`printf "%llu" $expected_bitmap`

Dead statement - expected_bitmap is already a 64-bit decimal number 
without reprinting it to itself.

> +
> +    printf "L2 entry #%d: 0x%016lx %016lx\n" "$entry_no" "$entry" "$bitmap"
> +    if [ "$bitmap" != "$expected_bitmap" ]; then
> +        printf "ERROR: expecting bitmap       0x%016lx\n" "$expected_bitmap"
> +    fi
> +}
> +
> +_test_write()
> +{
> +    cmd="$1"
> +    l2_entry_idx="$2"
> +    [ -n "$l2_entry_idx" ] || l2_entry_idx=0

Could shorten these two lines into the one-liner:

l2_entry_idx=${2:-0}

> +    raw_cmd=`echo $cmd | sed s/-c//` # Raw images don't support -c
> +    echo "$cmd"
> +    $QEMU_IO -c "$cmd" "$TEST_IMG" | _filter_qemu_io
> +    $QEMU_IO -c "$raw_cmd" -f raw "$TEST_IMG.raw" | _filter_qemu_io
> +    _verify_img
> +    _verify_l2_bitmap "$l2_entry_idx"
> +}
> +
> +_reset_img()
> +{
> +    size="$1"
> +    $QEMU_IMG create -f raw "$TEST_IMG.raw" "$size" | _filter_img_create
> +    if [ "$use_backing_file" = "yes" ]; then
> +        $QEMU_IMG create -f raw "$TEST_IMG.base" "$size" | _filter_img_create
> +        $QEMU_IO -c "write -q -P 0xFF 0 $size" -f raw "$TEST_IMG.base" | _filter_qemu_io
> +        $QEMU_IO -c "write -q -P 0xFF 0 $size" -f raw "$TEST_IMG.raw" | _filter_qemu_io
> +        _make_test_img -o extended_l2=on -b "$TEST_IMG.base" "$size"

Semantic conflict with my patches to deprecate omitting -F when creating 
images with -b.  If you don't add '-F $IMGFMT' here, then my series will 
have to do it.

> +    else
> +        _make_test_img -o extended_l2=on "$size"
> +    fi
> +}
> +
> +# Test that writing to an image with subclusters produces the expected
> +# results, in images with and without backing files
> +for use_backing_file in yes no; do
> +    echo
> +    echo "### Standard write tests (backing file: $use_backing_file) ###"
> +    echo
> +    _reset_img 1M
> +    ### Write subcluster #0 (beginning of subcluster) ###
> +    alloc="0"; zero=""
> +    _test_write 'write -q -P 1 0 1k'
> +
> +    ### Write subcluster #1 (middle of subcluster) ###
> +    alloc="0 1"; zero=""
> +    _test_write 'write -q -P 2 3k 512'
> +
> +    ### Write subcluster #2 (end of subcluster) ###
> +    alloc="0 1 2"; zero=""
> +    _test_write 'write -q -P 3 5k 1k'
> +
> +    ### Write subcluster #3 (full subcluster) ###
> +    alloc="0 1 2 3"; zero=""
> +    _test_write 'write -q -P 4 6k 2k'
> +
> +    ### Write subclusters #4-6 (full subclusters) ###
> +    alloc="`seq 0 6`"; zero=""

More places where `` could be changed to $()

> +    _test_write 'write -q -P 5 8k 6k'
> +
> +    ### Write subclusters #7-9 (partial subclusters) ###
> +    alloc="`seq 0 9`"; zero=""
> +    _test_write 'write -q -P 6 15k 4k'
> +
> +    ### Write subcluster #16 (partial subcluster) ###
> +    alloc="`seq 0 9` 16"; zero=""
> +    _test_write 'write -q -P 7 32k 1k'
> +
> +    ### Write subcluster #31-#33 (cluster overlap) ###
> +    alloc="`seq 0 9` 16 31"; zero=""
> +    _test_write 'write -q -P 8 63k 4k'
> +    alloc="0 1" ; zero=""
> +    _verify_l2_bitmap 1
> +
> +    ### Zero subcluster #1
> +    alloc="0 `seq 2 9` 16 31"; zero="1"
> +    _test_write 'write -q -z 2k 2k'
> +
> +    ### Zero cluster #0
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'write -q -z 0 64k'
> +
> +    ### Fill cluster #0 with data
> +    alloc="`seq 0 31`"; zero=""
> +    _test_write 'write -q -P 9 0 64k'
> +
> +    ### Zero and unmap half of cluster #0 (this won't unmap it)
> +    alloc="`seq 16 31`"; zero="`seq 0 15`"
> +    _test_write 'write -q -z -u 0 32k'
> +
> +    ### Zero and unmap cluster #0
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'write -q -z -u 0 64k'
> +
> +    ### Write subcluster #1 (middle of subcluster)
> +    alloc="1"; zero="0 `seq 2 31`"
> +    _test_write 'write -q -P 10 3k 512'
> +
> +    ### Fill cluster #0 with data
> +    alloc="`seq 0 31`"; zero=""
> +    _test_write 'write -q -P 11 0 64k'
> +
> +    ### Discard cluster #0
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'discard -q 0 64k'
> +
> +    ### Write compressed data to cluster #0
> +    alloc=""; zero=""
> +    _test_write 'write -q -c -P 12 0 64k'
> +
> +    ### Write subcluster #2 (middle of subcluster)
> +    alloc="`seq 0 31`"; zero=""
> +    _test_write 'write -q -P 13 3k 512'
> +done

Looks like a nice sequence to give a lot of coverage to the various cases.

> +
> +# calculate_l2_meta() checks if none of the clusters affected by a
> +# write operation need COW or changes to their L2 metadata and simply
> +# returns when they don't. This is a test for that optimization.
> +# Here clusters #0-#3 are overwritten but only #1 and #2 need changes.
> +echo
> +echo '### Overwriting several clusters without COW ###'
> +echo
> +use_backing_file="no" _reset_img 1M
> +# Write cluster #0, subclusters #12-#31
> +alloc="`seq 12 31`"; zero=""
> +_test_write 'write -q 24k 40k' 0
> +
> +# Write cluster #1, subcluster #13
> +alloc="13"; zero=""
> +_test_write 'write -q 90k 2k' 1
> +
> +# Zeroize cluster #2, subcluster #14
> +alloc="14"; zero=""
> +_test_write 'write -q 156k 2k' 2
> +alloc=""; zero="14"
> +_test_write 'write -q -z 156k 2k' 2
> +
> +# Write cluster #3, subclusters #15-#31
> +alloc="`seq 0 16`"; zero=""
> +_test_write 'write -q 192k 34k' 3
> +
> +# Write from cluster #0, subcluster #12 to cluster #3, subcluster #11
> +alloc="`seq 12 31`"; zero=""
> +_test_write 'write -q 24k 192k' 0
> +
> +alloc="`seq 0 31`"; zero=""
> +_verify_l2_bitmap 1
> +_verify_l2_bitmap 2
> +
> +alloc="`seq 0 16`"; zero=""
> +_verify_l2_bitmap 3
> +
> +# Test different patterns of writing zeroes
> +for use_backing_file in yes no; do
> +    echo
> +    echo "### Writing zeroes 1: unallocated clusters (backing file: $use_backing_file) ###"
> +    echo
> +    # Note that the image size is not a multiple of the cluster size
> +    _reset_img 2083k
> +
> +    # Cluster-aligned request from clusters #0 to #2
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'write -q -z 0 192k' 0
> +    _verify_l2_bitmap 1
> +    _verify_l2_bitmap 2
> +
> +    # Subcluster-aligned request from clusters #3 to #5
> +    alloc=""; zero="`seq 16 31`"
> +    _test_write 'write -q -z 224k 128k' 3
> +    alloc=""; zero="`seq 0 31`"
> +    _verify_l2_bitmap 4
> +    alloc=""; zero="`seq 0 15`"
> +    _verify_l2_bitmap 5
> +
> +    # Unaligned request from clusters #6 to #8
> +    if [ "$use_backing_file" = "yes" ]; then
> +        alloc="15"; zero="`seq 16 31`" # copy-on-write happening here
> +    else
> +        alloc=""; zero="`seq 15 31`"
> +    fi
> +    _test_write 'write -q -z 415k 128k' 6
> +    alloc=""; zero="`seq 0 31`"
> +    _verify_l2_bitmap 7
> +    if [ "$use_backing_file" = "yes" ]; then
> +        alloc="15"; zero="`seq 0 14`" # copy-on-write happening here
> +    else
> +        alloc=""; zero="`seq 0 15`"
> +    fi
> +    _verify_l2_bitmap 8
> +
> +    echo
> +    echo "### Writing zeroes 2: allocated clusters (backing file: $use_backing_file) ###"
> +    echo
> +    alloc="`seq 0 31`"; zero=""
> +    _test_write 'write -q -P 1 576k 576k' 9
> +    _verify_l2_bitmap 10
> +    _verify_l2_bitmap 11
> +    _verify_l2_bitmap 12
> +    _verify_l2_bitmap 13
> +    _verify_l2_bitmap 14
> +    _verify_l2_bitmap 15
> +    _verify_l2_bitmap 16
> +    _verify_l2_bitmap 17
> +
> +    # Cluster-aligned request from clusters #9 to #11
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'write -q -z 576k 192k' 9
> +    _verify_l2_bitmap 10
> +    _verify_l2_bitmap 11
> +
> +    # Subcluster-aligned request from clusters #12 to #14
> +    alloc="`seq 0 15`"; zero="`seq 16 31`"
> +    _test_write 'write -q -z 800k 128k' 12
> +    alloc=""; zero="`seq 0 31`"
> +    _verify_l2_bitmap 13
> +    alloc="`seq 16 31`"; zero="`seq 0 15`"
> +    _verify_l2_bitmap 14
> +
> +    # Unaligned request from clusters #15 to #17
> +    alloc="`seq 0 15`"; zero="`seq 16 31`"
> +    _test_write 'write -q -z 991k 128k' 15
> +    alloc=""; zero="`seq 0 31`"
> +    _verify_l2_bitmap 16
> +    alloc="`seq 15 31`"; zero="`seq 0 14`"
> +    _verify_l2_bitmap 17
> +
> +    echo
> +    echo "### Writing zeroes 3: compressed clusters (backing file: $use_backing_file) ###"
> +    echo
> +    alloc=""; zero=""
> +    for c in `seq 18 28`; do
> +        _test_write "write -q -c -P 2 $(($c*64))k 64k" $c
> +    done
> +
> +    # Cluster-aligned request from clusters #18 to #20
> +    alloc=""; zero="`seq 0 31`"
> +    _test_write 'write -q -z 1152k 192k' 18
> +    _verify_l2_bitmap 19
> +    _verify_l2_bitmap 20
> +
> +    # Subcluster-aligned request from clusters #21 to #23.
> +    # We cannot partially zero a compressed cluster so the code
> +    # returns -ENOTSUP, which means copy-on-write of the compressed
> +    # data and fill the rest with actual zeroes on disk.
> +    # TODO: cluster #22 should use the 'all zeroes' bits.
> +    alloc="`seq 0 31`"; zero=""
> +    _test_write 'write -q -z 1376k 128k' 21
> +    _verify_l2_bitmap 22
> +    _verify_l2_bitmap 23

Hmm - this matches the question in 28/32 about whether we are handling 
sub-cluster-aligned requests correctly.  Is it merely a case that we 
aren't telling the block layer our correct preferred alignment for zero 
requests?
[...]

> +    # Unaligned request from clusters #24 to #26
> +    # In this case QEMU internally sends a 1k request followed by a
> +    # subcluster-aligned 128k request. The first request decompresses
> +    # cluster #24, but that's not enough to perform efficiently the
> +    # second request because it partially writes to cluster #26 (which

s/perform efficiently the second request/perform the second request 
efficiently/

> +
> +# Test that corrupted L2 entries are detected in both read and write
> +# operations
> +for corruption_test_cmd in read write; do
> +    echo
> +    echo "### Corrupted L2 entries - $corruption_test_cmd test (allocated) ###"
> +    echo
> +    echo "# 'cluster is zero' bit set on the standard cluster descriptor"
> +    echo
> +    # We actually don't consider this a corrupted image.
> +    # The 'cluster is zero' bit is unused is unused in extended L2 entries

doubled 'is unused'

> +    # so QEMU ignores it.
> +    # TODO: maybe treat the image as corrupted and make qemu-img check fix it?
> +    _make_test_img -o extended_l2=on 1M
> +    $QEMU_IO -c 'write -q -P 0x11 0 2k' "$TEST_IMG"
> +    poke_file "$TEST_IMG" $(($l2_offset+7)) "\x01"
> +    alloc="0"; zero=""
> +    _verify_l2_bitmap 0
> +    $QEMU_IO -c "$corruption_test_cmd -q -P 0x11 0 1k" "$TEST_IMG"
> +    if [ "$corruption_test_cmd" = "write" ]; then
> +        alloc="0"; zero=""
> +    fi
> +    _verify_l2_bitmap 0
> +
> +    echo
> +    echo "# Both 'subcluster is zero' and 'subcluster is allocated' bits set"
> +    echo
> +    _make_test_img -o extended_l2=on 1M
> +    # Write from the middle of cluster #0 to the middle of cluster #2
> +    $QEMU_IO -c 'write -q 32k 128k' "$TEST_IMG"
> +    # Corrupt the L2 entry from cluster #1
> +    poke_file "$TEST_IMG" $(($l2_offset+24)) "\x00\x00\x00\x01"
> +    alloc="`seq 0 31`"; zero="0"
> +    _verify_l2_bitmap 1
> +    $QEMU_IO -c "$corruption_test_cmd 0 192k" "$TEST_IMG"
> +
> +    echo
> +    echo "### Corrupted L2 entries - $corruption_test_cmd test (unallocated) ###"
> +    echo
> +    echo "# 'cluster is zero' bit set on the standard cluster descriptor"
> +    echo
> +    # We actually don't consider this a corrupted image.
> +    # The 'cluster is zero' bit is unused is unused in extended L2 entries

and again

> +    # so QEMU ignores it.
> +    # TODO: maybe treat the image as corrupted and make qemu-img check fix it?
> +    _make_test_img -o extended_l2=on 1M
> +    # We want to modify the (empty) L2 entry from cluster #0,
> +    # but we write to #4 in order to initialize the L2 table first
> +    $QEMU_IO -c 'write -q 256k 1k' "$TEST_IMG"
> +    poke_file "$TEST_IMG" $(($l2_offset+7)) "\x01"
> +    alloc=""; zero=""
> +    _verify_l2_bitmap 0
> +    $QEMU_IO -c "$corruption_test_cmd -q 0 1k" "$TEST_IMG"
> +    if [ "$corruption_test_cmd" = "write" ]; then
> +        alloc="0"; zero=""
> +    fi
> +    _verify_l2_bitmap 0
> +
> +    echo
> +    echo "# 'subcluster is allocated' bit set"
> +    echo
> +    _make_test_img -o extended_l2=on 1M
> +    # We want to corrupt the (empty) L2 entry from cluster #0,
> +    # but we write to #4 in order to initialize the L2 table first
> +    $QEMU_IO -c 'write -q 256k 1k' "$TEST_IMG"
> +    poke_file "$TEST_IMG" $(($l2_offset+15)) "\x01"
> +    alloc="0"; zero=""
> +    _verify_l2_bitmap 0
> +    $QEMU_IO -c "$corruption_test_cmd 0 1k" "$TEST_IMG"
> +
> +    echo
> +    echo "# Both 'subcluster is zero' and 'subcluster is allocated' bits set"
> +    echo
> +    _make_test_img -o extended_l2=on 1M
> +    # We want to corrupt the (empty) L2 entry from cluster #1,
> +    # but we write to #4 in order to initialize the L2 table first
> +    $QEMU_IO -c 'write -q 256k 1k' "$TEST_IMG"
> +    # Corrupt the L2 entry from cluster #1
> +    poke_file "$TEST_IMG" $(($l2_offset+24)) "\x00\x00\x00\x01\x00\x00\x00\x01"

would statements like this be any easier with poke_file_be?

> +    alloc="0"; zero="0"
> +    _verify_l2_bitmap 1
> +    $QEMU_IO -c "$corruption_test_cmd 0 192k" "$TEST_IMG"
> +
> +    echo
> +    echo "### Compressed cluster with subcluster bitmap != 0 - $corruption_test_cmd test ###"
> +    echo
> +    # We actually don't consider this a corrupted image.
> +    # The bitmap in compressed clusters is unused so QEMU should just ignore it.
> +    _make_test_img -o extended_l2=on 1M
> +    $QEMU_IO -c 'write -q -P 11 -c 0 64k' "$TEST_IMG"
> +    # Change the L2 bitmap to allocate subcluster #31 and zeroize subcluster #0
> +    poke_file "$TEST_IMG" $(($l2_offset+11)) "\x01\x80"
> +    alloc="31"; zero="0"
> +    _verify_l2_bitmap 0
> +    $QEMU_IO -c "$corruption_test_cmd -P 11 0 64k" "$TEST_IMG" | _filter_qemu_io
> +    # Writing allocates a new uncompressed cluster so we get a new bitmap
> +    if [ "$corruption_test_cmd" = "write" ]; then
> +        alloc="`seq 0 31`"; zero=""
> +    fi
> +    _verify_l2_bitmap 0
> +done
> +
> +echo
> +echo "### Image creation options ###"
> +echo
> +echo "# cluster_size < 16k"
> +_make_test_img -o extended_l2=on,cluster_size=8k 1M
> +
> +# TODO: allow preallocation with backing files when subclusters are used
> +echo "# backing file and preallocation=metadata"
> +_make_test_img -o extended_l2=on,preallocation=metadata -b "$TEST_IMG.base" 1M
> +
> +echo "# backing file and preallocation=falloc"
> +_make_test_img -o extended_l2=on,preallocation=falloc -b "$TEST_IMG.base" 1M
> +
> +echo "# backing file and preallocation=full"
> +_make_test_img -o extended_l2=on,preallocation=full -b "$TEST_IMG.base" 1M
> +
> +echo
> +echo "### qemu-img measure ###"
> +echo
> +echo "# 512MB, extended_l2=off" # This needs one L2 table
> +$QEMU_IMG measure --size 512M -O qcow2 -o extended_l2=off
> +echo "# 512MB, extended_l2=on"  # This needs two L2 tables
> +$QEMU_IMG measure --size 512M -O qcow2 -o extended_l2=on
> +
> +echo "# 16K clusters, 64GB, extended_l2=off" # This needs one full L1 table cluster
> +$QEMU_IMG measure --size 64G -O qcow2 -o cluster_size=16k,extended_l2=off
> +echo "# 16K clusters, 64GB, extended_l2=on"  # This needs two full L2 table clusters
> +$QEMU_IMG measure --size 64G -O qcow2 -o cluster_size=16k,extended_l2=on
> +
> +echo "# 8k clusters" # This should fail
> +$QEMU_IMG measure --size 1M -O qcow2 -o cluster_size=8k,extended_l2=on
> +
> +echo "# 1024 TB" # Maximum allowed size with extended_l2=on and 64K clusters
> +$QEMU_IMG measure --size 1024T -O qcow2 -o extended_l2=on
> +echo "# 1025 TB" # This should fail
> +$QEMU_IMG measure --size 1025T -O qcow2 -o extended_l2=on
> +
> +echo
> +echo "### qemu-img amend ###"
> +echo
> +_make_test_img -o extended_l2=on 1M
> +$QEMU_IMG amend -o extended_l2=off "$TEST_IMG"
> +
> +_make_test_img -o extended_l2=off 1M
> +$QEMU_IMG amend -o extended_l2=on "$TEST_IMG"

When we know we currently fail, should we write:

$QEMU_IMG ... && echo "unexpected pass"

to track exit status in addition to output comparison?

> +
> +echo
> +echo "### Test copy-on-write on an image with snapshots ###"
> +echo
> +_make_test_img -o extended_l2=on 1M
> +
> +# For each cluster from #0 to #9 this loop zeroes subcluster #7
> +# and allocates subclusters #13 and #18.
> +alloc="13 18"; zero="7"
> +for c in `seq 0 9`; do
> +    $QEMU_IO -c "write -q -z $((64*$c+14))k 2k" \
> +             -c "write -q -P $((0xd0+$c)) $((64*$c+26))k 2k" \
> +             -c "write -q -P $((0xe0+$c)) $((64*$c+36))k 2k" "$TEST_IMG"
> +    _verify_l2_bitmap "$c"
> +done
> +
> +# Create a snapshot and set l2_offset to the new L2 table
> +$QEMU_IMG snapshot -c snap1 "$TEST_IMG"
> +l2_offset=1114112 # 0x110000
> +
> +# Write different patterns to each one of the clusters
> +# in order to see how copy-on-write behaves in each case.
> +$QEMU_IO -c "write -q -P 0xf0 $((64*0+30))k 1k" \
> +         -c "write -q -P 0xf1 $((64*1+20))k 1k" \
> +         -c "write -q -P 0xf2 $((64*2+40))k 1k" \
> +         -c "write -q -P 0xf3 $((64*3+26))k 1k" \
> +         -c "write -q -P 0xf4 $((64*4+14))k 1k" \
> +         -c "write -q -P 0xf5 $((64*5+1))k  1k" \
> +         -c "write -q -z      $((64*6+30))k 3k" \
> +         -c "write -q -z      $((64*7+26))k 2k" \
> +         -c "write -q -z      $((64*8+26))k 1k" \
> +         -c "write -q -z      $((64*9+12))k 1k" \
> +         "$TEST_IMG"
> +alloc="`seq 13 18`"; zero="7" _verify_l2_bitmap 0
> +alloc="`seq 10 18`"; zero="7" _verify_l2_bitmap 1
> +alloc="`seq 13 20`"; zero="7" _verify_l2_bitmap 2
> +alloc="`seq 13 18`"; zero="7" _verify_l2_bitmap 3
> +alloc="`seq 7 18`";  zero=""  _verify_l2_bitmap 4
> +alloc="`seq 0 18`";  zero=""  _verify_l2_bitmap 5
> +alloc="13 18"; zero="7 15 16" _verify_l2_bitmap 6
> +alloc="18";       zero="7 13" _verify_l2_bitmap 7
> +alloc="`seq 13 18`"; zero="7" _verify_l2_bitmap 8
> +alloc="13 18";     zero="6 7" _verify_l2_bitmap 9
> +

Nice - overall pretty thorough!

> +# success, all done
> +echo "*** done"
> +rm -f $seq.full
> +status=0
> diff --git a/tests/qemu-iotests/271.out b/tests/qemu-iotests/271.out
> new file mode 100644
> index 0000000000..6ac53d5e10
> --- /dev/null


-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



  reply	other threads:[~2020-05-27 18:31 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-25 18:08 [PATCH v7 00/32] Add subcluster allocation to qcow2 Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 01/32] qcow2: Make Qcow2AioTask store the full host offset Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 02/32] qcow2: Convert qcow2_get_cluster_offset() into qcow2_get_host_offset() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 03/32] qcow2: Add calculate_l2_meta() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 04/32] qcow2: Split cluster_needs_cow() out of count_cow_clusters() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 05/32] qcow2: Process QCOW2_CLUSTER_ZERO_ALLOC clusters in handle_copied() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 06/32] qcow2: Add get_l2_entry() and set_l2_entry() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 07/32] qcow2: Document the Extended L2 Entries feature Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 08/32] qcow2: Add dummy has_subclusters() function Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 09/32] qcow2: Add subcluster-related fields to BDRVQcow2State Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 10/32] qcow2: Add offset_to_sc_index() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 11/32] qcow2: Add offset_into_subcluster() and size_to_subclusters() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 12/32] qcow2: Add l2_entry_size() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 13/32] qcow2: Update get/set_l2_entry() and add get/set_l2_bitmap() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 14/32] qcow2: Add QCow2SubclusterType and qcow2_get_subcluster_type() Alberto Garcia
2020-05-26 20:32   ` Eric Blake
2020-05-27  9:51     ` Alberto Garcia
2020-05-27 13:27       ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 15/32] qcow2: Add qcow2_get_subcluster_range_type() Alberto Garcia
2020-05-26 21:48   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 16/32] qcow2: Add qcow2_cluster_is_allocated() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 17/32] qcow2: Add cluster type parameter to qcow2_get_host_offset() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 18/32] qcow2: Replace QCOW2_CLUSTER_* with QCOW2_SUBCLUSTER_* Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 19/32] qcow2: Handle QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 20/32] qcow2: Add subcluster support to calculate_l2_meta() Alberto Garcia
2020-05-27 15:57   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 21/32] qcow2: Add subcluster support to qcow2_get_host_offset() Alberto Garcia
2020-05-27 16:40   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 22/32] qcow2: Add subcluster support to zero_in_l2_slice() Alberto Garcia
2020-05-27 16:43   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 23/32] qcow2: Add subcluster support to discard_in_l2_slice() Alberto Garcia
2020-05-27 16:50   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 24/32] qcow2: Add subcluster support to check_refcounts_l2() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 25/32] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2() Alberto Garcia
2020-05-27 16:52   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 26/32] qcow2: Clear the L2 bitmap when allocating a compressed cluster Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 27/32] qcow2: Add subcluster support to handle_alloc_space() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 28/32] qcow2: Add subcluster support to qcow2_co_pwrite_zeroes() Alberto Garcia
2020-05-27 17:58   ` Eric Blake
2020-05-28 15:04     ` Alberto Garcia
2020-05-28 19:11       ` Eric Blake
2020-05-29 16:06         ` Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 29/32] qcow2: Add subcluster support to qcow2_measure() Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 30/32] qcow2: Add the 'extended_l2' option and the QCOW2_INCOMPAT_EXTL2 bit Alberto Garcia
2020-05-27 18:03   ` Eric Blake
2020-05-25 18:08 ` [PATCH v7 31/32] qcow2: Assert that expand_zero_clusters_in_l1() does not support subclusters Alberto Garcia
2020-05-25 18:08 ` [PATCH v7 32/32] iotests: Add tests for qcow2 images with extended L2 entries Alberto Garcia
2020-05-27 18:30   ` Eric Blake [this message]
2020-05-29 15:07     ` Alberto Garcia
2020-05-29 15:13       ` Eric Blake
2020-05-26  2:54 ` [PATCH v7 00/32] Add subcluster allocation to qcow2 no-reply
2020-05-26 11:01   ` Alberto Garcia
2020-05-26  5:17 ` no-reply
2020-05-26  5:48 ` no-reply
2020-05-26  6:14 ` no-reply
2020-05-26  8:01 ` no-reply
2020-05-26 10:13 ` no-reply
2020-05-26 13:08 ` no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c2bb44f3-bb7e-7bb0-dbbf-ef1d3273802d@redhat.com \
    --to=eblake@redhat.com \
    --cc=berto@igalia.com \
    --cc=dereksu@qnap.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.