blockdev: add x-blockdev-set-iothread force boolean

When a node is already associated with a BlockBackend the
x-blockdev-set-iothread command refuses to set the IOThread.  This is to
prevent accidentally changing the IOThread when the nodes are in use.

When the nodes are created with -drive they automatically get a
BlockBackend.  In that case we know nothing is using them yet and it's
safe to set the IOThread.  Add a force boolean to override the check.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20171207201320.19284-4-stefanha@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2017-12-07 20:13:17 +00:00
parent d02d8dde0c
commit 882e9b89af
2 changed files with 11 additions and 6 deletions

View file

@ -4131,7 +4131,7 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp)
}
void qmp_x_blockdev_set_iothread(const char *node_name, StrOrNull *iothread,
Error **errp)
bool has_force, bool force, Error **errp)
{
AioContext *old_context;
AioContext *new_context;
@ -4143,10 +4143,11 @@ void qmp_x_blockdev_set_iothread(const char *node_name, StrOrNull *iothread,
return;
}
/* If we want to allow more extreme test scenarios this guard could be
* removed. For now it protects against accidents. */
if (bdrv_has_blk(bs)) {
error_setg(errp, "Node %s is in use", node_name);
/* Protects against accidents. */
if (!(has_force && force) && bdrv_has_blk(bs)) {
error_setg(errp, "Node %s is associated with a BlockBackend and could "
"be in use (use force=true to override this check)",
node_name);
return;
}