libxc/restore: split read/handle qemu info

Split read/handle qemu info. The receiving of qemu info
should be done while we receive the migration stream,
handle_qemu will be called when the stream complete.
Otherwise, it will break Remus because read_record()
won't read qemu info and stream_complete will be called
at failover.

Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Yang Hongyang authored and Ian Campbell committed 2015-05-14 13:04:15 +01:00
1 parent 9ab42c93ae
commit c5c5a04094
3 files changed
+42 -3

No files matched your search

+5
View File
@@ -288,6 +288,11 @@ struct xc_sr_context
/* HVM context blob. */
void *context;
size_t contextsz;
#ifdef XG_LIBXL_HVM_COMPAT
uint32_t qlen;
void *qbuf;
#endif
} restore;
};
} x86_hvm;
+12
View File
@@ -510,6 +510,9 @@ static int process_record(struct xc_sr_context *ctx, struct xc_sr_record *rec)
return rc;
}
#ifdef XG_LIBXL_HVM_COMPAT
extern int read_qemu(struct xc_sr_context *ctx);
#endif
/*
* Restore a domain.
*/
@@ -546,6 +549,15 @@ static int restore(struct xc_sr_context *ctx)
} while ( rec.type != REC_TYPE_END );
#ifdef XG_LIBXL_HVM_COMPAT
if ( ctx->dominfo.hvm )
{
rc = read_qemu(ctx);
if ( rc )
goto err;
}
#endif
rc = ctx->restore.ops.stream_complete(ctx);
if ( rc )
goto err;
+25 -3
View File
@@ -94,14 +94,14 @@ static int handle_hvm_params(struct xc_sr_context *ctx,
}
#ifdef XG_LIBXL_HVM_COMPAT
static int handle_qemu(struct xc_sr_context *ctx)
int read_qemu(struct xc_sr_context *ctx);
int read_qemu(struct xc_sr_context *ctx)
{
xc_interface *xch = ctx->xch;
char qemusig[21], path[256];
char qemusig[21];
uint32_t qlen;
void *qbuf = NULL;
int rc = -1;
FILE *fp = NULL;
if ( read_exact(ctx->fd, qemusig, sizeof(qemusig)) )
{
@@ -137,6 +137,28 @@ static int handle_qemu(struct xc_sr_context *ctx)
goto out;
}
/* With Remus, this could be read many times */
if ( ctx->x86_hvm.restore.qbuf )
free(ctx->x86_hvm.restore.qbuf);
ctx->x86_hvm.restore.qbuf = qbuf;
ctx->x86_hvm.restore.qlen = qlen;
rc = 0;
out:
if (rc)
free(qbuf);
return rc;
}
static int handle_qemu(struct xc_sr_context *ctx)
{
xc_interface *xch = ctx->xch;
char path[256];
uint32_t qlen = ctx->x86_hvm.restore.qlen;
void *qbuf = ctx->x86_hvm.restore.qbuf;
int rc = -1;
FILE *fp = NULL;
sprintf(path, XC_DEVICE_MODEL_RESTORE_FILE".%u", ctx->domid);
fp = fopen(path, "wb");
if ( !fp )
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.