[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.4-testing] blktap: Fix check_sharing() in blktapctrl
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1256290271 -3600 # Node ID 1e097d7134fc2ac6282b5767ac3bc3d0554d2c38 # Parent 2d8e3fca36df6dc0ba3d14d753f64c66d4763a72 blktap: Fix check_sharing() in blktapctrl check_sharing() in blktapctrl does not work. - It accesses to xenstore by using wrong paths. - It compares image paths including image types. - It misjudges a return value of strcmp(). This patch fixes those mistakes. Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx> xen-unstable changeset: 20357:c7381d04e2b3 xen-unstable date: Fri Oct 23 10:02:09 2009 +0100 --- tools/blktap/lib/xenbus.c | 69 +++++++++++++++++++++++++++++++++------------- 1 files changed, 50 insertions(+), 19 deletions(-) diff -r 2d8e3fca36df -r 1e097d7134fc tools/blktap/lib/xenbus.c --- a/tools/blktap/lib/xenbus.c Fri Oct 23 10:28:57 2009 +0100 +++ b/tools/blktap/lib/xenbus.c Fri Oct 23 10:31:11 2009 +0100 @@ -107,6 +107,24 @@ static int get_be_id(const char *str) return atoi(num); } +static int get_be_domid(const char *str) +{ + int len1, len2; + const char *ptr; + char *tptr, num[10]; + + len2 = strsep_len(str, '/', 3); + if ( len2 < 0 ) return -1; + len1 = strsep_len(str, '/', 2); + + ptr = str + len1 + 1; + strncpy(num, ptr, len2 - len1 - 1); + tptr = num + (len2 - len1 - 1); + *tptr = '\0'; + + return atoi(num); +} + static struct backend_info *be_lookup_be(const char *bepath) { struct backend_info *be; @@ -148,6 +166,24 @@ static int backend_remove(struct xs_hand free(be->backpath); free(be); return 0; +} + +static const char *get_image_path(const char *path) +{ + const char *tmp; + + /* Strip off the image type */ + if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) { + path += strlen("tapdisk:"); + } else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) { + path += strlen("ioemu:"); + } + + tmp = strchr(path, ':'); + if (tmp != NULL) + path = tmp + 1; + + return path; } static int check_sharing(struct xs_handle *h, struct backend_info *be) @@ -161,8 +197,12 @@ static int check_sharing(struct xs_handl char **devices; int i, j; unsigned int num_dom, num_dev; - blkif_info_t *info; + blkif_info_t *info = be->blkif->info; int ret = 0; + const char *image_path[2]; + int be_domid = get_be_domid(be->backpath); + + image_path[0] = get_image_path(info->params); /* If the mode contains '!' or doesn't contain 'w' don't check anything */ xs_gather(h, be->backpath, "mode", NULL, &mode, NULL); @@ -178,7 +218,10 @@ static int check_sharing(struct xs_handl free(path); /* Iterate through the devices of all VMs */ - domains = xs_directory(h, XBT_NULL, "backend/tap", &num_dom); + if (asprintf(&path, "/local/domain/%d/backend/tap", be_domid) == -1) + goto fail; + domains = xs_directory(h, XBT_NULL, path, &num_dom); + free(path); if (domains == NULL) num_dom = 0; @@ -198,7 +241,7 @@ static int check_sharing(struct xs_handl } /* Check the devices */ - if (asprintf(&path, "backend/tap/%s", domains[i]) == -1) { + if (asprintf(&path, "/local/domain/%d/backend/tap/%s", be_domid, domains[i]) == -1) { ret = -1; free(cur_dom_uuid); break; @@ -209,15 +252,15 @@ static int check_sharing(struct xs_handl free(path); for (j = 0; !ret && (j < num_dev); j++) { - if (asprintf(&path, "backend/tap/%s/%s", domains[i], devices[j]) == -1) { + if (asprintf(&path, "/local/domain/%d/backend/tap/%s/%s", be_domid, domains[i], devices[j]) == -1) { ret = -1; break; } xs_gather(h, path, "params", NULL, ¶ms, NULL); free(path); - info = be->blkif->info; - if (strcmp(params, info->params)) { + image_path[1] = get_image_path(params); + if (!strcmp(image_path[0], image_path[1])) { ret = -1; } @@ -241,24 +284,12 @@ static int check_image(struct xs_handle static int check_image(struct xs_handle *h, struct backend_info *be, const char** errmsg) { - const char *tmp; const char *path; int mode; blkif_t *blkif = be->blkif; blkif_info_t *info = blkif->info; - /* Strip off the image type */ - path = info->params; - - if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) { - path += strlen("tapdisk:"); - } else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) { - path += strlen("ioemu:"); - } - - tmp = strchr(path, ':'); - if (tmp != NULL) - path = tmp + 1; + path = get_image_path(info->params); /* Check if the image exists and access is permitted */ mode = R_OK; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |