Re: [Qemu-devel] [PATCH v3 17/22] qcow2: Split upgrade/downgrade paths for amend

2014-11-28 Thread Stefan Hajnoczi
On Thu, Nov 20, 2014 at 06:06:33PM +0100, Max Reitz wrote:
> 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(-)

Reviewed-by: Stefan Hajnoczi 


pgpzAIZQ6Upn9.pgp
Description: PGP signature


[Qemu-devel] [PATCH v3 17/22] qcow2: Split upgrade/downgrade paths for amend

2014-11-20 Thread Max Reitz
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