yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-migration-Unify-block-node-activation-error-handling.patch

76daa3
From 149b5fe290b6d8f52b87993d3d27fe5fca806173 Mon Sep 17 00:00:00 2001
76daa3
From: Kevin Wolf <kwolf@redhat.com>
76daa3
Date: Fri, 19 May 2017 09:38:59 +0200
76daa3
Subject: [PATCH 24/27] migration: Unify block node activation error handling
76daa3
76daa3
RH-Author: Kevin Wolf <kwolf@redhat.com>
76daa3
Message-id: <1495186739-13659-3-git-send-email-kwolf@redhat.com>
76daa3
Patchwork-id: 75377
76daa3
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH v2 2/2] migration: Unify block node activation error handling
76daa3
Bugzilla: 1452148
76daa3
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
76daa3
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
76daa3
RH-Acked-by: Max Reitz <mreitz@redhat.com>
76daa3
76daa3
Migration code activates all block driver nodes on the destination when
76daa3
the migration completes. It does so by calling
76daa3
bdrv_invalidate_cache_all() and blk_resume_after_migration(). There is
76daa3
one code path for precopy and one for postcopy migration, resulting in
76daa3
four function calls, which used to have three different failure modes.
76daa3
76daa3
This patch unifies the behaviour so that failure to activate all block
76daa3
nodes is non-fatal, but the error message is logged and the VM isn't
76daa3
automatically started. 'cont' will retry activating the block nodes.
76daa3
76daa3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
76daa3
Reviewed-by: Eric Blake <eblake@redhat.com>
76daa3
(cherry picked from commit ace21a58751824f9a3d399e332317233e880de3a)
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 migration/migration.c | 16 +++++-----------
76daa3
 migration/savevm.c    | 12 +++++-------
76daa3
 qmp.c                 | 18 +++++++++---------
76daa3
 3 files changed, 19 insertions(+), 27 deletions(-)
76daa3
76daa3
diff --git a/migration/migration.c b/migration/migration.c
76daa3
index fdc17bc..7a2ee01 100644
76daa3
--- a/migration/migration.c
76daa3
+++ b/migration/migration.c
76daa3
@@ -340,20 +340,14 @@ static void process_incoming_migration_bh(void *opaque)
76daa3
     Error *local_err = NULL;
76daa3
     MigrationIncomingState *mis = opaque;
76daa3
 
76daa3
-    /* Make sure all file formats flush their mutable metadata */
76daa3
+    /* Make sure all file formats flush their mutable metadata.
76daa3
+     * If we get an error here, just don't restart the VM yet. */
76daa3
     bdrv_invalidate_cache_all(&local_err);
76daa3
-    if (local_err) {
76daa3
-        migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
76daa3
-                          MIGRATION_STATUS_FAILED);
76daa3
-        error_report_err(local_err);
76daa3
-        migrate_decompress_threads_join();
76daa3
-        exit(EXIT_FAILURE);
76daa3
+    if (!local_err) {
76daa3
+        blk_resume_after_migration(&local_err);
76daa3
     }
76daa3
-
76daa3
-    /* If we get an error here, just don't restart the VM yet. */
76daa3
-    blk_resume_after_migration(&local_err);
76daa3
     if (local_err) {
76daa3
-        error_free(local_err);
76daa3
+        error_report_err(local_err);
76daa3
         local_err = NULL;
76daa3
         autostart = false;
76daa3
     }
76daa3
diff --git a/migration/savevm.c b/migration/savevm.c
76daa3
index 21d7985..6e2f9e7 100644
76daa3
--- a/migration/savevm.c
76daa3
+++ b/migration/savevm.c
76daa3
@@ -1620,16 +1620,14 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
76daa3
 
76daa3
     qemu_announce_self();
76daa3
 
76daa3
-    /* Make sure all file formats flush their mutable metadata */
76daa3
+    /* Make sure all file formats flush their mutable metadata.
76daa3
+     * If we get an error here, just don't restart the VM yet. */
76daa3
     bdrv_invalidate_cache_all(&local_err);
76daa3
-    if (local_err) {
76daa3
-        error_report_err(local_err);
76daa3
+    if (!local_err) {
76daa3
+        blk_resume_after_migration(&local_err);
76daa3
     }
76daa3
-
76daa3
-    /* If we get an error here, just don't restart the VM yet. */
76daa3
-    blk_resume_after_migration(&local_err);
76daa3
     if (local_err) {
76daa3
-        error_free(local_err);
76daa3
+        error_report_err(local_err);
76daa3
         local_err = NULL;
76daa3
         autostart = false;
76daa3
     }
76daa3
diff --git a/qmp.c b/qmp.c
76daa3
index a744e44..847b13f 100644
76daa3
--- a/qmp.c
76daa3
+++ b/qmp.c
76daa3
@@ -196,15 +196,15 @@ void qmp_cont(Error **errp)
76daa3
     }
76daa3
 
76daa3
     /* Continuing after completed migration. Images have been inactivated to
76daa3
-     * allow the destination to take control. Need to get control back now. */
76daa3
-    if (runstate_check(RUN_STATE_FINISH_MIGRATE) ||
76daa3
-        runstate_check(RUN_STATE_POSTMIGRATE))
76daa3
-    {
76daa3
-        bdrv_invalidate_cache_all(&local_err);
76daa3
-        if (local_err) {
76daa3
-            error_propagate(errp, local_err);
76daa3
-            return;
76daa3
-        }
76daa3
+     * allow the destination to take control. Need to get control back now.
76daa3
+     *
76daa3
+     * If there are no inactive block nodes (e.g. because the VM was just
76daa3
+     * paused rather than completing a migration), bdrv_inactivate_all() simply
76daa3
+     * doesn't do anything. */
76daa3
+    bdrv_invalidate_cache_all(&local_err);
76daa3
+    if (local_err) {
76daa3
+        error_propagate(errp, local_err);
76daa3
+        return;
76daa3
     }
76daa3
 
76daa3
     blk_resume_after_migration(&local_err);
76daa3
-- 
76daa3
1.8.3.1
76daa3