From f4f6601c7113ec33bd6bdcd15dc90edc61f9c781 Mon Sep 17 00:00:00 2001
From: Juan Quintela <quintela@redhat.com>
Date: Wed, 19 Oct 2011 23:47:46 +0200
Subject: [PATCH 11/19] migration: change has_error to contain errno values

RH-Author: Juan Quintela <quintela@redhat.com>
Message-id: <037aeb91fcba21674e0948a51074cc9a53be70af.1319066771.git.quintela@redhat.com>
Patchwork-id: 34436
O-Subject: [PATCH qemu-kvm RHEL-6.2 11/16] migration: change has_error to contain errno values
Bugzilla: 669581
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>
RH-Acked-by: Markus Armbruster <armbru@redhat.com>

We normally already have an errno value.  When not, abuse EIO.

Signed-off-by: Juan Quintela <quintela@redhat.com>

Conflicts:

	arch_init.c
	block-migration.c

block-migration: changed a lot, we don't use it anyways.
arch_init code is on vl.c on rhel6.
---
 block-migration.c |   11 ++++++-----
 buffered_file.c   |    4 ++--
 hw/hw.h           |    2 +-
 migration.c       |    2 +-
 savevm.c          |    8 ++++----
 vl.c              |    4 ++--
 6 files changed, 16 insertions(+), 15 deletions(-)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 block-migration.c |   11 ++++++-----
 buffered_file.c   |    4 ++--
 hw/hw.h           |    2 +-
 migration.c       |    2 +-
 savevm.c          |    8 ++++----
 vl.c              |    4 ++--
 6 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/block-migration.c b/block-migration.c
index 4233a3f..776df6d 100644
--- a/block-migration.c
+++ b/block-migration.c
@@ -203,7 +203,7 @@ static int mig_save_device_bulk(Monitor *mon, QEMUFile *f,
 
 error:
     monitor_printf(mon, "Error reading sector %" PRId64 "\n", cur_sector);
-    qemu_file_set_error(f);
+    qemu_file_set_error(f, -EIO);
     qemu_free(blk->buf);
     qemu_free(blk);
     return 0;
@@ -310,11 +310,12 @@ static void blk_mig_save_dirty_blocks(Monitor *mon, QEMUFile *f)
     QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
         for (sector = 0; sector < bmds->cur_sector;) {
             if (bdrv_get_dirty(bmds->bs, sector)) {
-                if (bdrv_read(bmds->bs, sector, blk.buf,
-                              BDRV_SECTORS_PER_DIRTY_CHUNK) < 0) {
+                int ret = bdrv_read(bmds->bs, sector, blk.buf,
+                                    BDRV_SECTORS_PER_DIRTY_CHUNK);
+                if (ret < 0) {
                     monitor_printf(mon, "Error reading sector %" PRId64 "\n",
                                    sector);
-                    qemu_file_set_error(f);
+                    qemu_file_set_error(f, ret);
                     qemu_free(blk.buf);
                     return;
                 }
@@ -345,7 +346,7 @@ static void flush_blks(QEMUFile* f)
             break;
         }
         if (blk->ret < 0) {
-            qemu_file_set_error(f);
+            qemu_file_set_error(f, blk->ret);
             break;
         }
         blk_send(f, blk);
diff --git a/buffered_file.c b/buffered_file.c
index fab9a41..a855a88 100644
--- a/buffered_file.c
+++ b/buffered_file.c
@@ -93,7 +93,7 @@ static void buffered_flush(QEMUFileBuffered *s)
 
         if (ret <= 0) {
             DPRINTF("error flushing data, %zd\n", ret);
-            qemu_file_set_error(s->file);
+            qemu_file_set_error(s->file, ret);
             break;
         } else {
             DPRINTF("flushed %zd byte(s)\n", ret);
@@ -139,7 +139,7 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in
 
         if (ret <= 0) {
             DPRINTF("error putting\n");
-            qemu_file_set_error(s->file);
+            qemu_file_set_error(s->file, ret);
             offset = -EINVAL;
             break;
         }
diff --git a/hw/hw.h b/hw/hw.h
index d535f23..aae4bb6 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -88,7 +88,7 @@ int qemu_file_rate_limit(QEMUFile *f);
 size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate);
 size_t qemu_file_get_rate_limit(QEMUFile *f);
 int qemu_file_has_error(QEMUFile *f);
-void qemu_file_set_error(QEMUFile *f);
+void qemu_file_set_error(QEMUFile *f, int error);
 
 /* Try to send any outstanding data.  This function is useful when output is
  * halted due to rate limiting or EAGAIN errors occur as it can be used to
diff --git a/migration.c b/migration.c
index e35cb41..f0e65a8 100644
--- a/migration.c
+++ b/migration.c
@@ -476,7 +476,7 @@ void migrate_fd_wait_for_unfreeze(void *opaque)
     } while (ret == -1 && (s->get_error(s)) == EINTR);
 
     if (ret == -1) {
-        qemu_file_set_error(s->file);
+        qemu_file_set_error(s->file, -s->get_error(s));
     }
 }
 
diff --git a/savevm.c b/savevm.c
index afa37a6..d5fd9cb 100644
--- a/savevm.c
+++ b/savevm.c
@@ -430,9 +430,9 @@ int qemu_file_has_error(QEMUFile *f)
     return f->has_error;
 }
 
-void qemu_file_set_error(QEMUFile *f)
+void qemu_file_set_error(QEMUFile *f, int ret)
 {
-    f->has_error = 1;
+    f->has_error = ret;
 }
 
 void qemu_fflush(QEMUFile *f)
@@ -447,7 +447,7 @@ void qemu_fflush(QEMUFile *f)
         if (len > 0)
             f->buf_offset += f->buf_index;
         else
-            f->has_error = 1;
+            f->has_error = -EINVAL;
         f->buf_index = 0;
     }
 }
@@ -476,7 +476,7 @@ static void qemu_fill_buffer(QEMUFile *f)
         f->buf_size += len;
         f->buf_offset += len;
     } else if (len != -EAGAIN)
-        f->has_error = 1;
+        f->has_error = len;
 }
 
 int qemu_fclose(QEMUFile *f)
diff --git a/vl.c b/vl.c
index 7906af0..fc0a57e 100644
--- a/vl.c
+++ b/vl.c
@@ -2840,7 +2840,7 @@ static int ram_save_block(QEMUFile *f)
             r = kvm_update_dirty_pages_log();
             if (r) {
                 fprintf(stderr, "%s: update dirty pages log failed %d\n", __FUNCTION__, r);
-                qemu_file_set_error(f);
+                qemu_file_set_error(f, -EINVAL);
                 return 0;
             }
         }
@@ -2936,7 +2936,7 @@ static int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
     }
 
     if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
-        qemu_file_set_error(f);
+        qemu_file_set_error(f, -EINVAL);
         return 0;
     }
 
-- 
1.7.4.4

