File xen.libxl.dmmd.patch of Package xen.23267
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.14.2-testing/tools/libxl/libxl_disk.c
===================================================================
--- xen-4.14.2-testing.orig/tools/libxl/libxl_disk.c
+++ xen-4.14.2-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.14.2-testing/tools/libxl/libxl_device.c
===================================================================
--- xen-4.14.2-testing.orig/tools/libxl/libxl_device.c
+++ xen-4.14.2-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.14.2-testing/tools/libxl/libxl_dm.c
===================================================================
--- xen-4.14.2-testing.orig/tools/libxl/libxl_dm.c
+++ xen-4.14.2-testing/tools/libxl/libxl_dm.c
@@ -1182,6 +1182,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,
@@ -1849,9 +1873,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.14.2-testing/tools/libxl/libxlu_disk_l.l
===================================================================
--- xen-4.14.2-testing.orig/tools/libxl/libxlu_disk_l.l
+++ xen-4.14.2-testing/tools/libxl/libxlu_disk_l.l
@@ -241,6 +241,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.14.2-testing/tools/libxl/libxl_internal.h
===================================================================
--- xen-4.14.2-testing.orig/tools/libxl/libxl_internal.h
+++ xen-4.14.2-testing/tools/libxl/libxl_internal.h
@@ -2067,6 +2067,10 @@ _hidden char *libxl__object_to_json(libx
_hidden void libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid, bool retore,
libxl_domain_build_info *info);
+_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);