On 07/07/2017 09:30 AM, Pavel Butsykin wrote: > The flag as additional precaution of data loss. Perhaps in the future the s/as/is/ s/of/against/ > operation shrink without this flag will be blocked for all formats, but while s/while/for now/ > we need to maintain compatibility with raw. > > Signed-off-by: Pavel Butsykin > --- > qemu-img-cmds.hx | 4 ++-- > qemu-img.c | 23 +++++++++++++++++++++++ > qemu-img.texi | 7 ++++++- > tests/qemu-iotests/102 | 4 ++-- > 4 files changed, 33 insertions(+), 5 deletions(-) > > @@ -3568,6 +3574,23 @@ static int img_resize(int argc, char **argv) > goto out; > } > > + if (total_size < blk_getlength(blk) && !shrink) { > + error_report("Warning: Shrinking an image will delete all data beyond" Alistair has a pending thread to create a unified warning function; if that lands first, you'll have to tweak this (if yours lands first, it's one more place for that series to clean up). > + "the shrunken image's end. Before performing such an" > + "operation, make sure there is no important data there."); > + > + if (g_strcmp0(bdrv_get_format_name(blk_bs(blk)), "raw") != 0) { > + error_report( > + "Use the --shrink option to perform a shrink operation."); > + ret = -1; > + goto out; > + } else { > + error_report("Using the --shrink option will suppress this message." > + "Note that future versions of qemu-img may refuse to " > + "shrink images without this option!"); No need to shout at the user ('.' is better than '!') > + } > + } > + > ret = blk_truncate(blk, total_size, &err); > if (!ret) { > qprintf(quiet, "Image resized.\n"); > diff --git a/qemu-img.texi b/qemu-img.texi > index 5b925ecf41..6324abef48 100644 > --- a/qemu-img.texi > +++ b/qemu-img.texi > @@ -499,7 +499,7 @@ qemu-img rebase -b base.img diff.qcow2 > At this point, @code{modified.img} can be discarded, since > @code{base.img + diff.qcow2} contains the same information. > > -@item resize @var{filename} [+ | -]@var{size} > +@item resize [--shrink] @var{filename} [+ | -]@var{size} > > Change the disk image as if it had been created with @var{size}. > > @@ -507,6 +507,11 @@ Before using this command to shrink a disk image, you MUST use file system and > partitioning tools inside the VM to reduce allocated file systems and partition > sizes accordingly. Failure to do so will result in data loss! > > +@code{--shrink} informs qemu-img that the user is certain about wanting > +to shrink an image and is aware that any data beyond the truncated > +image's end will be lost. Trying to shrink an image without this option > +results in a warning; future versions may make it an error. You made it an error for all but raw already, but I'm not sure how wordy we want this to be. > + > After using this command to grow a disk image, you must use file system and > partitioning tools inside the VM to actually begin using the new space on the > device. > diff --git a/tests/qemu-iotests/102 b/tests/qemu-iotests/102 > index 87db1bb1bf..d7ad8d9840 100755 > --- a/tests/qemu-iotests/102 > +++ b/tests/qemu-iotests/102 > @@ -54,7 +54,7 @@ _make_test_img $IMG_SIZE > $QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io > # Remove data cluster from image (first cluster: image header, second: reftable, > # third: refblock, fourth: L1 table, fifth: L2 table) > -$QEMU_IMG resize -f raw "$TEST_IMG" $((5 * 64 * 1024)) > +$QEMU_IMG resize -f raw --shrink "$TEST_IMG" $((5 * 64 * 1024)) > > $QEMU_IO -c map "$TEST_IMG" > $QEMU_IMG map "$TEST_IMG" > @@ -69,7 +69,7 @@ $QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io > > qemu_comm_method=monitor _launch_qemu -drive if=none,file="$TEST_IMG",id=drv0 > > -$QEMU_IMG resize -f raw "$TEST_IMG" $((5 * 64 * 1024)) > +$QEMU_IMG resize -f raw --shrink "$TEST_IMG" $((5 * 64 * 1024)) This tests a successful shrink. Please also test the error message when attempting to shrink but --shrink was not supplied. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org