From 38c65b140ef885c9868a5ff8f5963f7aa4b5e997 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Tue, 29 May 2012 16:36:50 +0100 Subject: libxl: introduce libxl__alloc_vdev Introduce libxl__alloc_vdev: find a spare virtual block device in the domain passed as argument. Signed-off-by: Stefano Stabellini Acked-by: Ian Jackson Committed-by: Ian Campbell --- tools/libxl/libxl_linux.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'tools/libxl/libxl_linux.c') diff --git a/tools/libxl/libxl_linux.c b/tools/libxl/libxl_linux.c index 925248b8ff..0169b2ff0b 100644 --- a/tools/libxl/libxl_linux.c +++ b/tools/libxl/libxl_linux.c @@ -25,3 +25,55 @@ int libxl__try_phy_backend(mode_t st_mode) return 1; } + +#define EXT_SHIFT 28 +#define EXTENDED (1<= 26) + ptr = encode_disk_name(ptr, n / 26 - 1); + *ptr = 'a' + n % 26; + return ptr + 1; +} + +char *libxl__devid_to_localdev(libxl__gc *gc, int devid) +{ + unsigned int minor; + int offset; + int nr_parts; + char *ptr = NULL; + char *ret = libxl__zalloc(gc, BUFFER_SIZE); + + if (!VDEV_IS_EXTENDED(devid)) { + minor = devid & 0xff; + nr_parts = 16; + } else { + minor = BLKIF_MINOR_EXT(devid); + nr_parts = 256; + } + offset = minor / nr_parts; + + strcpy(ret, "xvd"); + ptr = encode_disk_name(ret + 3, offset); + if (minor % nr_parts == 0) + *ptr = 0; + else + /* overflow cannot happen, thanks to the upper bound */ + snprintf(ptr, ret + 32 - ptr, + "%d", minor & (nr_parts - 1)); + return ret; +} -- cgit v1.2.3