/**
- * qemuBlockReopenReadWrite:
+ * qemuBlockReopenAccess:
* @vm: domain object
* @src: storage source to reopen
+ * @readonly: requested readonly mode
* @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.
+ * 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.
*/
-int
-qemuBlockReopenReadWrite(virDomainObj *vm,
- virStorageSource *src,
- virDomainAsyncJob asyncJob)
+
+static int
+qemuBlockReopenAccess(virDomainObj *vm,
+ virStorageSource *src,
+ bool readonly,
+ virDomainAsyncJob asyncJob)
{
- if (!src->readonly)
+ if (src->readonly == readonly)
return 0;
- src->readonly = false;
+ src->readonly = readonly;
if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
- src->readonly = true;
+ src->readonly = !readonly;
return -1;
}
/**
- * qemuBlockReopenReadOnly:
+ * qemuBlockReopenReadWrite:
* @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.
+ * Semantic wrapper that reopens @src read-write. After successful reopen @src's
+ * 'readonly' flag is modified. Does nothing if @src is already read-write.
*/
int
-qemuBlockReopenReadOnly(virDomainObj *vm,
+qemuBlockReopenReadWrite(virDomainObj *vm,
virStorageSource *src,
virDomainAsyncJob asyncJob)
{
- if (src->readonly)
- return 0;
+ return qemuBlockReopenAccess(vm, src, false, asyncJob);
+}
- src->readonly = true;
- if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) {
- src->readonly = false;
- return -1;
- }
- return 0;
+/**
+ * qemuBlockReopenReadOnly:
+ * @vm: domain object
+ * @src: storage source to reopen
+ * @asyncJob: qemu async job type
+ *
+ * Semantic wrapper that reopens @src read-only. After successful reopen @src's
+ * 'readonly' flag is modified. Does nothing if @src is already read-only.
+ */
+int
+qemuBlockReopenReadOnly(virDomainObj *vm,
+ virStorageSource *src,
+ virDomainAsyncJob asyncJob)
+{
+ return qemuBlockReopenAccess(vm, src, true, asyncJob);
}
/**