Skip to content

Commit 0c1fd2f

Browse files
committed
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer patches: - file-posix: Handle `EINVAL` fallocate return value - qemu-img convert -n: Keep qcow2 v2 target sparse # gpg: Signature made Tue 21 Jul 2020 16:45:28 BST # gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6 # gpg: issuer "[email protected]" # gpg: Good signature from "Kevin Wolf <[email protected]>" [full] # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: iotests: Test sparseness for qemu-img convert -n qcow2: Implement v2 zero writes with discard if possible file-posix: Handle `EINVAL` fallocate return value Signed-off-by: Peter Maydell <[email protected]>
2 parents b50dab9 + 4a01e27 commit 0c1fd2f

File tree

4 files changed

+60
-2
lines changed

4 files changed

+60
-2
lines changed

block/file-posix.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1698,7 +1698,11 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque)
16981698
#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
16991699
int ret = do_fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
17001700
aiocb->aio_offset, aiocb->aio_nbytes);
1701-
if (ret != -ENOTSUP) {
1701+
switch (ret) {
1702+
case -ENOTSUP:
1703+
case -EINVAL:
1704+
break;
1705+
default:
17021706
return ret;
17031707
}
17041708
#endif

block/qcow2-cluster.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1797,8 +1797,15 @@ int qcow2_cluster_zeroize(BlockDriverState *bs, uint64_t offset,
17971797
assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) ||
17981798
end_offset >= bs->total_sectors << BDRV_SECTOR_BITS);
17991799

1800-
/* The zero flag is only supported by version 3 and newer */
1800+
/*
1801+
* The zero flag is only supported by version 3 and newer. However, if we
1802+
* have no backing file, we can resort to discard in version 2.
1803+
*/
18011804
if (s->qcow_version < 3) {
1805+
if (!bs->backing) {
1806+
return qcow2_cluster_discard(bs, offset, bytes,
1807+
QCOW2_DISCARD_REQUEST, false);
1808+
}
18021809
return -ENOTSUP;
18031810
}
18041811

tests/qemu-iotests/122

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,36 @@ $QEMU_IMG convert -O $IMGFMT -n "$TEST_IMG" "$TEST_IMG".orig
281281

282282
$QEMU_IMG compare "$TEST_IMG" "$TEST_IMG".orig
283283

284+
echo
285+
echo '=== -n to an empty image ==='
286+
echo
287+
288+
TEST_IMG="$TEST_IMG".orig _make_test_img 64M
289+
290+
# Convert with -n, which should not result in a fully allocated image, not even
291+
# with compat=0.10 (because the target doesn't have a backing file)
292+
for compat in "1.1" "0.10"; do
293+
IMGOPTS="compat=$compat" _make_test_img 64M
294+
$QEMU_IMG convert -O $IMGFMT -n "$TEST_IMG".orig "$TEST_IMG"
295+
$QEMU_IMG map --output=json "$TEST_IMG"
296+
done
297+
298+
echo
299+
echo '=== -n to an empty image with a backing file ==='
300+
echo
301+
302+
TEST_IMG="$TEST_IMG".orig _make_test_img 64M
303+
TEST_IMG="$TEST_IMG".base _make_test_img 64M
304+
305+
# Convert with -n, which should still not result in a fully allocated image for
306+
# compat=1.1 (because it can use zero clusters), but it should be fully
307+
# allocated with compat=0.10
308+
for compat in "1.1" "0.10"; do
309+
IMGOPTS="compat=$compat" _make_test_img -b "$TEST_IMG".base -F $IMGFMT 64M
310+
$QEMU_IMG convert -O $IMGFMT -n "$TEST_IMG".orig "$TEST_IMG"
311+
$QEMU_IMG map --output=json "$TEST_IMG"
312+
done
313+
284314
echo
285315
echo '=== -n -B to an image without a backing file ==='
286316
echo

tests/qemu-iotests/122.out

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,23 @@ wrote 65536/65536 bytes at offset 0
229229
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
230230
Images are identical.
231231

232+
=== -n to an empty image ===
233+
234+
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=67108864
235+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
236+
[{ "start": 0, "length": 67108864, "depth": 0, "zero": true, "data": false}]
237+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
238+
[{ "start": 0, "length": 67108864, "depth": 0, "zero": true, "data": false}]
239+
240+
=== -n to an empty image with a backing file ===
241+
242+
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=67108864
243+
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
244+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
245+
[{ "start": 0, "length": 67108864, "depth": 0, "zero": true, "data": false}]
246+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
247+
[{ "start": 0, "length": 67108864, "depth": 0, "zero": false, "data": true, "offset": 327680}]
248+
232249
=== -n -B to an image without a backing file ===
233250

234251
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864

0 commit comments

Comments
 (0)