0a122b
From 2f66e62873ef54bd27ec6e063c8b4f3f11e2413d Mon Sep 17 00:00:00 2001
0a122b
From: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
0a122b
Date: Mon, 10 Mar 2014 17:41:43 +0100
0a122b
Subject: [PATCH 15/16] qemu_file: use fwrite() correctly
0a122b
0a122b
RH-Author: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
0a122b
Message-id: <1394473304-7190-2-git-send-email-dgilbert@redhat.com>
0a122b
Patchwork-id: 58073
0a122b
O-Subject: [RHEL-7.0 qemu-kvm PATCH v2 1/2] qemu_file: use fwrite() correctly
0a122b
Bugzilla: 1005103
0a122b
RH-Acked-by: Juan Quintela <quintela@redhat.com>
0a122b
RH-Acked-by: Eric Blake <eblake@redhat.com>
0a122b
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
0a122b
0a122b
From: Juan Quintela <quintela@redhat.com>
0a122b
0a122b
fwrite() returns the number of items written.  But when there is one
0a122b
error, it can return a short write.
0a122b
0a122b
In the particular bug that I was tracking, I did a migration to a
0a122b
read-only filesystem.  And it was able to finish the migration
0a122b
correctly.  fwrite() never returned a negative error code, nor zero,
0a122b
always 4096. (migration writes chunks of about 14000 bytes).  And it
0a122b
was able to "complete" the migration with success (yes, reading the
0a122b
file was a bit more difficult).
0a122b
0a122b
To add insult to injury, if your amount of memory was big enough (12GB
0a122b
on my case), it overwrote some important structure, and from them,
0a122b
malloc failed.  This check makes the problem go away.
0a122b
0a122b
Signed-off-by: Juan Quintela <quintela@redhat.com>
0a122b
Reviewed-by: Eric Blake <eblake@redhat.com>
0a122b
Reviewed-by: Markus Armbruster <armbru@redhat.com>
0a122b
Signed-off-by: Juan Quintela <quintela@redhat.com>
0a122b
(cherry picked from commit aded6539d983280212e08d09f14157b1cb4d58cc)
0a122b
0a122b
Conflicts:
0a122b
	qemu-file.c
0a122b
0a122b
Code still in savevm.c
0a122b
---
0a122b
 savevm.c | 9 ++++++++-
0a122b
 1 file changed, 8 insertions(+), 1 deletion(-)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 savevm.c |    9 ++++++++-
0a122b
 1 files changed, 8 insertions(+), 1 deletions(-)
0a122b
0a122b
diff --git a/savevm.c b/savevm.c
0a122b
index bd37959..94121a2 100644
0a122b
--- a/savevm.c
0a122b
+++ b/savevm.c
0a122b
@@ -211,7 +211,14 @@ static int stdio_get_fd(void *opaque)
0a122b
 static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
0a122b
 {
0a122b
     QEMUFileStdio *s = opaque;
0a122b
-    return fwrite(buf, 1, size, s->stdio_file);
0a122b
+    int res;
0a122b
+
0a122b
+    res = fwrite(buf, 1, size, s->stdio_file);
0a122b
+
0a122b
+    if (res != size) {
0a122b
+        return -EIO;	/* fake errno value */
0a122b
+    }
0a122b
+    return res;
0a122b
 }
0a122b
 
0a122b
 static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
0a122b
-- 
0a122b
1.7.1
0a122b