From: Marc-André Lureau <marcandre.lur...@redhat.com> This allows the Spice block driver to eject the associated device.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- block.c | 58 ++++++++++++++++++++++++++++++++--------------- include/block/block_int.h | 1 + 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/block.c b/block.c index 6d5c804..0558525 100644 --- a/block.c +++ b/block.c @@ -318,7 +318,8 @@ void bdrv_register(BlockDriver *bdrv) } /* create a new block device (by default it is empty) */ -BlockDriverState *bdrv_new(const char *device_name) +static BlockDriverState *bdrv_new_int(const char *device_name, + BlockDriverState *child) { BlockDriverState *bs; @@ -334,9 +335,24 @@ BlockDriverState *bdrv_new(const char *device_name) qemu_co_queue_init(&bs->throttled_reqs[1]); bs->refcnt = 1; + if (child) { + if (strlen(child->child_device_name)) { + pstrcpy(bs->child_device_name, sizeof(bs->child_device_name), + child->child_device_name); + } else { + pstrcpy(bs->child_device_name, sizeof(bs->child_device_name), + child->device_name); + } + } + return bs; } +BlockDriverState *bdrv_new(const char *device_name) +{ + return bdrv_new_int(device_name, NULL); +} + void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify) { notifier_list_add(&bs->close_notifiers, notify); @@ -847,16 +863,8 @@ free_and_fail: return ret; } -/* - * Opens a file using a protocol (file, host_device, nbd, ...) - * - * options is a QDict of options to pass to the block drivers, or NULL for an - * empty set of options. The reference to the QDict belongs to the block layer - * after the call (even on failure), so if the caller intends to reuse the - * dictionary, it needs to use QINCREF() before calling bdrv_file_open. - */ -int bdrv_file_open(BlockDriverState **pbs, const char *filename, - QDict *options, int flags, Error **errp) +static int bdrv_file_open_int(BlockDriverState **pbs, const char *filename, + QDict *options, int flags, BlockDriverState *child, Error **errp) { BlockDriverState *bs; BlockDriver *drv; @@ -870,7 +878,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, options = qdict_new(); } - bs = bdrv_new(""); + bs = bdrv_new_int("", child); bs->options = options; options = qdict_clone_shallow(options); @@ -957,6 +965,20 @@ fail: } /* + * Opens a file using a protocol (file, host_device, nbd, ...) + * + * options is a QDict of options to pass to the block drivers, or NULL for an + * empty set of options. The reference to the QDict belongs to the block layer + * after the call (even on failure), so if the caller intends to reuse the + * dictionary, it needs to use QINCREF() before calling bdrv_file_open. + */ +int bdrv_file_open(BlockDriverState **pbs, const char *filename, + QDict *options, int flags, Error **errp) +{ + return bdrv_file_open_int(pbs, filename, options, flags, NULL, errp); +} + +/* * Opens the backing file for a BlockDriverState if not yet open * * options is a QDict of options to pass to the block drivers, or NULL for an @@ -992,8 +1014,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) sizeof(backing_filename)); } - bs->backing_hd = bdrv_new(""); - + bs->backing_hd = bdrv_new_int("", bs); if (bs->backing_format[0] != '\0') { back_drv = bdrv_find_format(bs->backing_format); } @@ -1063,7 +1084,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options, instead of opening 'filename' directly */ /* if there is a backing file, use it */ - bs1 = bdrv_new(""); + bs1 = bdrv_new_int("", bs); ret = bdrv_open(bs1, filename, NULL, 0, drv, &local_err); if (ret < 0) { bdrv_unref(bs1); @@ -1124,8 +1145,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options, qdict_extract_subqdict(options, &file_options, "file."); - ret = bdrv_file_open(&file, filename, file_options, - bdrv_open_flags(bs, flags | BDRV_O_UNMAP), &local_err); + ret = bdrv_file_open_int(&file, filename, file_options, + bdrv_open_flags(bs, flags | BDRV_O_UNMAP), + bs, &local_err); if (ret < 0) { goto fail; } @@ -1883,7 +1905,7 @@ int bdrv_commit(BlockDriverState *bs) if (!drv) return -ENOMEDIUM; - + if (!bs->backing_hd) { return -ENOTSUP; } diff --git a/include/block/block_int.h b/include/block/block_int.h index 1666066..e0f31dc 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -301,6 +301,7 @@ struct BlockDriverState { bool iostatus_enabled; BlockDeviceIoStatus iostatus; char device_name[32]; + char child_device_name[32]; HBitmap *dirty_bitmap; int refcnt; int in_use; /* users other than guest access, eg. block migration */ -- 1.8.3.1