72 lines
2.2 KiB
Diff
72 lines
2.2 KiB
Diff
|
From 06400ebc136bf44f1fa423159fae9cc9a4f6839d Mon Sep 17 00:00:00 2001
|
||
|
From: Gerd Hoffmann <kraxel@redhat.com>
|
||
|
Date: Thu, 27 Oct 2011 09:12:04 +0200
|
||
|
Subject: [PATCH] migration: flush migration data to disk.
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
This patch increases robustness when migrating to a file with
|
||
|
two little changes:
|
||
|
|
||
|
(1) Before closing the migration file handle checks if it happens to be
|
||
|
a regular file and if so it issues a fsync. This way the data is
|
||
|
flushed to disk before qemu sends the migration completed event.
|
||
|
(2) It adds error checking. In case either fsync or close syscall
|
||
|
fails pass up the error (and fail migration).
|
||
|
|
||
|
[ v2: return -errno instead of -1 ]
|
||
|
|
||
|
Cc: Juan Quintela <quintela@redhat.com>
|
||
|
Cc: Jiri Denemark <jdenemar@redhat.com>
|
||
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||
|
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
|
||
|
(cherry picked from commit aab2293687ee54a409f3fb53a1ab3595b595e0fb)
|
||
|
|
||
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||
|
---
|
||
|
migration-fd.c | 23 ++++++++++++++++++++++-
|
||
|
1 file changed, 22 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/migration-fd.c b/migration-fd.c
|
||
|
index 66d51c1..f986bdf 100644
|
||
|
--- a/migration-fd.c
|
||
|
+++ b/migration-fd.c
|
||
|
@@ -42,10 +42,31 @@ static int fd_write(FdMigrationState *s, const void * buf, size_t size)
|
||
|
|
||
|
static int fd_close(FdMigrationState *s)
|
||
|
{
|
||
|
+ struct stat st;
|
||
|
+ int ret;
|
||
|
+
|
||
|
DPRINTF("fd_close\n");
|
||
|
if (s->fd != -1) {
|
||
|
- close(s->fd);
|
||
|
+ ret = fstat(s->fd, &st);
|
||
|
+ if (ret == 0 && S_ISREG(st.st_mode)) {
|
||
|
+ /*
|
||
|
+ * If the file handle is a regular file make sure the
|
||
|
+ * data is flushed to disk before signaling success.
|
||
|
+ */
|
||
|
+ ret = fsync(s->fd);
|
||
|
+ if (ret != 0) {
|
||
|
+ ret = -errno;
|
||
|
+ perror("migration-fd: fsync");
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ ret = close(s->fd);
|
||
|
s->fd = -1;
|
||
|
+ if (ret != 0) {
|
||
|
+ ret = -errno;
|
||
|
+ perror("migration-fd: close");
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
--
|
||
|
1.7.11.2
|
||
|
|