|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 28 of 29 RFC] libxl: add libxl__find_free_vdev
# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1328189112 -3600
# Node ID 35164add2785b8606c0e9b771206d83862afd2c6
# Parent 42bd734ce75d232194372c329a9af9b73e9090fb
libxl: add libxl__find_free_vdev
Add a function that returns the first free xvd<x> device, used to
attach a DomU image and execute the bootloader against that.
Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
diff -r 42bd734ce75d -r 35164add2785 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c Thu Feb 02 11:54:58 2012 +0100
+++ b/tools/libxl/libxl_bootloader.c Thu Feb 02 14:25:12 2012 +0100
@@ -318,6 +318,39 @@ static void parse_bootloader_result(libx
}
}
+static char *libxl__find_free_vdev(libxl__gc *gc)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ char *vdev;
+ libxl_device_disk *list;
+ int num;
+ int used;
+
+ list = libxl_device_disk_list(ctx, 0, &num);
+ if (!list || num == 0) {
+ return "xvda";
+ }
+
+ for (char device = 'a'; device <= 'z'; device += 1) {
+ used = 0;
+ vdev = libxl__sprintf(gc, "xvd%c", device);
+ if (!vdev) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to allocate memory");
+ return NULL;
+ }
+ for (int i = 0; i < num; i++) {
+ if (strcmp(list[0].vdev, vdev) == 0) {
+ used = 1;
+ break;
+ }
+ }
+ if (!used)
+ return vdev;
+ }
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to find a free device");
+ return NULL;
+}
+
int libxl_run_bootloader(libxl_ctx *ctx,
libxl_domain_build_info *info,
libxl_device_disk *disk,
@@ -328,6 +361,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
char *fifo = NULL;
char *diskpath = NULL;
char **args = NULL;
+ char *vdev_save = NULL;
char tempdir_template[] = "/var/run/libxl/bl.XXXXXX";
char *tempdir;
@@ -378,6 +412,11 @@ int libxl_run_bootloader(libxl_ctx *ctx,
goto out_close;
}
+ vdev_save = disk->vdev;
+ disk->vdev = libxl__find_free_vdev(gc);
+ if (!disk->vdev)
+ goto out_close;
+
diskpath = libxl_device_disk_local_attach(ctx, disk);
if (!diskpath) {
goto out_close;
@@ -446,6 +485,8 @@ int libxl_run_bootloader(libxl_ctx *ctx,
out_close:
if (diskpath) {
libxl_device_disk_local_detach(ctx, disk);
+ if (vdev_save)
+ disk->vdev = vdev_save;
free(diskpath);
}
if (fifo_fd > -1)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |