mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
9ab42c93ae
commit
c5c5a04094
3 files changed
+42
-3
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 )
|
||||
|
||||