mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
block/export: Allocate BlockExport in blk_exp_add()
Instead of letting the driver allocate and return the BlockExport object, allocate it already in blk_exp_add() and pass it. This allows us to initialise the generic part before calling into the driver so that the driver can just use these values instead of having to parse the options a second time. For symmetry, move freeing the BlockExport to blk_exp_unref(). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200924152717.287415-17-kwolf@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b6076afcab
commit
a6ff798966
5 changed files with 57 additions and 36 deletions
|
@ -39,6 +39,8 @@ static const BlockExportDriver *blk_exp_find_driver(BlockExportType type)
|
|||
BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
||||
{
|
||||
const BlockExportDriver *drv;
|
||||
BlockExport *exp;
|
||||
int ret;
|
||||
|
||||
drv = blk_exp_find_driver(export->type);
|
||||
if (!drv) {
|
||||
|
@ -46,7 +48,20 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
return drv->create(export, errp);
|
||||
assert(drv->instance_size >= sizeof(BlockExport));
|
||||
exp = g_malloc0(drv->instance_size);
|
||||
*exp = (BlockExport) {
|
||||
.drv = drv,
|
||||
.refcount = 1,
|
||||
};
|
||||
|
||||
ret = drv->create(exp, export, errp);
|
||||
if (ret < 0) {
|
||||
g_free(exp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return exp;
|
||||
}
|
||||
|
||||
/* Callers must hold exp->ctx lock */
|
||||
|
@ -62,6 +77,7 @@ void blk_exp_unref(BlockExport *exp)
|
|||
assert(exp->refcount > 0);
|
||||
if (--exp->refcount == 0) {
|
||||
exp->drv->delete(exp);
|
||||
g_free(exp);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue