[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: introduce libxl__alloc_vdev
# HG changeset patch # User Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> # Date 1338305810 -3600 # Node ID ccad7bed91633169594d147b82ce315663a27465 # Parent eae6e5bb90794f62a31ac79347ed64051238cd23 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 <stefano.stabellini@xxxxxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r eae6e5bb9079 -r ccad7bed9163 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue May 29 16:36:49 2012 +0100 +++ b/tools/libxl/libxl.c Tue May 29 16:36:50 2012 +0100 @@ -1743,6 +1743,38 @@ out: return ret; } +/* libxl__alloc_vdev only works on the local domain, that is the domain + * where the toolstack is running */ +static char * libxl__alloc_vdev(libxl__gc *gc, const char *blkdev_start, + xs_transaction_t t) +{ + int devid = 0, disk = 0, part = 0; + char *dompath = libxl__xs_get_dompath(gc, LIBXL_TOOLSTACK_DOMID); + + libxl__device_disk_dev_number(blkdev_start, &disk, &part); + if (part != 0) { + LOG(ERROR, "blkdev_start is invalid"); + return NULL; + } + + do { + devid = libxl__device_disk_dev_number(GCSPRINTF("d%dp0", disk), + NULL, NULL); + if (devid < 0) + return NULL; + if (libxl__xs_read(gc, t, + libxl__sprintf(gc, "%s/device/vbd/%d/backend", + dompath, devid)) == NULL) { + if (errno == ENOENT) + return libxl__devid_to_localdev(gc, devid); + else + return NULL; + } + disk++; + } while (1); + return NULL; +} + char * libxl__device_disk_local_attach(libxl__gc *gc, const libxl_device_disk *in_disk, libxl_device_disk *disk, diff -r eae6e5bb9079 -r ccad7bed9163 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue May 29 16:36:49 2012 +0100 +++ b/tools/libxl/libxl_internal.h Tue May 29 16:36:50 2012 +0100 @@ -78,6 +78,8 @@ #define LIBXL_PV_EXTRA_MEMORY 1024 #define LIBXL_HVM_EXTRA_MEMORY 2048 #define LIBXL_MIN_DOM0_MEM (128*1024) +/* use 0 as the domid of the toolstack domain for now */ +#define LIBXL_TOOLSTACK_DOMID 0 #define QEMU_SIGNATURE "DeviceModelRecord0002" #define STUBDOM_CONSOLE_LOGGING 0 #define STUBDOM_CONSOLE_SAVE 1 @@ -933,6 +935,8 @@ static inline void libxl__domaindeathche _hidden int libxl__try_phy_backend(mode_t st_mode); +_hidden char *libxl__devid_to_localdev(libxl__gc *gc, int devid); + /* from libxl_pci */ _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting); diff -r eae6e5bb9079 -r ccad7bed9163 tools/libxl/libxl_linux.c --- a/tools/libxl/libxl_linux.c Tue May 29 16:36:49 2012 +0100 +++ b/tools/libxl/libxl_linux.c Tue May 29 16:36:50 2012 +0100 @@ -25,3 +25,55 @@ int libxl__try_phy_backend(mode_t st_mod return 1; } + +#define EXT_SHIFT 28 +#define EXTENDED (1<<EXT_SHIFT) +#define VDEV_IS_EXTENDED(dev) ((dev)&(EXTENDED)) +#define BLKIF_MINOR_EXT(dev) ((dev)&(~EXTENDED)) +/* the size of the buffer to store the device name is 32 bytes to match the + * equivalent buffer in the Linux kernel code */ +#define BUFFER_SIZE 32 + +/* Same as in Linux. + * encode_disk_name might end up using up to 29 bytes (BUFFER_SIZE - 3) + * including the trailing \0. + * + * The code is safe because 26 raised to the power of 28 (that is the + * maximum offset that can be stored in the allocated buffer as a + * string) is far greater than UINT_MAX on 64 bits so offset cannot be + * big enough to exhaust the available bytes in ret. */ +static char *encode_disk_name(char *ptr, unsigned int n) +{ + if (n >= 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; +} diff -r eae6e5bb9079 -r ccad7bed9163 tools/libxl/libxl_netbsd.c --- a/tools/libxl/libxl_netbsd.c Tue May 29 16:36:49 2012 +0100 +++ b/tools/libxl/libxl_netbsd.c Tue May 29 16:36:50 2012 +0100 @@ -24,3 +24,9 @@ int libxl__try_phy_backend(mode_t st_mod return 0; } + +char *libxl__devid_to_localdev(libxl__gc *gc, int devid) +{ + /* TODO */ + return NULL; +} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |