mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 14:45:24 +00:00
qemu: block: implement helpers for blockdev-reopen
Introduce a set of helpers to call blockdev-reopen in certain scenarios Libvirt will use the QMP command to turn certain members of the backing chain read-write for bitmap manipulation and we'll also want to use it to replace/install the backing chain of a qcow2 format node. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
9f436e067d
commit
96063ce280
@ -2988,3 +2988,104 @@ qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuBlockReopenFormat:
|
||||
* @vm: domain object
|
||||
* @src: storage source to reopen
|
||||
* @asyncJob: qemu async job type
|
||||
*
|
||||
* Invokes the 'blockdev-reopen' command on the format layer of @src. This means
|
||||
* that @src must be already properly configured for the desired outcome. The
|
||||
* nodenames of @src are used to identify the specific image in qemu.
|
||||
*/
|
||||
static int
|
||||
qemuBlockReopenFormat(virDomainObjPtr vm,
|
||||
virStorageSourcePtr src,
|
||||
qemuDomainAsyncJob asyncJob)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
virQEMUDriverPtr driver = priv->driver;
|
||||
g_autoptr(virJSONValue) reopenprops = NULL;
|
||||
int rc;
|
||||
|
||||
/* If we are lacking the object here, qemu might have opened an image with
|
||||
* a node name unknown to us */
|
||||
if (!src->backingStore) {
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||
_("can't reopen image with unknown presence of backing store"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(reopenprops = qemuBlockStorageSourceGetBlockdevProps(src, src->backingStore)))
|
||||
return -1;
|
||||
|
||||
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||
return -1;
|
||||
|
||||
rc = qemuMonitorBlockdevReopen(priv->mon, &reopenprops);
|
||||
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuBlockReopenReadWrite:
|
||||
* @vm: domain object
|
||||
* @src: storage source to reopen
|
||||
* @asyncJob: qemu async job type
|
||||
*
|
||||
* Wrapper that reopens @src read-write. We currently depend on qemu
|
||||
* reopening the storage with 'auto-read-only' enabled for us.
|
||||
* After successful reopen @src's 'readonly' flag is modified. Does nothing
|
||||
* if @src is already read-write.
|
||||
*/
|
||||
int
|
||||
qemuBlockReopenReadWrite(virDomainObjPtr vm,
|
||||
virStorageSourcePtr src,
|
||||
qemuDomainAsyncJob asyncJob)
|
||||
{
|
||||
if (!src->readonly)
|
||||
return 0;
|
||||
|
||||
src->readonly = false;
|
||||
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
|
||||
src->readonly = true;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuBlockReopenReadOnly:
|
||||
* @vm: domain object
|
||||
* @src: storage source to reopen
|
||||
* @asyncJob: qemu async job type
|
||||
*
|
||||
* Wrapper that reopens @src read-only. We currently depend on qemu
|
||||
* reopening the storage with 'auto-read-only' enabled for us.
|
||||
* After successful reopen @src's 'readonly' flag is modified. Does nothing
|
||||
* if @src is already read-only.
|
||||
*/
|
||||
int
|
||||
qemuBlockReopenReadOnly(virDomainObjPtr vm,
|
||||
virStorageSourcePtr src,
|
||||
qemuDomainAsyncJob asyncJob)
|
||||
{
|
||||
if (src->readonly)
|
||||
return 0;
|
||||
|
||||
src->readonly = true;
|
||||
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
|
||||
src->readonly = false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -231,3 +231,12 @@ qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src,
|
||||
virHashTablePtr blockNamedNodeData,
|
||||
bool shallow,
|
||||
virJSONValuePtr *actions);
|
||||
|
||||
int
|
||||
qemuBlockReopenReadWrite(virDomainObjPtr vm,
|
||||
virStorageSourcePtr src,
|
||||
qemuDomainAsyncJob asyncJob);
|
||||
int
|
||||
qemuBlockReopenReadOnly(virDomainObjPtr vm,
|
||||
virStorageSourcePtr src,
|
||||
qemuDomainAsyncJob asyncJob);
|
||||
|
Loading…
Reference in New Issue
Block a user