mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
block: Fix error handling in bdrv_replace_in_backing_chain()
When adding an Error parameter, bdrv_replace_in_backing_chain() would become nothing more than a wrapper around change_parent_backing_link(). So make the latter public, renamed as bdrv_replace_node(), and remove bdrv_replace_in_backing_chain(). Most of the callers just remove a node from the graph that they just inserted, so they can use &error_abort, but completion of a mirror job with 'replaces' set can actually fail. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
234ac1a902
commit
5fe31c25cc
5 changed files with 20 additions and 30 deletions
25
block.c
25
block.c
|
@ -2932,8 +2932,8 @@ static bool should_update_child(BdrvChild *c, BlockDriverState *to)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void change_parent_backing_link(BlockDriverState *from,
|
||||
BlockDriverState *to, Error **errp)
|
||||
void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
|
||||
Error **errp)
|
||||
{
|
||||
BdrvChild *c, *next;
|
||||
GSList *list = NULL, *p;
|
||||
|
@ -2941,6 +2941,9 @@ static void change_parent_backing_link(BlockDriverState *from,
|
|||
uint64_t perm = 0, shared = BLK_PERM_ALL;
|
||||
int ret;
|
||||
|
||||
assert(!atomic_read(&from->in_flight));
|
||||
assert(!atomic_read(&to->in_flight));
|
||||
|
||||
/* Make sure that @from doesn't go away until we have successfully attached
|
||||
* all of its parents to @to. */
|
||||
bdrv_ref(from);
|
||||
|
@ -3003,16 +3006,13 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
|||
{
|
||||
Error *local_err = NULL;
|
||||
|
||||
assert(!atomic_read(&bs_top->in_flight));
|
||||
assert(!atomic_read(&bs_new->in_flight));
|
||||
|
||||
bdrv_set_backing_hd(bs_new, bs_top, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
change_parent_backing_link(bs_top, bs_new, &local_err);
|
||||
bdrv_replace_node(bs_top, bs_new, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
bdrv_set_backing_hd(bs_new, NULL, &error_abort);
|
||||
|
@ -3025,19 +3025,6 @@ out:
|
|||
bdrv_unref(bs_new);
|
||||
}
|
||||
|
||||
void bdrv_replace_in_backing_chain(BlockDriverState *old, BlockDriverState *new)
|
||||
{
|
||||
assert(!bdrv_requests_pending(old));
|
||||
assert(!bdrv_requests_pending(new));
|
||||
|
||||
bdrv_ref(old);
|
||||
|
||||
/* FIXME Proper error handling */
|
||||
change_parent_backing_link(old, new, &error_abort);
|
||||
|
||||
bdrv_unref(old);
|
||||
}
|
||||
|
||||
static void bdrv_delete(BlockDriverState *bs)
|
||||
{
|
||||
assert(!bs->job);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue