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@xxxxxxxxxxxxx>
---
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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|