[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 12/15] get_overlay: remove domU overlay
From: Vikram Garhwal <fnu.vikram@xxxxxxxxxx> Retrieve 4 new parameters from xenstore: overlay name, type, whether it is a partial overlay and operation. Operation can be "add" or "remove". Add correspond to existing mode of operation. Remove introduces support for removing an overlay from a domU. Signed-off-by: Vikram Garhwal <fnu.vikram@xxxxxxxxxx> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> Signed-off-by: Henry Wang <xin.wang2@xxxxxxx> --- tools/helpers/get_overlay.c | 132 +++++++++++++++++++++++++++++++++--- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/tools/helpers/get_overlay.c b/tools/helpers/get_overlay.c index ca3007570e..daa697ca04 100644 --- a/tools/helpers/get_overlay.c +++ b/tools/helpers/get_overlay.c @@ -66,6 +66,33 @@ retry_transaction: snprintf(ref, sizeof(ref), "%s", "not_ready"); snprintf(buf, sizeof(buf), "%s/sender-status", xs_base); + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + goto fail_xs_transaction; + if (!xs_set_permissions(xs, xs_trans, buf, perms, 2)) + goto fail_xs_transaction; + + /* Create overlay-name node. */ + snprintf(ref, sizeof(ref), "%s", "overlay_node"); + snprintf(buf, sizeof(buf), "%s/overlay-name", xs_base); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + goto fail_xs_transaction; + if (!xs_set_permissions(xs, xs_trans, buf, perms, 2)) + goto fail_xs_transaction; + + /* Create overlay-type node. */ + snprintf(ref, sizeof(ref), "%s", "type"); + snprintf(buf, sizeof(buf), "%s/overlay-type", xs_base); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + goto fail_xs_transaction; + if (!xs_set_permissions(xs, xs_trans, buf, perms, 2)) + goto fail_xs_transaction; + + /* Create overlay-partial node. */ + snprintf(ref, sizeof(ref), "%d", 0); + snprintf(buf, sizeof(buf), "%s/overlay-partial", xs_base); + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) goto fail_xs_transaction; if (!xs_set_permissions(xs, xs_trans, buf, perms, 2)) @@ -174,7 +201,7 @@ static bool wait_for_status(struct xs_handle *xs, int fd, char *status_path, } static bool write_page_ref(struct xs_handle *xs, uint32_t *page_ref, - uint32_t num_pages, char *path) + uint32_t num_pages, const char *path) { xs_transaction_t xs_trans = XBT_NULL; char buf[128]; @@ -249,12 +276,69 @@ retry_transaction: return true; } +static char *get_overlay_ops(struct xs_handle *xs, const char *xs_path) +{ + char buf[128]; + char *ref = NULL; + unsigned int len; + + snprintf(buf, sizeof(buf), "%s/overlay-operation", xs_path); + + ref = xs_read(xs, XBT_NULL, buf, &len); + + return ref; +} +static char *get_overlay_name(struct xs_handle *xs, const char *xs_path) +{ + char buf[128]; + char *ref = NULL; + unsigned int len; + + snprintf(buf, sizeof(buf), "%s/overlay-name", xs_path); + + ref = xs_read(xs, XBT_NULL, buf, &len); + + return ref; +} + +static char *get_overlay_type(struct xs_handle *xs, const char *xs_path) +{ + char buf[128]; + char *ref = NULL; + unsigned int len; + + snprintf(buf, sizeof(buf), "%s/overlay-type", xs_path); + + ref = xs_read(xs, XBT_NULL, buf, &len); + + return ref; +} + +static bool get_overlay_partial(struct xs_handle *xs, const char *xs_path) +{ + char buf[128]; + char *ref = NULL; + unsigned int len; + + snprintf(buf, sizeof(buf), "%s/overlay-partial", xs_path); + + ref = xs_read(xs, XBT_NULL, buf, &len); + + if (ref) { + bool is_partial = atoi(ref); + free(ref); + return is_partial; + } + + return false; +} + int main(int argc, char **argv) { void *buffer = NULL; int domain ; uint32_t *page_refs = NULL; - FILE *fptr; + FILE *fptr = NULL; int dtbo_size = 0; const char *path = "data/overlay"; char receiver_status_path[64] = { }; @@ -263,7 +347,11 @@ int main(int argc, char **argv) int rc = 0; int fd = 0; uint32_t num_pages = 0; - xengntshr_handle *gntshr; + xengntshr_handle *gntshr = NULL; + char *overlay_ops = NULL; + char *name = NULL; + char *type = NULL; + bool is_partial = false; if (argc < 2) { fprintf(stderr,"Please enter domain_id.\n"); @@ -357,16 +445,33 @@ int main(int argc, char **argv) goto out; } - if ((fptr = fopen("overlay.dtbo","wb")) == NULL) { - fprintf(stderr,"Error! opening file"); + overlay_ops = get_overlay_ops(xs, path); + name = get_overlay_name(xs, path); + type = get_overlay_type(xs, path); + is_partial = get_overlay_partial(xs, path); + + if (overlay_ops == NULL || name == NULL || type == NULL) goto out; - } - printf("Writing to file overlay.dtbo.\n"); + printf("%s %s %s", overlay_ops, name, type); + if (is_partial) + printf(" %d", is_partial); + + printf("\n"); - fwrite(buffer, dtbo_size, 1, fptr); + if (!strcmp(overlay_ops, "add")) { - printf("Done writing to file overlay.dtbo \n"); + if ((fptr = fopen("overlay.dtbo","wb")) == NULL) { + fprintf(stderr,"Error! opening file"); + goto out; + } + + printf("Writing to file overlay.dtbo.\n"); + + fwrite(buffer, dtbo_size, 1, fptr); + + printf("Done writing to file overlay.dtbo \n"); + } out: if (fptr) @@ -375,6 +480,15 @@ out: if (page_refs) free(page_refs); + if (overlay_ops) + free(overlay_ops); + + if (name) + free(name); + + if (type) + free(type); + if (xs) { close(fd); -- 2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |