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.5-testing/tools/libxl/libxl_disk.c
===================================================================
--- xen-4.13.5-testing.orig/tools/libxl/libxl_disk.c
+++ xen-4.13.5-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)
 {
@@ -337,6 +337,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.5-testing/tools/libxl/libxl_device.c
===================================================================
--- xen-4.13.5-testing.orig/tools/libxl/libxl_device.c
+++ xen-4.13.5-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.5-testing/tools/libxl/libxl_dm.c
===================================================================
--- xen-4.13.5-testing.orig/tools/libxl/libxl_dm.c
+++ xen-4.13.5-testing/tools/libxl/libxl_dm.c
@@ -1165,6 +1165,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,
@@ -1798,9 +1822,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.5-testing/tools/libxl/libxlu_disk_l.l
===================================================================
--- xen-4.13.5-testing.orig/tools/libxl/libxlu_disk_l.l
+++ xen-4.13.5-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.5-testing/tools/libxl/libxl_internal.h
===================================================================
--- xen-4.13.5-testing.orig/tools/libxl/libxl_internal.h
+++ xen-4.13.5-testing/tools/libxl/libxl_internal.h
@@ -2043,6 +2043,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);
