From 673412bcc3724e4eb93c03160118675d1d57ac40 Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Fri, 26 Feb 2016 10:49:59 +0100 Subject: [PATCH 2/8] libxl: introduce an OS-specific function to get the physical-device MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Linux and NetBSD will return the device major and minor numbers encoded in hex and separated by a ":". FreeBSD on the other hand returns the path to the block device or image file. Signed-off-by: Roger Pau Monné --- Cc: Ian Jackson Cc: Ian Campbell Cc: Wei Liu --- tools/libxl/libxl.c | 9 +++++---- tools/libxl/libxl_freebsd.c | 6 ++++++ tools/libxl/libxl_internal.h | 6 ++++++ tools/libxl/libxl_linux.c | 10 ++++++++++ tools/libxl/libxl_netbsd.c | 10 ++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 312a371..069d5bd 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2469,10 +2469,11 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, */ if (!disk->script && disk->backend_domid == LIBXL_TOOLSTACK_DOMID) { - int major, minor; - libxl__device_physdisk_major_minor(dev, &major, &minor); - flexarray_append_pair(back, "physical-device", - libxl__sprintf(gc, "%x:%x", major, minor)); + char *physdev; + + physdev = libxl__get_physical_device(dev); + if (physdev != NULL) + flexarray_append_pair(back, "physical-device", physdev); } assert(device->backend_kind == LIBXL__DEVICE_KIND_VBD); diff --git a/tools/libxl/libxl_freebsd.c b/tools/libxl/libxl_freebsd.c index e8b88b3..290d1bf 100644 --- a/tools/libxl/libxl_freebsd.c +++ b/tools/libxl/libxl_freebsd.c @@ -131,3 +131,9 @@ libxl_device_model_version libxl__default_device_model(libxl__gc *gc) { return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; } + +char *libxl__get_physical_device(char *dev) +{ + + return dev; +} diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index ff88f3d..17e6139 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1182,6 +1182,12 @@ static inline void libxl__domaindeathcheck_stop(libxl__gc *gc, */ _hidden int libxl__try_phy_backend(mode_t st_mode); +/* + * Fetch the "physical-device" backend xenstore field for a local disk + * device. The implementation of this function is OS-specific. + */ +_hidden char *libxl__get_physical_device(char *dev); + _hidden char *libxl__devid_to_localdev(libxl__gc *gc, int devid); diff --git a/tools/libxl/libxl_linux.c b/tools/libxl/libxl_linux.c index ea5d8c1..02046fe 100644 --- a/tools/libxl/libxl_linux.c +++ b/tools/libxl/libxl_linux.c @@ -279,3 +279,13 @@ libxl_device_model_version libxl__default_device_model(libxl__gc *gc) { return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; } + +char *libxl__get_physical_device(char *dev) +{ + int major, minor; + + if (libxl__device_physdisk_major_minor(dev, &major, &minor)) + return NULL; + + return GCSPRINTF("%x:%x", major, minor); +} diff --git a/tools/libxl/libxl_netbsd.c b/tools/libxl/libxl_netbsd.c index 898e160..d0e3546 100644 --- a/tools/libxl/libxl_netbsd.c +++ b/tools/libxl/libxl_netbsd.c @@ -95,3 +95,13 @@ libxl_device_model_version libxl__default_device_model(libxl__gc *gc) { return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; } + +char *libxl__get_physical_device(char *dev) +{ + int major, minor; + + if (libxl__device_physdisk_major_minor(dev, &major, &minor)) + return NULL; + + return GCSPRINTF("%x:%x", major, minor); +} -- 2.5.4 (Apple Git-61)