Patchwork [v2,2/4] block: in commit, determine base image from the top image

login
register
mail settings
Submitter Jeff Cody
Date Oct. 16, 2012, 2:44 p.m.
Message ID <421ff837d7c7dc9f661d71b2606c25b5a2b8ac3c.1350398238.git.jcody@redhat.com>
Download mbox | patch
Permalink /patch/191807/
State New
Headers show

Comments

Jeff Cody - Oct. 16, 2012, 2:44 p.m.
This simplifies some code and error checking, and also fixes a bug.

bdrv_find_backing_image() should only be passed absolute filenames,
or filenames relative to the chain.  In the QMP message handler for
block commit, when looking up the base do so from the determined top
image, so we know it is reachable from top.

Signed-off-by: Jeff Cody <jcody@redhat.com>
---
 block/commit.c |  9 ---------
 blockdev.c     | 21 +++++++++++----------
 2 files changed, 11 insertions(+), 19 deletions(-)
Eric Blake - Oct. 16, 2012, 3:22 p.m.
On 10/16/2012 08:44 AM, Jeff Cody wrote:
> This simplifies some code and error checking, and also fixes a bug.
> 
> bdrv_find_backing_image() should only be passed absolute filenames,
> or filenames relative to the chain.  In the QMP message handler for
> block commit, when looking up the base do so from the determined top
> image, so we know it is reachable from top.
> 
> Signed-off-by: Jeff Cody <jcody@redhat.com>
> ---
>  block/commit.c |  9 ---------
>  blockdev.c     | 21 +++++++++++----------
>  2 files changed, 11 insertions(+), 19 deletions(-)

As long as you are touching this code:

> @@ -1182,6 +1172,17 @@ void qmp_block_commit(const char *device,
>          return;
>      }
>  
> +    if (base && has_base) {

please swap this to 'has_base && base' to avoid any potential of
valgrind warnings about conditional jump based on uninitialized memory.

Also, I raised another bug[1] about a bad error message regarding
top_bs, if the user passes a different spelling than the canonical name
of the active image.  Is that worth fixing in this series, or is it okay
to leave it until you actually add support for committing the top image?

[1] https://lists.gnu.org/archive/html/qemu-devel/2012-10/msg02067.html
Jeff Cody - Oct. 16, 2012, 3:31 p.m.
On 10/16/2012 11:22 AM, Eric Blake wrote:
> On 10/16/2012 08:44 AM, Jeff Cody wrote:
>> This simplifies some code and error checking, and also fixes a bug.
>>
>> bdrv_find_backing_image() should only be passed absolute filenames,
>> or filenames relative to the chain.  In the QMP message handler for
>> block commit, when looking up the base do so from the determined top
>> image, so we know it is reachable from top.
>>
>> Signed-off-by: Jeff Cody <jcody@redhat.com>
>> ---
>>  block/commit.c |  9 ---------
>>  blockdev.c     | 21 +++++++++++----------
>>  2 files changed, 11 insertions(+), 19 deletions(-)
> 
> As long as you are touching this code:
> 
>> @@ -1182,6 +1172,17 @@ void qmp_block_commit(const char *device,
>>          return;
>>      }
>>  
>> +    if (base && has_base) {
> 
> please swap this to 'has_base && base' to avoid any potential of
> valgrind warnings about conditional jump based on uninitialized memory.
>

OK.

> Also, I raised another bug[1] about a bad error message regarding
> top_bs, if the user passes a different spelling than the canonical name
> of the active image.  Is that worth fixing in this series, or is it okay
> to leave it until you actually add support for committing the top image?
> 
> [1] https://lists.gnu.org/archive/html/qemu-devel/2012-10/msg02067.html
> 

Since this doesn't pose an actual issue now, I was planning on just
addressing that with the stage-2 patches, since that will likely touch
other related areas of the code anyway.  If you have major heartburn
over this, I'll change it now.
Eric Blake - Oct. 16, 2012, 3:35 p.m.
On 10/16/2012 09:31 AM, Jeff Cody wrote:
>> Also, I raised another bug[1] about a bad error message regarding
>> top_bs, if the user passes a different spelling than the canonical name
>> of the active image.  Is that worth fixing in this series, or is it okay
>> to leave it until you actually add support for committing the top image?
>>
>> [1] https://lists.gnu.org/archive/html/qemu-devel/2012-10/msg02067.html
>>
> 
> Since this doesn't pose an actual issue now, I was planning on just
> addressing that with the stage-2 patches, since that will likely touch
> other related areas of the code anyway.  If you have major heartburn
> over this, I'll change it now.

Nah, waiting is fine.  As I said in the original bug report, it is only
a poor quality error message at the moment, and fixing it may be easier
once you have additional pieces in place for committing the active
image.  I just wanted to make sure the report wasn't lost.

Patch

diff --git a/block/commit.c b/block/commit.c
index 733c914..13d9e82 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -211,15 +211,6 @@  void commit_start(BlockDriverState *bs, BlockDriverState *base,
         return;
     }
 
-    /* top and base may be valid, but let's make sure that base is reachable
-     * from top */
-    if (bdrv_find_backing_image(top, base->filename) != base) {
-        error_setg(errp,
-                   "Base (%s) is not reachable from top (%s)",
-                   base->filename, top->filename);
-        return;
-    }
-
     overlay_bs = bdrv_find_overlay(bs, top);
 
     if (overlay_bs == NULL) {
diff --git a/blockdev.c b/blockdev.c
index 99828ad..7052287 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1157,16 +1157,6 @@  void qmp_block_commit(const char *device,
         error_set(errp, QERR_DEVICE_NOT_FOUND, device);
         return;
     }
-    if (base && has_base) {
-        base_bs = bdrv_find_backing_image(bs, base);
-    } else {
-        base_bs = bdrv_find_base(bs);
-    }
-
-    if (base_bs == NULL) {
-        error_set(errp, QERR_BASE_NOT_FOUND, base ? base : "NULL");
-        return;
-    }
 
     /* default top_bs is the active layer */
     top_bs = bs;
@@ -1182,6 +1172,17 @@  void qmp_block_commit(const char *device,
         return;
     }
 
+    if (base && has_base) {
+        base_bs = bdrv_find_backing_image(top_bs, base);
+    } else {
+        base_bs = bdrv_find_base(top_bs);
+    }
+
+    if (base_bs == NULL) {
+        error_set(errp, QERR_BASE_NOT_FOUND, base ? base : "NULL");
+        return;
+    }
+
     commit_start(bs, base_bs, top_bs, speed, on_error, block_job_cb, bs,
                 &local_err);
     if (local_err != NULL) {