]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemuBlockJobProcessEventConcludedBackup: Handle potentially NULL 'job->disk'
authorPeter Krempa <pkrempa@redhat.com>
Tue, 11 Jun 2024 15:14:16 +0000 (17:14 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 20 Jun 2024 07:52:54 +0000 (09:52 +0200)
Similarly to other blockjob handlers, if there's no disk associated with
the blockjob the handler needs to behave correctly. This is needed as
the disk might have been de-associated on unplug or other operations.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_backup.c
src/qemu/qemu_backup.h
src/qemu/qemu_blockjob.c

index 857709b17e02151d39163a922672b150634a4989..81391c29f7b5c564aac905c3283273a025b24c7a 100644 (file)
@@ -966,7 +966,7 @@ qemuBackupGetXMLDesc(virDomainObj *vm,
 
 void
 qemuBackupNotifyBlockjobEnd(virDomainObj *vm,
-                            virDomainDiskDef *disk,
+                            const char *diskdst,
                             qemuBlockjobState state,
                             const char *errmsg,
                             unsigned long long cur,
@@ -983,7 +983,7 @@ qemuBackupNotifyBlockjobEnd(virDomainObj *vm,
     size_t i;
 
     VIR_DEBUG("vm: '%s', disk:'%s', state:'%d' errmsg:'%s'",
-              vm->def->name, disk->dst, state, NULLSTR(errmsg));
+              vm->def->name, NULLSTR(diskdst), state, NULLSTR(errmsg));
 
     if (!backup)
         return;
@@ -1016,7 +1016,7 @@ qemuBackupNotifyBlockjobEnd(virDomainObj *vm,
         if (!backupdisk->store)
             continue;
 
-        if (STREQ(disk->dst, backupdisk->name)) {
+        if (STREQ_NULLABLE(diskdst, backupdisk->name)) {
             switch (state) {
             case QEMU_BLOCKJOB_STATE_COMPLETED:
                 backupdisk->state = VIR_DOMAIN_BACKUP_DISK_STATE_COMPLETE;
index ec0603026a4b17e2021aaf1499ad81e7e871376d..768da6cbef805b9fdd570cabf69364aa6d65e6e5 100644 (file)
@@ -36,7 +36,7 @@ qemuBackupJobCancelBlockjobs(virDomainObj *vm,
 
 void
 qemuBackupNotifyBlockjobEnd(virDomainObj *vm,
-                            virDomainDiskDef *disk,
+                            const char *diskdst,
                             qemuBlockjobState state,
                             const char *errmsg,
                             unsigned long long cur,
index 4b5b63d287b9ee00ff16e09226bbd333a554a0c0..42856df6d41f10770ffcc4b5ba94895831180f43 100644 (file)
@@ -1372,8 +1372,12 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriver *driver,
                                         unsigned long long progressTotal)
 {
     g_autoptr(qemuBlockStorageSourceAttachData) backend = NULL;
+    const char *diskdst = NULL;
+
+    if (job->disk)
+        diskdst = job->disk->dst;
 
-    qemuBackupNotifyBlockjobEnd(vm, job->disk, newstate, job->errmsg,
+    qemuBackupNotifyBlockjobEnd(vm, diskdst, newstate, job->errmsg,
                                 progressCurrent, progressTotal, asyncJob);
 
     if (job->data.backup.store &&
@@ -1386,7 +1390,8 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriver *driver,
     if (backend)
         qemuBlockStorageSourceAttachRollback(qemuDomainGetMonitor(vm), backend);
 
-    if (job->data.backup.bitmap)
+    if (job->disk &&
+        job->data.backup.bitmap)
         qemuMonitorBitmapRemove(qemuDomainGetMonitor(vm),
                                 qemuBlockStorageSourceGetEffectiveNodename(job->disk->src),
                                 job->data.backup.bitmap);