Re: [libvirt] [PATCH v2 16/25] qemu: blockjob: Track internal data for 'backup' blockjob

2019-12-09 Thread Ján Tomko

On Tue, Dec 03, 2019 at 06:17:38PM +0100, Peter Krempa wrote:

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: Peter Krempa 
---
src/qemu/qemu_blockjob.c | 34 +-
src/qemu/qemu_blockjob.h | 18 ++
src/qemu/qemu_domain.c   | 21 +
3 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 5455eaba65..d434b8bddd 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -78,8 +78,12 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
{
if (job->type == QEMU_BLOCKJOB_TYPE_CREATE)
virObjectUnref(job->data.create.src);
-}



This odd diff is caused by your disruption to the whitespace serenity.


+if (job->type == QEMU_BLOCKJOB_TYPE_BACKUP) {
+virObjectUnref(job->data.backup.store);
+g_free(job->data.backup.bitmap);
+}
+}

static void
qemuBlockJobDataDispose(void *obj)


Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH v2 16/25] qemu: blockjob: Track internal data for 'backup' blockjob

2019-12-04 Thread Eric Blake

On 12/3/19 11:17 AM, Peter Krempa wrote:

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: Peter Krempa 
---


Reviewed-by: Eric Blake 

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list



Re: [libvirt] [PATCH v2 16/25] qemu: blockjob: Track internal data for 'backup' blockjob

2019-12-04 Thread Daniel P . Berrangé
On Tue, Dec 03, 2019 at 06:17:38PM +0100, Peter Krempa wrote:
> 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: Peter Krempa 
> ---
>  src/qemu/qemu_blockjob.c | 34 +-
>  src/qemu/qemu_blockjob.h | 18 ++
>  src/qemu/qemu_domain.c   | 21 +
>  3 files changed, 72 insertions(+), 1 deletion(-)

Reviewed-by: Daniel P. Berrangé 


Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v2 16/25] qemu: blockjob: Track internal data for 'backup' blockjob

2019-12-03 Thread Peter Krempa
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: Peter Krempa 
---
 src/qemu/qemu_blockjob.c | 34 +-
 src/qemu/qemu_blockjob.h | 18 ++
 src/qemu/qemu_domain.c   | 21 +
 3 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 5455eaba65..d434b8bddd 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -78,8 +78,12 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
 {
 if (job->type == QEMU_BLOCKJOB_TYPE_CREATE)
 virObjectUnref(job->data.create.src);
-}

+if (job->type == QEMU_BLOCKJOB_TYPE_BACKUP) {
+virObjectUnref(job->data.backup.store);
+g_free(job->data.backup.bitmap);
+}
+}

 static void
 qemuBlockJobDataDispose(void *obj)
@@ -370,6 +374,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();
+}
+
+
 /**
  * qemuBlockJobDiskGetJob:
  * @disk: disk definition
diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
index 4734984c99..52b03aaf9e 100644
--- a/src/qemu/qemu_blockjob.h
+++ b/src/qemu/qemu_blockjob.h
@@ -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 qemuBlockJobData *qemuBlockJobDataPtr;

@@ -124,6 +134,7 @@ struct _qemuBlockJobData {
 qemuBlockJobCommitData commit;
 qemuBlockJobCreateData create;
 qemuBlockJobCopyData copy;
+qemuBlockJobBackupData backup;
 } data;

 int type; /* qemuBlockJobType */
@@ -184,6 +195,13 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm,
 bool shallow,
 bool reuse);

+qemuBlockJobDataPtr
+qemuBlockJobDiskNewBackup(virDomainObjPtr vm,
+  virDomainDiskDefPtr disk,
+  virStorageSourcePtr store,
+  bool deleteStore,
+  const char *bitmap);
+
 qemuBlockJobDataPtr
 qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
 ATTRIBUTE_NONNULL(1);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 98d0dad861..f4f841526e 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2608,6 +2608,18 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void 
*payload,
 break;

 case QEMU_BLOCKJOB_TYPE_BACKUP:
+virBufferEscapeString(, "\n", 
job->data.backup.bitmap);
+if (job->data.backup.store) {
+if 
(qemuDomainObjPrivateXMLFormatBlockjobFormatSource(,
+  "store",
+  
job->data.backup.store,
+  
data->xmlopt,
+  false) < 
0)
+return -1;
+
+if (job->data.backup.deleteStore)
+virBufferAddLit(, "\n");
+}
 break;

 case QEMU_BLOCKJOB_TYPE_BROKEN:
@@ -3199,6 +3211,15 @@ 
qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qemuBlockJobDataPtr job,
 break;

 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))
+