diff options
author | Kevin Wolf <kwolf@redhat.com> | 2015-06-15 11:53:47 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2015-07-14 15:55:19 +0200 |
commit | df5817926790f6e84d1936eab523556f96fa577a (patch) | |
tree | 2b0b229b756ee7314a2d9217446599ee1612acf0 | |
parent | 30349fd038ffb26528fad21abe1e264031364449 (diff) | |
download | qemu-df5817926790f6e84d1936eab523556f96fa577a.zip qemu-df5817926790f6e84d1936eab523556f96fa577a.tar.gz qemu-df5817926790f6e84d1936eab523556f96fa577a.tar.bz2 |
block: Move bdrv_attach_child() calls up the call chain
Let the callers of bdrv_open_inherit() call bdrv_attach_child(). It
needs to be called in all cases where bdrv_open_inherit() succeeds (i.e.
returns 0) and a child_role is given.
bdrv_attach_child() is moved upwards to avoid a forward declaration.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
-rw-r--r-- | block.c | 41 |
1 files changed, 21 insertions, 20 deletions
@@ -1102,6 +1102,19 @@ static int bdrv_fill_options(QDict **options, const char **pfilename, return 0; } +static void bdrv_attach_child(BlockDriverState *parent_bs, + BlockDriverState *child_bs, + const BdrvChildRole *child_role) +{ + BdrvChild *child = g_new(BdrvChild, 1); + *child = (BdrvChild) { + .bs = child_bs, + .role = child_role, + }; + + QLIST_INSERT_HEAD(&parent_bs->children, child, next); +} + void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd) { @@ -1202,6 +1215,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) error_free(local_err); goto free_exit; } + + bdrv_attach_child(bs, backing_hd, &child_backing); bdrv_set_backing_hd(bs, backing_hd); free_exit: @@ -1237,6 +1252,7 @@ int bdrv_open_image(BlockDriverState **pbs, const char *filename, assert(pbs); assert(*pbs == NULL); + assert(child_role != NULL); bdref_key_dot = g_strdup_printf("%s.", bdref_key); qdict_extract_subqdict(options, &image_options, bdref_key_dot); @@ -1257,6 +1273,11 @@ int bdrv_open_image(BlockDriverState **pbs, const char *filename, ret = bdrv_open_inherit(pbs, filename, reference, image_options, 0, parent, child_role, NULL, errp); + if (ret < 0) { + goto done; + } + + bdrv_attach_child(parent, *pbs, child_role); done: qdict_del(options, bdref_key); @@ -1328,19 +1349,6 @@ out: return ret; } -static void bdrv_attach_child(BlockDriverState *parent_bs, - BlockDriverState *child_bs, - const BdrvChildRole *child_role) -{ - BdrvChild *child = g_new(BdrvChild, 1); - *child = (BdrvChild) { - .bs = child_bs, - .role = child_role, - }; - - QLIST_INSERT_HEAD(&parent_bs->children, child, next); -} - /* * Opens a disk image (raw, qcow2, vmdk, ...) * @@ -1393,9 +1401,6 @@ static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename, return -ENODEV; } bdrv_ref(bs); - if (child_role) { - bdrv_attach_child(parent, bs, child_role); - } *pbs = bs; return 0; } @@ -1540,10 +1545,6 @@ static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename, goto close_and_fail; } - if (child_role) { - bdrv_attach_child(parent, bs, child_role); - } - QDECREF(options); *pbs = bs; return 0; |