mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
block: Add blockdev-set-active QMP command
The system emulator tries to automatically activate and inactivate block nodes at the right point during migration. However, there are still cases where it's necessary that the user can do this manually. Images are only activated on the destination VM of a migration when the VM is actually resumed. If the VM was paused, this doesn't happen automatically. The user may want to perform some operation on a block device (e.g. taking a snapshot or starting a block job) without also resuming the VM yet. This is an example where a manual command is necessary. Another example is VM migration when the image files are opened by an external qemu-storage-daemon instance on each side. In this case, the process that needs to hand over the images isn't even part of the migration and can't know when the migration completes. Management tools need a way to explicitly inactivate images on the source and activate them on the destination. This adds a new blockdev-set-active QMP command that lets the user change the status of individual nodes (this is necessary in qemu-storage-daemon because it could be serving multiple VMs and only one of them migrates at a time). For convenience, operating on all devices (like QEMU does automatically during migration) is offered as an option, too, and can be used in the context of single VM. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Acked-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-ID: <20250204211407.381505-9-kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
faecd16fe5
commit
8cd37207f8
4 changed files with 88 additions and 0 deletions
32
blockdev.c
32
blockdev.c
|
@ -3471,6 +3471,38 @@ void qmp_blockdev_del(const char *node_name, Error **errp)
|
|||
bdrv_unref(bs);
|
||||
}
|
||||
|
||||
void qmp_blockdev_set_active(const char *node_name, bool active, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
|
||||
if (!node_name) {
|
||||
if (active) {
|
||||
bdrv_activate_all(errp);
|
||||
} else {
|
||||
ret = bdrv_inactivate_all();
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to inactivate all nodes");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BlockDriverState *bs = bdrv_find_node(node_name);
|
||||
if (!bs) {
|
||||
error_setg(errp, "Failed to find node with node-name='%s'",
|
||||
node_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (active) {
|
||||
bdrv_activate(bs, errp);
|
||||
} else {
|
||||
bdrv_inactivate(bs, errp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static BdrvChild * GRAPH_RDLOCK
|
||||
bdrv_find_child(BlockDriverState *parent_bs, const char *child_name)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue