Blame SOURCES/0021-Migration-compat-for-fdc.patch

383d26
From 81b63caf259fac3ec0906f6d7712a831206d0dd5 Mon Sep 17 00:00:00 2001
383d26
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
383d26
Date: Fri, 26 Jun 2015 16:19:47 +0200
383d26
Subject: Migration compat for fdc
383d26
383d26
Patchwork-id: 66534
383d26
O-Subject: [RHEL-7.2 qemu-kvm-rhev PATCH 1/1] Migration compat for fdc
383d26
Bugzilla: 1215091
383d26
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
383d26
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
383d26
RH-Acked-by: Juan Quintela <quintela@redhat.com>
383d26
383d26
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
383d26
383d26
2.2 added some sections into the fdc and floppy drive, this patch
383d26
disables those new sections for reverse migration compatibility.
383d26
383d26
There are three pieces of data added to the migration:
383d26
   1) 'perpendicular mode' on the drive - i.e. 2.88MB mode, that
383d26
      was rare as hens teeth and the flag isn't actually used anywhere.
383d26
383d26
   2) fdc_reset_sensei
383d26
      This relates to the state of the fdc just after a reset command;
383d26
      the fdc produces four 'sense' states internally (corresponding to
383d26
      one external interrupt) that is there for backwards compatibility
383d26
      to an older fdc (and to 8" drives!!).  This compatibility code
383d26
      was added to qemu to fix SCO Openserver floppy problems, ~2009.
383d26
      Migration just after an fdc-reset would get the initial interrupt
383d26
      but lose the extra 3 sense states.  Print a log message since
383d26
      that's guest visible, but it's not knowingly caused us a problem
383d26
      so don't fail migration.
383d26
383d26
   3) result-timer
383d26
      The emulation models a delay after the 'read id' command which
383d26
      is handled by a timer; if we migrate before the timer goes off
383d26
      we probably wont complete the command.
383d26
      I'm worried that the most likely time that a 'read id' would be
383d26
      used would be in a background probe to see if there's a floppy
383d26
      present, so again, don't fail the migrate, but do print a log
383d26
      message.  With any luck any sane floppy driver will have a
383d26
      timeout; if we hit problems then a work around would be to
383d26
      make the pre-save mark the command as finished with error.
383d26
383d26
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
383d26
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
383d26
(cherry picked from commit b18d89c56aa26e86fb6194f77a15a72244d5ff88)
383d26
(cherry picked from commit 50613448205a2e85e90a488be1c83d0f2b5f2d52)
383d26
(cherry picked from commit 5bdbc1fe6b4574c78c80e664c539c51d7719f84d)
383d26
(cherry picked from commit 069889e404721c5439ee7d69aa90f9d4580f4f21)
383d26
(cherry picked from commit fd31805201e8da37645c5a34f7990a281afce10f)
383d26
---
383d26
 hw/block/fdc.c | 39 +++++++++++++++++++++++++++++++++++++--
383d26
 1 file changed, 37 insertions(+), 2 deletions(-)
383d26
383d26
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
383d26
index 3964096..6943263 100644
383d26
--- a/hw/block/fdc.c
383d26
+++ b/hw/block/fdc.c
383d26
@@ -36,6 +36,7 @@
383d26
 #include "hw/isa/isa.h"
383d26
 #include "hw/sysbus.h"
383d26
 #include "hw/block/block.h"
383d26
+#include "migration/migration.h"
383d26
 #include "sysemu/block-backend.h"
383d26
 #include "sysemu/blockdev.h"
383d26
 #include "sysemu/sysemu.h"
383d26
@@ -1036,6 +1037,10 @@ static bool fdrive_perpendicular_needed(void *opaque)
383d26
 {
383d26
     FDrive *drive = opaque;
383d26
 
383d26
+    if (migrate_pre_2_2) {
383d26
+        return false;
383d26
+    }
383d26
+
383d26
     return drive->perpendicular != 0;
383d26
 }
383d26
 
383d26
@@ -1130,8 +1135,20 @@ static int fdc_post_load(void *opaque, int version_id)
383d26
 static bool fdc_reset_sensei_needed(void *opaque)
383d26
 {
383d26
     FDCtrl *s = opaque;
383d26
+    bool needed = s->reset_sensei != 0;
383d26
+
383d26
+    if (migrate_pre_2_2) {
383d26
+        /*
383d26
+         * This probably wont matter for most OSs, but it's good to log
383d26
+         * it just incase we find it causes problems.
383d26
+         */
383d26
+        if (needed) {
383d26
+            error_report("INFO: fdc migration just after reset (sensei!=0)");
383d26
+        }
383d26
+        return false;
383d26
+    }
383d26
 
383d26
-    return s->reset_sensei != 0;
383d26
+    return needed;
383d26
 }
383d26
 
383d26
 static const VMStateDescription vmstate_fdc_reset_sensei = {
383d26
@@ -1148,8 +1165,26 @@ static const VMStateDescription vmstate_fdc_reset_sensei = {
383d26
 static bool fdc_result_timer_needed(void *opaque)
383d26
 {
383d26
     FDCtrl *s = opaque;
383d26
+    bool needed = timer_pending(s->result_timer);
383d26
+
383d26
+    if (migrate_pre_2_2) {
383d26
+        /*
383d26
+         * This could upset some OSs if their read-id command doesn't
383d26
+         * complete, so lets log something.
383d26
+         */
383d26
+        if (needed) {
383d26
+            error_report("INFO: fdc migration just after read-id (timer!=0)");
383d26
+        }
383d26
+        /*
383d26
+         * However, since it's not apparently caused us problems for many
383d26
+         * years, don't fail the migration, especially as this could
383d26
+         * happen as part of a background drive-probe which if it fails
383d26
+         * won't be a problem.
383d26
+         */
383d26
+        return false;
383d26
+    }
383d26
 
383d26
-    return timer_pending(s->result_timer);
383d26
+    return needed;
383d26
 }
383d26
 
383d26
 static const VMStateDescription vmstate_fdc_result_timer = {
383d26
-- 
383d26
1.8.3.1
383d26