提交 2c59f008 编写于 作者: P Peter Krempa

qemu: blockjob: Track internal data for 'backup' blockjob

A backup blockjob needs to be able to notify the parent backup job as
well as track all data to be able to clean up the bitmap and blockdev
used for the backup.

Add the data structure, job allocation function and status XML formatter
and parser.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 9ac4b7db
...@@ -78,6 +78,11 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) ...@@ -78,6 +78,11 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
{ {
if (job->type == QEMU_BLOCKJOB_TYPE_CREATE) if (job->type == QEMU_BLOCKJOB_TYPE_CREATE)
virObjectUnref(job->data.create.src); virObjectUnref(job->data.create.src);
if (job->type == QEMU_BLOCKJOB_TYPE_BACKUP) {
virObjectUnref(job->data.backup.store);
g_free(job->data.backup.bitmap);
}
} }
...@@ -370,6 +375,34 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, ...@@ -370,6 +375,34 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm,
} }
qemuBlockJobDataPtr
qemuBlockJobDiskNewBackup(virDomainObjPtr vm,
virDomainDiskDefPtr disk,
virStorageSourcePtr store,
bool deleteStore,
const char *bitmap)
{
g_autoptr(qemuBlockJobData) job = NULL;
g_autofree char *jobname = NULL;
jobname = g_strdup_printf("backup-%s-%s", disk->dst, disk->src->nodeformat);
if (!(job = qemuBlockJobDataNew(QEMU_BLOCKJOB_TYPE_BACKUP, jobname)))
return NULL;
job->data.backup.bitmap = g_strdup(bitmap);
job->data.backup.store = virObjectRef(store);
job->data.backup.deleteStore = deleteStore;
/* backup jobs are usually started in bulk by transaction so the caller
* shall save the status XML */
if (qemuBlockJobRegister(job, vm, disk, false) < 0)
return NULL;
return g_steal_pointer(&job);
}
/** /**
* qemuBlockJobDiskGetJob: * qemuBlockJobDiskGetJob:
* @disk: disk definition * @disk: disk definition
......
...@@ -107,6 +107,16 @@ struct _qemuBlockJobCopyData { ...@@ -107,6 +107,16 @@ struct _qemuBlockJobCopyData {
}; };
typedef struct _qemuBlockJobBackupData qemuBlockJobBackupData;
typedef qemuBlockJobBackupData *qemuBlockJobDataBackupPtr;
struct _qemuBlockJobBackupData {
virStorageSourcePtr store;
bool deleteStore;
char *bitmap;
};
typedef struct _qemuBlockJobData qemuBlockJobData; typedef struct _qemuBlockJobData qemuBlockJobData;
typedef qemuBlockJobData *qemuBlockJobDataPtr; typedef qemuBlockJobData *qemuBlockJobDataPtr;
...@@ -124,6 +134,7 @@ struct _qemuBlockJobData { ...@@ -124,6 +134,7 @@ struct _qemuBlockJobData {
qemuBlockJobCommitData commit; qemuBlockJobCommitData commit;
qemuBlockJobCreateData create; qemuBlockJobCreateData create;
qemuBlockJobCopyData copy; qemuBlockJobCopyData copy;
qemuBlockJobBackupData backup;
} data; } data;
int type; /* qemuBlockJobType */ int type; /* qemuBlockJobType */
...@@ -184,6 +195,13 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, ...@@ -184,6 +195,13 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm,
bool shallow, bool shallow,
bool reuse); bool reuse);
qemuBlockJobDataPtr
qemuBlockJobDiskNewBackup(virDomainObjPtr vm,
virDomainDiskDefPtr disk,
virStorageSourcePtr store,
bool deleteStore,
const char *bitmap);
qemuBlockJobDataPtr qemuBlockJobDataPtr
qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
......
...@@ -2608,6 +2608,18 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *payload, ...@@ -2608,6 +2608,18 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *payload,
break; break;
case QEMU_BLOCKJOB_TYPE_BACKUP: case QEMU_BLOCKJOB_TYPE_BACKUP:
virBufferEscapeString(&childBuf, "<bitmap name='%s'/>\n", job->data.backup.bitmap);
if (job->data.backup.store) {
if (qemuDomainObjPrivateXMLFormatBlockjobFormatSource(&childBuf,
"store",
job->data.backup.store,
data->xmlopt,
false) < 0)
return -1;
if (job->data.backup.deleteStore)
virBufferAddLit(&childBuf, "<deleteStore/>\n");
}
break; break;
case QEMU_BLOCKJOB_TYPE_BROKEN: case QEMU_BLOCKJOB_TYPE_BROKEN:
...@@ -3202,6 +3214,15 @@ qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qemuBlockJobDataPtr job, ...@@ -3202,6 +3214,15 @@ qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qemuBlockJobDataPtr job,
break; break;
case QEMU_BLOCKJOB_TYPE_BACKUP: case QEMU_BLOCKJOB_TYPE_BACKUP:
job->data.backup.bitmap = virXPathString("string(./bitmap/@name)", ctxt);
if (!(tmp = virXPathNode("./store", ctxt)) ||
!(job->data.backup.store = qemuDomainObjPrivateXMLParseBlockjobChain(tmp, ctxt, xmlopt)))
goto broken;
if (virXPathNode("./deleteStore", ctxt))
job->data.backup.deleteStore = true;
break; break;
case QEMU_BLOCKJOB_TYPE_BROKEN: case QEMU_BLOCKJOB_TYPE_BROKEN:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册