abf8af324b
- Include systemd presets in 13.2 and older - bnc#897352 - Enable xencommons/xendomains only during fresh install - disable restart on upgrade because the toolstack is not restartable - adjust seabios, vgabios, stubdom and hvmloader build to reduce build-compare noise xen.build-compare.mini-os.patch xen.build-compare.smbiosdate.patch xen.build-compare.ipxe.patch xen.build-compare.vgabios.patch xen.build-compare.seabios.patch xen.build-compare.man.patch - Update to Xen 4.5.0 RC4 - Remove xend specific if-up scripts Recording bridge slaves is a generic task which should be handled by generic network code - Use systemd features from upstream requires updated systemd-presets-branding package - Update to Xen 4.5.0 RC3 - Set GIT, WGET and FTP to /bin/false - Use new configure features instead of make variables OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=337
98 lines
3.4 KiB
Diff
98 lines
3.4 KiB
Diff
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
|
===================================================================
|
|
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
|
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
|
@@ -18,6 +18,7 @@
|
|
#include "exec-all.h"
|
|
#include "sysemu.h"
|
|
|
|
+#include "console.h"
|
|
#include "hw.h"
|
|
#include "pci.h"
|
|
#include "qemu-timer.h"
|
|
@@ -604,6 +605,21 @@ void xenstore_parse_domain_config(int hv
|
|
#endif
|
|
|
|
bs = bdrv_new(dev);
|
|
+
|
|
+ /* if cdrom physical put a watch on media-present */
|
|
+ if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
|
|
+ if (drv && !strcmp(drv, "phy")) {
|
|
+ if (pasprintf(&buf, "%s/media-present", bpath) != -1) {
|
|
+ if (bdrv_is_inserted(bs))
|
|
+ xs_write(xsh, XBT_NULL, buf, "1", strlen("1"));
|
|
+ else {
|
|
+ xs_write(xsh, XBT_NULL, buf, "0", strlen("0"));
|
|
+ }
|
|
+ xs_watch(xsh, buf, "media-present");
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
/* check if it is a cdrom */
|
|
if (danger_type && !strcmp(danger_type, "cdrom")) {
|
|
bdrv_set_type_hint(bs, BDRV_TYPE_CDROM);
|
|
@@ -1095,6 +1111,50 @@ static void xenstore_process_vcpu_set_ev
|
|
return;
|
|
}
|
|
|
|
+static void xenstore_process_media_change_event(char **vec)
|
|
+{
|
|
+ char *media_present = NULL;
|
|
+ unsigned int len;
|
|
+
|
|
+ media_present = xs_read(xsh, XBT_NULL, vec[XS_WATCH_PATH], &len);
|
|
+
|
|
+ if (media_present) {
|
|
+ BlockDriverState *bs;
|
|
+ char *buf = NULL, *cp = NULL, *path = NULL, *dev = NULL;
|
|
+
|
|
+ path = strdup(vec[XS_WATCH_PATH]);
|
|
+ cp = strstr(path, "media-present");
|
|
+ if (cp){
|
|
+ *(cp-1) = '\0';
|
|
+ pasprintf(&buf, "%s/dev", path);
|
|
+ dev = xs_read(xsh, XBT_NULL, buf, &len);
|
|
+ if (dev) {
|
|
+ if ( !strncmp(dev, "xvd", 3)) {
|
|
+ memmove(dev, dev+1, strlen(dev));
|
|
+ dev[0] = 'h';
|
|
+ dev[1] = 'd';
|
|
+ }
|
|
+ bs = bdrv_find(dev);
|
|
+ if (!bs) {
|
|
+ term_printf("device not found\n");
|
|
+ return;
|
|
+ }
|
|
+ if (strcmp(media_present, "0") == 0 && bs) {
|
|
+ bdrv_close(bs);
|
|
+ }
|
|
+ else if (strcmp(media_present, "1") == 0 &&
|
|
+ bs != NULL && bs->drv == NULL) {
|
|
+ if (bdrv_open(bs, bs->filename, 0 /* snapshot */) < 0) {
|
|
+ fprintf(logfile, "%s() qemu: could not open cdrom disk '%s'\n",
|
|
+ __func__, bs->filename);
|
|
+ }
|
|
+ bs->media_changed = 1;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
void xenstore_process_event(void *opaque)
|
|
{
|
|
char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL;
|
|
@@ -1130,6 +1190,11 @@ void xenstore_process_event(void *opaque
|
|
xenstore_watch_callbacks[i].cb(vec[XS_WATCH_TOKEN],
|
|
xenstore_watch_callbacks[i].opaque);
|
|
|
|
+ if (!strcmp(vec[XS_WATCH_TOKEN], "media-present")) {
|
|
+ xenstore_process_media_change_event(vec);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
hd_index = drive_name_to_index(vec[XS_WATCH_TOKEN]);
|
|
if (hd_index == -1) {
|
|
fprintf(stderr,"medium change watch on `%s' -"
|