Message ID | 20200218124242.584644-14-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
Series | block: Introduce real BdrvChildRole | expand |
Am 18.02.2020 um 13:42 hat Max Reitz geschrieben: > Any current user of child_file, child_format, and child_backing can and > should use this generic BdrvChildClass instead, as it can handle all of > these cases. However, to be able to do so, the users must pass the > appropriate BdrvChildRole when the child is created/attached. (The > following commits will take care of that.) > > Signed-off-by: Max Reitz <mreitz@redhat.com> > Reviewed-by: Eric Blake <eblake@redhat.com> > block.c | 27 +++++++++++++++++++++++++++ > include/block/block_int.h | 1 + > 2 files changed, 28 insertions(+) > > diff --git a/block.c b/block.c > index 0f24546863..1d33f58ff8 100644 > --- a/block.c > +++ b/block.c > @@ -1094,6 +1094,33 @@ static void bdrv_inherited_options(BdrvChildRole role, bool parent_is_format, > *child_flags = flags; > } > > +static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base, > + const char *filename, Error **errp); Actually, I should have saved the comment on the previous patch for this one. The forward declaration could easily be avoided by moving child_of_bds down to after bdrv_backing_update_filename(). Kevin
diff --git a/block.c b/block.c index 0f24546863..1d33f58ff8 100644 --- a/block.c +++ b/block.c @@ -1094,6 +1094,33 @@ static void bdrv_inherited_options(BdrvChildRole role, bool parent_is_format, *child_flags = flags; } +static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base, + const char *filename, Error **errp); + +static int bdrv_child_cb_update_filename(BdrvChild *c, BlockDriverState *base, + const char *filename, Error **errp) +{ + if (c->role & BDRV_CHILD_COW) { + return bdrv_backing_update_filename(c, base, filename, errp); + } + return 0; +} + +const BdrvChildClass child_of_bds = { + .parent_is_bds = true, + .get_parent_desc = bdrv_child_get_parent_desc, + .inherit_options = bdrv_inherited_options, + .drained_begin = bdrv_child_cb_drained_begin, + .drained_poll = bdrv_child_cb_drained_poll, + .drained_end = bdrv_child_cb_drained_end, + .attach = bdrv_child_cb_attach, + .detach = bdrv_child_cb_detach, + .inactivate = bdrv_child_cb_inactivate, + .can_set_aio_ctx = bdrv_child_cb_can_set_aio_ctx, + .set_aio_ctx = bdrv_child_cb_set_aio_ctx, + .update_filename = bdrv_child_cb_update_filename, +}; + /* * Returns the options and flags that bs->file should get if a protocol driver * is expected, based on the given options and flags for the parent BDS diff --git a/include/block/block_int.h b/include/block/block_int.h index 1f8a818f76..dd7ccea35e 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -740,6 +740,7 @@ struct BdrvChildClass { void (*set_aio_ctx)(BdrvChild *child, AioContext *ctx, GSList **ignore); }; +extern const BdrvChildClass child_of_bds; extern const BdrvChildClass child_file; extern const BdrvChildClass child_format; extern const BdrvChildClass child_backing;