qemu: block: Extract logic from qemuBlockReopenReadWrite/ReadOnly

We want to preserve the wrappers for clarity but the inner logic can be
extracted to a common function qemuBlockReopenAccess. In further patches
the code from qemuBlockReopenFormat will be merged into the new wrapper
as well as logic for handling scenarios with missing 'format' layers
will be added.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2023-11-22 14:27:19 +01:00
parent 834d283bcf
commit 214794c9c7

View File

@ -3230,32 +3230,53 @@ qemuBlockReopenFormat(virDomainObj *vm,
} }
/**
* qemuBlockReopenAccess:
* @vm: domain object
* @src: storage source to reopen
* @readonly: requested readonly mode
* @asyncJob: qemu async job type
*
* Reopen @src image to ensure that it is in @readonly. Does nothing if it is
* already in the requested state.
*
* Callers must use qemuBlockReopenReadWrite/qemuBlockReopenReadOnly functions.
*/
static int
qemuBlockReopenAccess(virDomainObj *vm,
virStorageSource *src,
bool readonly,
virDomainAsyncJob asyncJob)
{
if (src->readonly == readonly)
return 0;
src->readonly = readonly;
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
src->readonly = !readonly;
return -1;
}
return 0;
}
/** /**
* qemuBlockReopenReadWrite: * qemuBlockReopenReadWrite:
* @vm: domain object * @vm: domain object
* @src: storage source to reopen * @src: storage source to reopen
* @asyncJob: qemu async job type * @asyncJob: qemu async job type
* *
* Wrapper that reopens @src read-write. We currently depend on qemu * Semantic wrapper that reopens @src read-write. After successful reopen @src's
* reopening the storage with 'auto-read-only' enabled for us. * 'readonly' flag is modified. Does nothing if @src is already read-write.
* After successful reopen @src's 'readonly' flag is modified. Does nothing
* if @src is already read-write.
*/ */
int int
qemuBlockReopenReadWrite(virDomainObj *vm, qemuBlockReopenReadWrite(virDomainObj *vm,
virStorageSource *src, virStorageSource *src,
virDomainAsyncJob asyncJob) virDomainAsyncJob asyncJob)
{ {
if (!src->readonly) return qemuBlockReopenAccess(vm, src, false, asyncJob);
return 0;
src->readonly = false;
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
src->readonly = true;
return -1;
}
return 0;
} }
@ -3265,26 +3286,15 @@ qemuBlockReopenReadWrite(virDomainObj *vm,
* @src: storage source to reopen * @src: storage source to reopen
* @asyncJob: qemu async job type * @asyncJob: qemu async job type
* *
* Wrapper that reopens @src read-only. We currently depend on qemu * Semantic wrapper that reopens @src read-only. After successful reopen @src's
* reopening the storage with 'auto-read-only' enabled for us. * 'readonly' flag is modified. Does nothing if @src is already read-only.
* After successful reopen @src's 'readonly' flag is modified. Does nothing
* if @src is already read-only.
*/ */
int int
qemuBlockReopenReadOnly(virDomainObj *vm, qemuBlockReopenReadOnly(virDomainObj *vm,
virStorageSource *src, virStorageSource *src,
virDomainAsyncJob asyncJob) virDomainAsyncJob asyncJob)
{ {
if (src->readonly) return qemuBlockReopenAccess(vm, src, true, asyncJob);
return 0;
src->readonly = true;
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
src->readonly = false;
return -1;
}
return 0;
} }
/** /**