If the image version should be upgraded, that is the first we should do;
if it should be downgraded, that is the last we should do. So split the
version change block into an upgrade part at the start and a downgrade
part at the end.
Signed-off-by: Max Reitz
Reviewed-by: Eric Blake
---
block/qcow2.c | 31 ---
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index e8d54ab..c5c4e86 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2731,20 +2731,13 @@ static int qcow2_amend_options(BlockDriverState *bs,
QemuOpts *opts,
desc++;
}
-if (new_version != old_version) {
-if (new_version > old_version) {
-/* Upgrade */
-s->qcow_version = new_version;
-ret = qcow2_update_header(bs);
-if (ret < 0) {
-s->qcow_version = old_version;
-return ret;
-}
-} else {
-ret = qcow2_downgrade(bs, new_version, status_cb, cb_opaque);
-if (ret < 0) {
-return ret;
-}
+/* Upgrade first (some features may require compat=1.1) */
+if (new_version > old_version) {
+s->qcow_version = new_version;
+ret = qcow2_update_header(bs);
+if (ret < 0) {
+s->qcow_version = old_version;
+return ret;
}
}
@@ -2758,7 +2751,7 @@ static int qcow2_amend_options(BlockDriverState *bs,
QemuOpts *opts,
if (s->use_lazy_refcounts != lazy_refcounts) {
if (lazy_refcounts) {
-if (s->qcow_version < 3) {
+if (new_version < 3) {
error_report("Lazy refcounts only supported with compatibility
"
"level 1.1 and above (use compat=1.1 or
greater)");
return -EINVAL;
@@ -2794,6 +2787,14 @@ static int qcow2_amend_options(BlockDriverState *bs,
QemuOpts *opts,
}
}
+/* Downgrade last (so unsupported features can be removed before) */
+if (new_version < old_version) {
+ret = qcow2_downgrade(bs, new_version, status_cb, cb_opaque);
+if (ret < 0) {
+return ret;
+}
+}
+
return 0;
}
--
1.9.3