summaryrefslogtreecommitdiff
path: root/xen.libxl.dmmd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'xen.libxl.dmmd.patch')
-rw-r--r--xen.libxl.dmmd.patch135
1 files changed, 135 insertions, 0 deletions
diff --git a/xen.libxl.dmmd.patch b/xen.libxl.dmmd.patch
new file mode 100644
index 0000000..fef056a
--- /dev/null
+++ b/xen.libxl.dmmd.patch
@@ -0,0 +1,135 @@
+References: bsc#954872
+
+---
+ tools/libxl/libxl.c | 4 ++++
+ tools/libxl/libxl_device.c | 3 ++-
+ tools/libxl/libxl_dm.c | 34 +++++++++++++++++++++++++++++-----
+ tools/libxl/libxlu_disk_l.l | 2 ++
+ 4 files changed, 37 insertions(+), 6 deletions(-)
+
+Index: xen-4.13.0-testing/tools/libxl/libxl_disk.c
+===================================================================
+--- xen-4.13.0-testing.orig/tools/libxl/libxl_disk.c
++++ xen-4.13.0-testing/tools/libxl/libxl_disk.c
+@@ -178,7 +178,7 @@ static int libxl__device_disk_setdefault
+ return rc;
+ }
+
+-static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
++int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
+ const libxl_device_disk *disk,
+ libxl__device *device)
+ {
+@@ -336,6 +336,10 @@ static void device_disk_add(libxl__egc *
+ rc = ERROR_FAIL;
+ goto out;
+ case LIBXL_DISK_BACKEND_QDISK:
++ if (disk->script) {
++ script = libxl__abs_path(gc, disk->script, libxl__xen_script_dir_path());
++ flexarray_append_pair(back, "script", script);
++ }
+ flexarray_append(back, "params");
+ flexarray_append(back, GCSPRINTF("%s:%s",
+ libxl__device_disk_string_of_format(disk->format),
+Index: xen-4.13.0-testing/tools/libxl/libxl_device.c
+===================================================================
+--- xen-4.13.0-testing.orig/tools/libxl/libxl_device.c
++++ xen-4.13.0-testing/tools/libxl/libxl_device.c
+@@ -326,7 +326,8 @@ static int disk_try_backend(disk_try_bac
+ return 0;
+
+ case LIBXL_DISK_BACKEND_QDISK:
+- if (a->disk->script) goto bad_script;
++ LOG(DEBUG, "Disk vdev=%s, uses script=%s on %s backend",
++ a->disk->vdev, a->disk->script, libxl_disk_backend_to_string(backend));
+ return backend;
+
+ default:
+@@ -343,11 +344,6 @@ static int disk_try_backend(disk_try_bac
+ libxl_disk_format_to_string(a->disk->format));
+ return 0;
+
+- bad_script:
+- LOG(DEBUG, "Disk vdev=%s, backend %s not compatible with script=...",
+- a->disk->vdev, libxl_disk_backend_to_string(backend));
+- return 0;
+-
+ bad_colo:
+ LOG(DEBUG, "Disk vdev=%s, backend %s not compatible with colo",
+ a->disk->vdev, libxl_disk_backend_to_string(backend));
+Index: xen-4.13.0-testing/tools/libxl/libxl_dm.c
+===================================================================
+--- xen-4.13.0-testing.orig/tools/libxl/libxl_dm.c
++++ xen-4.13.0-testing/tools/libxl/libxl_dm.c
+@@ -1162,6 +1162,30 @@ out:
+ return rc;
+ }
+
++static void libxl__suse_node_to_path(libxl__gc *gc, int domid, const libxl_device_disk *dp, const char **pdev_path)
++{
++ libxl_ctx *ctx = libxl__gc_owner(gc);
++ char *be_path, *node;
++ libxl__device device;
++ libxl_device_disk disk;
++ int rc;
++
++ disk = *dp;
++ rc = libxl__device_from_disk(gc, domid, &disk, &device);
++ if (rc) {
++ LIBXL__LOG(ctx, LIBXL__LOG_WARNING, "libxl__device_from_disk failed %d", rc);
++ return;
++ }
++ be_path = libxl__device_backend_path(gc, &device);
++
++ node = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/node", be_path));
++ if (!node)
++ return;
++
++ LIBXL__LOG(ctx, LIBXL__LOG_WARNING, "replacing '%s' with '%s' from %s/node, just for qemu-xen", *pdev_path, node, be_path);
++ *pdev_path = node;
++}
++
+ static int libxl__build_device_model_args_new(libxl__gc *gc,
+ const char *dm, int guest_domid,
+ const libxl_domain_config *guest_config,
+@@ -1795,9 +1819,11 @@ static int libxl__build_device_model_arg
+ libxl__device_disk_dev_number(disks[i].vdev, &disk, &part);
+ const char *format;
+ char *drive;
+- const char *target_path = NULL;
++ const char *target_path = disks[i].pdev_path;
+ int colo_mode;
+
++ libxl__suse_node_to_path(gc, guest_domid, disks + i, &target_path);
++
+ if (dev_number == -1) {
+ LOGD(WARN, guest_domid, "unable to determine"" disk number for %s",
+ disks[i].vdev);
+Index: xen-4.13.0-testing/tools/libxl/libxlu_disk_l.l
+===================================================================
+--- xen-4.13.0-testing.orig/tools/libxl/libxlu_disk_l.l
++++ xen-4.13.0-testing/tools/libxl/libxlu_disk_l.l
+@@ -230,6 +230,8 @@ target=.* { STRIP(','); SAVESTRING("targ
+ free(newscript);
+ }
+
++dmmd:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); }
++npiv:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); }
+ tapdisk:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); }
+ tap2?:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); }
+ aio:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); }
+Index: xen-4.13.0-testing/tools/libxl/libxl_internal.h
+===================================================================
+--- xen-4.13.0-testing.orig/tools/libxl/libxl_internal.h
++++ xen-4.13.0-testing/tools/libxl/libxl_internal.h
+@@ -2042,6 +2042,10 @@ struct libxl__cpuid_policy {
+ char *policy[4];
+ };
+
++_hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
++ const libxl_device_disk *disk,
++ libxl__device *device);
++
+ /* Calls poll() again - useful to check whether a signaled condition
+ * is still true. Cannot fail. Returns currently-true revents. */
+ _hidden short libxl__fd_poll_recheck(libxl__egc *egc, int fd, short events);