| 
									
										
										
										
											2019-03-07 15:58:38 +01:00
										 |  |  | #!/usr/bin/env bash | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:58 +08:00
										 |  |  | # Test export internal snapshot by qemu-nbd, convert it by qemu-img. | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2013 IBM, Inc. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Based on 029. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # 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/>. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # creator | 
					
						
							|  |  |  | owner=xiawenc@linux.vnet.ibm.com | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | seq=`basename $0` | 
					
						
							|  |  |  | echo "QA output created by $seq" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | status=1	# failure is the default! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _export_nbd_snapshot() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-16 15:53:22 +00:00
										 |  |  |     nbd_server_start_unix_socket "$TEST_IMG" -l $1 | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _export_nbd_snapshot1() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-16 15:53:22 +00:00
										 |  |  |     nbd_server_start_unix_socket "$TEST_IMG" -l snapshot.name=$1 | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _cleanup() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-16 15:53:22 +00:00
										 |  |  |     nbd_server_stop | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  |     _cleanup_test_img | 
					
						
							| 
									
										
										
										
											2019-11-07 17:37:01 +01:00
										 |  |  |     _rm_test_img "$converted_image" | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | trap "_cleanup; exit \$status" 0 1 2 3 15 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # get standard environment, filters and checks | 
					
						
							|  |  |  | . ./common.rc | 
					
						
							|  |  |  | . ./common.filter | 
					
						
							|  |  |  | . ./common.pattern | 
					
						
							| 
									
										
										
										
											2018-11-16 15:53:22 +00:00
										 |  |  | . ./common.nbd | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | _supported_fmt qcow2 | 
					
						
							|  |  |  | _supported_proto file | 
					
						
							| 
									
										
										
										
											2015-01-04 09:53:49 +08:00
										 |  |  | _supported_os Linux | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | _require_command QEMU_NBD | 
					
						
							| 
									
										
										
										
											2019-11-07 17:37:07 +01:00
										 |  |  | # Internal snapshots are (currently) impossible with refcount_bits=1, | 
					
						
							|  |  |  | # and generally impossible with external data files | 
					
						
							|  |  |  | _unsupported_imgopts 'refcount_bits=1[^0-9]' data_file | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 15:53:22 +00:00
										 |  |  | nbd_snapshot_img="nbd:unix:$nbd_unix_socket" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | converted_image=$TEST_IMG.converted | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-20 16:27:07 +01:00
										 |  |  | # Use -f raw instead of -f $IMGFMT for the NBD connection | 
					
						
							| 
									
										
										
										
											2020-01-20 14:18:58 +00:00
										 |  |  | QEMU_IO_NBD="$QEMU_IO -f raw --cache=$CACHEMODE --aio=$AIOMODE" | 
					
						
							| 
									
										
										
										
											2014-11-20 16:27:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | echo | 
					
						
							|  |  |  | echo "== preparing image ==" | 
					
						
							|  |  |  | _make_test_img 64M | 
					
						
							|  |  |  | $QEMU_IO -c 'write -P 0xa 0x1000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO -c 'write -P 0xb 0x2000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IMG snapshot -c sn1 "$TEST_IMG" | 
					
						
							|  |  |  | $QEMU_IO -c 'write -P 0xc 0x1000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO -c 'write -P 0xd 0x2000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | _check_test_img | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | echo "== verifying the image file with patterns ==" | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xc 0x1000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xd 0x2000 0x1000' "$TEST_IMG" | _filter_qemu_io | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _export_nbd_snapshot sn1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | echo "== verifying the exported snapshot with patterns, method 1 ==" | 
					
						
							| 
									
										
											  
											
												nbd-client: Refuse read-only client with BDRV_O_RDWR
The NBD spec says that clients should not try to write/trim to
an export advertised as read-only by the server.  But we failed
to check that, and would allow the block layer to use NBD with
BDRV_O_RDWR even when the server is read-only, which meant we
were depending on the server sending a proper EPERM failure for
various commands, and also exposes a leaky abstraction: using
qemu-io in read-write mode would succeed on 'w -z 0 0' because
of local short-circuiting logic, but 'w 0 0' would send a
request over the wire (where it then depends on the server, and
fails at least for qemu-nbd but might pass for other NBD
implementations).
With this patch, a client MUST request read-only mode to access
a server that is doing a read-only export, or else it will get
a message like:
can't open device nbd://localhost:10809/foo: request for write access conflicts with read-only export
It is no longer possible to even attempt writes over the wire
(including the corner case of 0-length writes), because the block
layer enforces the explicit read-only request; this matches the
behavior of qcow2 when backed by a read-only POSIX file.
Fix several iotests to comply with the new behavior (since
qemu-nbd of an internal snapshot, as well as nbd-server-add over QMP,
default to a read-only export, we must tell blockdev-add/qemu-io to
set up a read-only client).
CC: qemu-stable@nongnu.org
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20171108215703.9295-3-eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
											
										 
											2017-11-08 15:56:58 -06:00
										 |  |  | $QEMU_IO_NBD -r -c 'read -P 0xa 0x1000 0x1000' "$nbd_snapshot_img" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO_NBD -r -c 'read -P 0xb 0x2000 0x1000' "$nbd_snapshot_img" | _filter_qemu_io | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | _export_nbd_snapshot1 sn1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | echo "== verifying the exported snapshot with patterns, method 2 ==" | 
					
						
							| 
									
										
											  
											
												nbd-client: Refuse read-only client with BDRV_O_RDWR
The NBD spec says that clients should not try to write/trim to
an export advertised as read-only by the server.  But we failed
to check that, and would allow the block layer to use NBD with
BDRV_O_RDWR even when the server is read-only, which meant we
were depending on the server sending a proper EPERM failure for
various commands, and also exposes a leaky abstraction: using
qemu-io in read-write mode would succeed on 'w -z 0 0' because
of local short-circuiting logic, but 'w 0 0' would send a
request over the wire (where it then depends on the server, and
fails at least for qemu-nbd but might pass for other NBD
implementations).
With this patch, a client MUST request read-only mode to access
a server that is doing a read-only export, or else it will get
a message like:
can't open device nbd://localhost:10809/foo: request for write access conflicts with read-only export
It is no longer possible to even attempt writes over the wire
(including the corner case of 0-length writes), because the block
layer enforces the explicit read-only request; this matches the
behavior of qcow2 when backed by a read-only POSIX file.
Fix several iotests to comply with the new behavior (since
qemu-nbd of an internal snapshot, as well as nbd-server-add over QMP,
default to a read-only export, we must tell blockdev-add/qemu-io to
set up a read-only client).
CC: qemu-stable@nongnu.org
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20171108215703.9295-3-eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
											
										 
											2017-11-08 15:56:58 -06:00
										 |  |  | $QEMU_IO_NBD -r -c 'read -P 0xa 0x1000 0x1000' "$nbd_snapshot_img" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO_NBD -r -c 'read -P 0xb 0x2000 0x1000' "$nbd_snapshot_img" | _filter_qemu_io | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:58 +08:00
										 |  |  | $QEMU_IMG convert "$TEST_IMG" -l sn1 -O qcow2 "$converted_image" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | echo "== verifying the converted snapshot with patterns, method 1 ==" | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xa 0x1000 0x1000' "$converted_image" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xb 0x2000 0x1000' "$converted_image" | _filter_qemu_io | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $QEMU_IMG convert "$TEST_IMG" -l snapshot.name=sn1 -O qcow2 "$converted_image" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | echo "== verifying the converted snapshot with patterns, method 2 ==" | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xa 0x1000 0x1000' "$converted_image" | _filter_qemu_io | 
					
						
							|  |  |  | $QEMU_IO -c 'read -P 0xb 0x2000 0x1000' "$converted_image" | _filter_qemu_io | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 17:10:56 +08:00
										 |  |  | # success, all done | 
					
						
							|  |  |  | echo "*** done" | 
					
						
							|  |  |  | rm -f $seq.full | 
					
						
							|  |  |  | status=0 |