From 15116f1c254a8aa7774e2f73a3e1340a6decd867 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Tue, 7 Aug 2012 14:26:29 +0100 Subject: [PATCH] libxl: write physical-device node if user did not supply a block script This reverts one of the intentional changes from 25733:353bc0801b11. That change exposed an issue with the xl migration protocol, which although safe triggers the hotplug scripts device sharing logic. For 4.2 we disable this logic by writing the physical-device xenstore node ourselves if a user did not supply a script. If the user did supply a script then we continue to rely on it to write the physical-device node (not least because the script may create the device and therefore it is not available before we run the script). This means that to support localhost migration a block hotplug script needs to be robust against adding a device twice and should not deactivate the device until it has been removed twice. This should be revisited for 4.3. Signed-off-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Campbell --- tools/libxl/libxl.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index cab41ed163..8ea34788bf 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1845,18 +1845,31 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, case LIBXL_DISK_BACKEND_PHY: dev = disk->pdev_path; - script = libxl__abs_path(gc, disk->script ?: "block", - libxl__xen_script_dir_path()); - do_backend_phy: flexarray_append(back, "params"); flexarray_append(back, dev); - assert(script); + script = libxl__abs_path(gc, disk->script?: "block", + libxl__xen_script_dir_path()); flexarray_append_pair(back, "script", script); + /* If the user did not supply a block script then we + * write the physical-device node ourselves. + * + * If the user did supply a script then that script is + * responsible for this since the block device may not + * exist yet. + */ + if (!disk->script) { + int major, minor; + libxl__device_physdisk_major_minor(dev, &major, &minor); + flexarray_append_pair(back, "physical-device", + libxl__sprintf(gc, "%x:%x", major, minor)); + } + assert(device->backend_kind == LIBXL__DEVICE_KIND_VBD); break; + case LIBXL_DISK_BACKEND_TAP: dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format); if (!dev) { @@ -1870,12 +1883,9 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); - /* - * tap devices do not support custom block scripts and - * always use the plain block script. - */ - script = libxl__abs_path(gc, "block", - libxl__xen_script_dir_path()); + /* tap backends with scripts are rejected by + * libxl__device_disk_set_backend */ + assert(!disk->script); /* now create a phy device to export the device to the guest */ goto do_backend_phy; -- 2.30.2