# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1283883181 -3600
# Node ID 7fddb93779f78afb010f5f8f46c0d74c0be80824
# Parent a936b806eae10f53a3ca59cd5a62b5ce2b201e7a
libxc: restore: reset I/O fd to flags to back to state caller passed us
In particular this causes us to turn O_NONBLOCK back off if we set it.
The caller may continue to use the fd for it's own protocol needs and
may not be prepared to have it become non-blocking.
This probably only effects Remus now after my previous patch to signal
the last checkpoint, since a regular migration will no longer set the
fd non-blocking.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Brendan Cully <brendan@xxxxxxxxx>
Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
tools/libxc/xc_domain_restore.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diff -r a936b806eae1 -r 7fddb93779f7 tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c Tue Sep 07 19:08:11 2010 +0100
+++ b/tools/libxc/xc_domain_restore.c Tue Sep 07 19:13:01 2010 +0100
@@ -1094,6 +1094,8 @@ int xc_domain_restore(xc_interface *xch,
void* vcpup;
uint64_t console_pfn = 0;
+ int orig_io_fd_flags;
+
static struct restore_ctx _ctx = {
.live_p2m = NULL,
.p2m = NULL,
@@ -1110,6 +1112,11 @@ int xc_domain_restore(xc_interface *xch,
if ( superpages )
return 1;
+
+ if ( (orig_io_fd_flags = fcntl(io_fd, F_GETFL, 0)) < 0 ) {
+ PERROR("unable to read IO FD flags");
+ goto out;
+ }
if ( read_exact(io_fd, &dinfo->p2m_size, sizeof(unsigned long)) )
{
@@ -1294,7 +1301,6 @@ int xc_domain_restore(xc_interface *xch,
// DPRINTF("Received all pages (%d races)\n", nraces);
if ( !ctx->completed ) {
- int flags = 0;
if ( buffer_tail(xch, ctx, &tailbuf, io_fd, max_vcpu_id, vcpumap,
ext_vcpucontext) < 0 ) {
@@ -1308,11 +1314,7 @@ int xc_domain_restore(xc_interface *xch,
* nonblocking mode for the remainder.
*/
if ( !ctx->last_checkpoint )
- {
- if ( (flags = fcntl(io_fd, F_GETFL,0)) < 0 )
- flags = 0;
- fcntl(io_fd, F_SETFL, flags | O_NONBLOCK);
- }
+ fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
}
if ( ctx->last_checkpoint )
@@ -1805,8 +1807,10 @@ int xc_domain_restore(xc_interface *xch,
/* discard cache for save file */
discard_file_cache(xch, io_fd, 1 /*flush*/);
+ fcntl(io_fd, F_SETFL, orig_io_fd_flags);
+
DPRINTF("Restore exit with rc=%d\n", rc);
-
+
return rc;
}
/*
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|