Stefano Stabellini
2009-Dec-07 15:56 UTC
[Xen-devel] [PATCH] qemu: fix cdrom changing code for stubdoms
Hi all, the current code to change a cdrom doesn''t work with stubdoms: - media_filename set at boot time doesn''t have the proper value (that in the stubdom case is the frontend path and not the filename); - when a cdrom watch event is triggered, the code to decide whether the new cdrom is valid and different from the current cdrom doesn''t work for stubdoms; both issues are fixed by this patch, in particular now media_filename consistently holds the frontend path for stubdoms while bs->filename holds the filename (like in the normal qemu case) to allow comparisons with the old cdrom filename. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- diff --git a/xenstore.c b/xenstore.c index 8ac478b..5064719 100644 --- a/xenstore.c +++ b/xenstore.c @@ -108,7 +108,23 @@ static void insert_media(void *opaque) format = &bdrv_raw; bdrv_open2(bs, media_filename[i], 0, format); +#ifdef CONFIG_STUBDOM + { + char *buf, *backend, *params_path, *params; + unsigned int len; + asprintf(&buf, "%s/backend", media_filename[i]); + backend = xs_read(xsh, XBT_NULL, buf, &len); + asprintf(¶ms_path, "%s/params", backend); + params = xs_read(xsh, XBT_NULL, params_path, &len); + pstrcpy(bs->filename, sizeof(bs->filename), params); + free(buf); + free(backend); + free(params_path); + free(params); + } +#else pstrcpy(bs->filename, sizeof(bs->filename), media_filename[i]); +#endif free(media_filename[i]); media_filename[i] = NULL; } @@ -555,6 +571,11 @@ void xenstore_parse_domain_config(int hvm_domid) drives_table[nb_drives].bdrv = bs; drives_table[nb_drives].used = 1; +#ifdef CONFIG_STUBDOM + media_filename[nb_drives] = strdup(danger_buf); +#else + media_filename[nb_drives] = strdup(bs->filename); +#endif nb_drives++; } @@ -931,6 +952,7 @@ void xenstore_process_event(void *opaque) fprintf(stderr,"medium change watch on `%s'' (index: %d): %s\n", vec[XS_WATCH_TOKEN], hd_index, image ? image : "<none>"); +#ifndef CONFIG_STUBDOM if (image != NULL) { /* Strip off blktap sub-type prefix */ bpath = strdup(vec[XS_WATCH_PATH]); @@ -947,6 +969,30 @@ void xenstore_process_event(void *opaque) if (!strcmp(image, drives_table[hd_index].bdrv->filename)) goto out; /* identical */ } +#else + { + char path[strlen(vec[XS_WATCH_PATH]) - 6 + 8]; + char *state; + path[0] = ''\0''; + strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6); + strcat(path, "state"); + state = xs_read(xsh, XBT_NULL, path, &len); + if (image && image[0] && state && atoi(state) <= 4) { + if (!strcmp(image, drives_table[hd_index].bdrv->filename)) + goto out; /* identical */ + path[0] = ''\0''; + strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6); + strcat(path, "frontend"); + free(image); + image = NULL; + image = xs_read(xsh, XBT_NULL, path, &len); + } else { + free(image); + image = NULL; + } + free(state); + } +#endif drives_table[hd_index].bdrv->filename[0] = ''\0''; bdrv_close(drives_table[hd_index].bdrv); @@ -956,15 +1002,7 @@ void xenstore_process_event(void *opaque) } if (image && image[0]) { -#ifdef CONFIG_STUBDOM - char path[strlen(vec[XS_WATCH_PATH]) - 6 + 8]; - path[0] = ''\0''; - strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6); - strcat(path, "frontend"); - media_filename[hd_index] = xs_read(xsh, XBT_NULL, path, &len); -#else media_filename[hd_index] = strdup(image); -#endif xenstore_check_new_media_present(5000); } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel