summaryrefslogtreecommitdiffstats
path: root/blockdev.c
diff options
context:
space:
mode:
authorJeff Cody2012-10-16 21:49:10 +0200
committerKevin Wolf2012-10-24 10:26:19 +0200
commitd5208c45be38ab858db6ec5a5097aa1c1a8ebbc9 (patch)
treece7f91f0ae21e2151d9c5620e03378c535523dd7 /blockdev.c
parentblock: make bdrv_find_backing_image compare canonical filenames (diff)
downloadqemu-d5208c45be38ab858db6ec5a5097aa1c1a8ebbc9.tar.gz
qemu-d5208c45be38ab858db6ec5a5097aa1c1a8ebbc9.tar.xz
qemu-d5208c45be38ab858db6ec5a5097aa1c1a8ebbc9.zip
block: in commit, determine base image from the top image
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. Some of the error messages put out by block-commit have changed slightly, which causes 2 tests cases for block-commit to fail. This patch updates the test cases to look for the correct error output. Signed-off-by: Jeff Cody <jcody@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.c')
-rw-r--r--blockdev.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/blockdev.c b/blockdev.c
index 99828ad2bd..46e4bbd8d9 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 (has_base && 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) {