diff options
author | Ian Campbell <Ian.Campbell@citrix.com> | 2012-08-07 14:26:29 +0100 |
---|---|---|
committer | Ian Campbell <Ian.Campbell@citrix.com> | 2012-08-07 14:26:29 +0100 |
commit | 15116f1c254a8aa7774e2f73a3e1340a6decd867 (patch) | |
tree | e37349ee5d97eac5a1e041f09f94a5b4162b2c64 | |
parent | 2a9fbb27320c7cdf0a58003c7e8d752def737ecd (diff) | |
download | xen-15116f1c254a8aa7774e2f73a3e1340a6decd867.tar.gz xen-15116f1c254a8aa7774e2f73a3e1340a6decd867.tar.bz2 xen-15116f1c254a8aa7774e2f73a3e1340a6decd867.zip |
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 <ian.campbell@citrix.com>
Acked-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 30 |
1 files 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; |