Skip to content

Commit

Permalink
libxc/restore: introduce setup() and cleanup() on restore
Browse files Browse the repository at this point in the history
introduce setup() and cleanup() which subsume the
ctx->restore.ops.{setup,cleanup}() calls and also
do memory alloc/free.

Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Campbell <Ian.Campbell@citrix.com>
  • Loading branch information
macrosheep authored and Ian Campbell committed May 14, 2015
1 parent c5c5a04 commit ce44b40
Showing 1 changed file with 34 additions and 14 deletions.
48 changes: 34 additions & 14 deletions tools/libxc/xc_sr_restore.c
Expand Up @@ -510,6 +510,38 @@ static int process_record(struct xc_sr_context *ctx, struct xc_sr_record *rec)
return rc;
}

static int setup(struct xc_sr_context *ctx)
{
xc_interface *xch = ctx->xch;
int rc;

rc = ctx->restore.ops.setup(ctx);
if ( rc )
goto err;

ctx->restore.max_populated_pfn = (32 * 1024 / 4) - 1;
ctx->restore.populated_pfns = bitmap_alloc(
ctx->restore.max_populated_pfn + 1);
if ( !ctx->restore.populated_pfns )
{
ERROR("Unable to allocate memory for populated_pfns bitmap");
rc = -1;
goto err;
}

err:
return rc;
}

static void cleanup(struct xc_sr_context *ctx)
{
xc_interface *xch = ctx->xch;

free(ctx->restore.populated_pfns);
if ( ctx->restore.ops.cleanup(ctx) )
PERROR("Failed to clean up");
}

#ifdef XG_LIBXL_HVM_COMPAT
extern int read_qemu(struct xc_sr_context *ctx);
#endif
Expand All @@ -524,19 +556,10 @@ static int restore(struct xc_sr_context *ctx)

IPRINTF("Restoring domain");

rc = ctx->restore.ops.setup(ctx);
rc = setup(ctx);
if ( rc )
goto err;

ctx->restore.max_populated_pfn = (32 * 1024 / 4) - 1;
ctx->restore.populated_pfns = bitmap_alloc(
ctx->restore.max_populated_pfn + 1);
if ( !ctx->restore.populated_pfns )
{
ERROR("Unable to allocate memory for populated_pfns bitmap");
goto err;
}

do
{
rc = read_record(ctx, &rec);
Expand Down Expand Up @@ -571,10 +594,7 @@ static int restore(struct xc_sr_context *ctx)
PERROR("Restore failed");

done:
free(ctx->restore.populated_pfns);
rc = ctx->restore.ops.cleanup(ctx);
if ( rc )
PERROR("Failed to clean up");
cleanup(ctx);

if ( saved_rc )
{
Expand Down

0 comments on commit ce44b40

Please sign in to comment.