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>
This commit is contained in:
parent
b1b1d783ea
commit
d5208c45be
@ -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) {
|
||||
|
21
blockdev.c
21
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) {
|
||||
|
@ -111,7 +111,7 @@ class TestSingleDrive(ImageCommitTestCase):
|
||||
self.assert_no_active_commit()
|
||||
result = self.vm.qmp('block-commit', device='drive0', top='%s' % backing_img, base='%s' % backing_img)
|
||||
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||
self.assert_qmp(result, 'error/desc', 'Invalid files for merge: top and base are the same')
|
||||
self.assert_qmp(result, 'error/desc', 'Base \'%s\' not found' % backing_img)
|
||||
|
||||
def test_top_invalid(self):
|
||||
self.assert_no_active_commit()
|
||||
@ -135,7 +135,7 @@ class TestSingleDrive(ImageCommitTestCase):
|
||||
self.assert_no_active_commit()
|
||||
result = self.vm.qmp('block-commit', device='drive0', top='%s' % backing_img, base='%s' % mid_img)
|
||||
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||
self.assert_qmp(result, 'error/desc', 'Base (%(1)s) is not reachable from top (%(2)s)' % {"1" : mid_img, "2" : backing_img})
|
||||
self.assert_qmp(result, 'error/desc', 'Base \'%s\' not found' % mid_img)
|
||||
|
||||
def test_top_omitted(self):
|
||||
self.assert_no_active_commit()
|
||||
|
Loading…
Reference in New Issue
Block a user