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