Pull request
A discard fix from Nir Soffer. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmaPoiAACgkQnKSrs4Gr c8hjGAf+JxwJOBibYVdyPRhnrYWu3b/G3rAfwSnYvgJrCPDztmLTB50lCDCnZ2Jr T/GN8/BYbuR7O2VkEEMXutrYkLWAUQNGz28wd6GgaeYL/rx7yEg5htmP2nWSySP3 rS3ri3i30QUHI/zSOH5a5eRVQBDZECyyd7jAADqhYt6Vfh9O3ApUy8SPxS6sT7WF i5a8ffqDVtiFaE2nvBs8KncdRZcBkiNyWt122cvbYCLepy2G3/WD3gv/AP126xGO bGzBQUODCqcgbIjUH5d5qOLhB4eppqxsclHMwIZeo5QV/De5BVjg2I6LxOutdbv3 1MAAHFsbjLRBnKVWafgz2vCi/gi1gA== =hjGY -----END PGP SIGNATURE----- Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging Pull request A discard fix from Nir Soffer. # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCAAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmaPoiAACgkQnKSrs4Gr # c8hjGAf+JxwJOBibYVdyPRhnrYWu3b/G3rAfwSnYvgJrCPDztmLTB50lCDCnZ2Jr # T/GN8/BYbuR7O2VkEEMXutrYkLWAUQNGz28wd6GgaeYL/rx7yEg5htmP2nWSySP3 # rS3ri3i30QUHI/zSOH5a5eRVQBDZECyyd7jAADqhYt6Vfh9O3ApUy8SPxS6sT7WF # i5a8ffqDVtiFaE2nvBs8KncdRZcBkiNyWt122cvbYCLepy2G3/WD3gv/AP126xGO # bGzBQUODCqcgbIjUH5d5qOLhB4eppqxsclHMwIZeo5QV/De5BVjg2I6LxOutdbv3 # 1MAAHFsbjLRBnKVWafgz2vCi/gi1gA== # =hjGY # -----END PGP SIGNATURE----- # gpg: Signature made Thu 11 Jul 2024 02:13:04 AM PDT # gpg: using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [full] # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" [full] * tag 'block-pull-request' of https://gitlab.com/stefanha/qemu: Consider discard option when writing zeros qemu-iotest/245: Add missing discard=unmap Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
		
						commit
						39a032cea2
					
				| @ -1862,6 +1862,11 @@ bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int64_t bytes, | ||||
|         return -EINVAL; | ||||
|     } | ||||
| 
 | ||||
|     /* If opened with discard=off we should never unmap. */ | ||||
|     if (!(bs->open_flags & BDRV_O_UNMAP)) { | ||||
|         flags &= ~BDRV_REQ_MAY_UNMAP; | ||||
|     } | ||||
| 
 | ||||
|     /* Invalidate the cached block-status data range if this write overlaps */ | ||||
|     bdrv_bsc_invalidate_range(bs, offset, bytes); | ||||
| 
 | ||||
| @ -2315,10 +2320,6 @@ int coroutine_fn bdrv_co_pwrite_zeroes(BdrvChild *child, int64_t offset, | ||||
|     trace_bdrv_co_pwrite_zeroes(child->bs, offset, bytes, flags); | ||||
|     assert_bdrv_graph_readable(); | ||||
| 
 | ||||
|     if (!(child->bs->open_flags & BDRV_O_UNMAP)) { | ||||
|         flags &= ~BDRV_REQ_MAY_UNMAP; | ||||
|     } | ||||
| 
 | ||||
|     return bdrv_co_pwritev(child, offset, bytes, NULL, | ||||
|                            BDRV_REQ_ZERO_WRITE | flags); | ||||
| } | ||||
|  | ||||
| @ -592,7 +592,7 @@ class TestBlockdevReopen(iotests.QMPTestCase): | ||||
|     @iotests.skip_if_unsupported(['compress']) | ||||
|     def test_insert_compress_filter(self): | ||||
|         # Add an image to the VM: hd (raw) -> hd0 (qcow2) -> hd0-file (file) | ||||
|         opts = {'driver': 'raw', 'node-name': 'hd', 'file': hd_opts(0)} | ||||
|         opts = {'driver': 'raw', 'node-name': 'hd', 'file': hd_opts(0), 'discard': 'unmap'} | ||||
|         self.vm.cmd('blockdev-add', conv_keys = False, **opts) | ||||
| 
 | ||||
|         # Add a 'compress' filter | ||||
|  | ||||
							
								
								
									
										127
									
								
								tests/qemu-iotests/tests/write-zeroes-unmap
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										127
									
								
								tests/qemu-iotests/tests/write-zeroes-unmap
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,127 @@ | ||||
| #!/usr/bin/env bash | ||||
| # group: quick | ||||
| # | ||||
| # Test write zeros unmap. | ||||
| # | ||||
| # Copyright (C) Red Hat, Inc. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation; either version 2 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| seq="$(basename $0)" | ||||
| echo "QA output created by $seq" | ||||
| 
 | ||||
| trap _cleanup_test_img exit | ||||
| 
 | ||||
| # get standard environment, filters and checks | ||||
| cd .. | ||||
| . ./common.rc | ||||
| . ./common.filter | ||||
| 
 | ||||
| _supported_fmt raw | ||||
| _supported_proto file | ||||
| _supported_os Linux | ||||
| 
 | ||||
| create_test_image() { | ||||
|     _make_test_img -f $IMGFMT 1m | ||||
| } | ||||
| 
 | ||||
| filter_command() { | ||||
|     _filter_testdir | _filter_qemu_io | _filter_qemu | _filter_hmp | ||||
| } | ||||
| 
 | ||||
| print_disk_usage() { | ||||
|     du -sh $TEST_IMG | _filter_testdir | ||||
| } | ||||
| 
 | ||||
| echo | ||||
| echo "=== defaults - write zeros ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -z 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== defaults - write zeros unmap ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -zu 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| 
 | ||||
| echo | ||||
| echo "=== defaults - write actual zeros ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -P 0 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== discard=off - write zeroes unmap ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -zu 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT,discard=off \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== detect-zeroes=on - write actual zeros ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -P 0 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT,detect-zeroes=on \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== detect-zeroes=on,discard=on - write actual zeros ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -P 0 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT,detect-zeroes=on,discard=on \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== discard=on - write zeroes ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -z 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT,discard=on \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
| 
 | ||||
| echo | ||||
| echo "=== discard=on - write zeroes unmap ===" | ||||
| echo | ||||
| 
 | ||||
| create_test_image | ||||
| echo -e 'qemu-io none0 "write -zu 0 1m"\nquit' \ | ||||
|     | $QEMU -monitor stdio -drive if=none,file=$TEST_IMG,format=$IMGFMT,discard=on \ | ||||
|     | filter_command | ||||
| print_disk_usage | ||||
							
								
								
									
										81
									
								
								tests/qemu-iotests/tests/write-zeroes-unmap.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								tests/qemu-iotests/tests/write-zeroes-unmap.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | ||||
| QA output created by write-zeroes-unmap | ||||
| 
 | ||||
| === defaults - write zeros === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -z 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === defaults - write zeros unmap === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -zu 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === defaults - write actual zeros === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -P 0 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === discard=off - write zeroes unmap === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -zu 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === detect-zeroes=on - write actual zeros === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -P 0 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === detect-zeroes=on,discard=on - write actual zeros === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -P 0 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === discard=on - write zeroes === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -z 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 1.0M	TEST_DIR/t.raw | ||||
| 
 | ||||
| === discard=on - write zeroes unmap === | ||||
| 
 | ||||
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 | ||||
| QEMU X.Y.Z monitor - type 'help' for more information | ||||
| (qemu) qemu-io none0 "write -zu 0 1m" | ||||
| wrote 1048576/1048576 bytes at offset 0 | ||||
| 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| (qemu) quit | ||||
| 0	TEST_DIR/t.raw | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson