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;
}
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++;
}
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]);
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);
}
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);
}