[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 5/9] libxl: Rearrange qemu upstream disk argument code
Reorganize the qemuu disk argument code to make a clean separation between finding a file to use, and constructing the parameters: * Rename pdev_path to target_path * Only use qemu_disk_format_string() in circumstances where qemu may be interpreting the disk (i.e., backend==QDISK). In all other cases, it should use RAW. * Share as much as possible between the is_cdrom path and the normal path. This is mainly prep for sharing the local path finder with the bootloader; but it does allow cdroms to use any backend that a normal disk can use. Previously this was limited to RAW files or things that qemu could handle directly; as of this changeset, it now includes tap disks; and in future changesets it will include backends with custom block scripts. NB that this retains an existing bug, that disks with custom block scripts or non-dom0 backends will have the bogus pdev_path passed in to qemu, most likely resulting in qemu exiting with an error. This will be fixed in follow-up patches. Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- Changes since v1: - Move qemuu disk argument refactoring into a separate patch CC: Ian Jackson <ian.jackson@xxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> CC: Anthony Perard <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_dm.c | 61 +++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 4aca38e..dfcf141 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -1161,9 +1161,9 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, int disk, part; int dev_number = libxl__device_disk_dev_number(disks[i].vdev, &disk, &part); - const char *format = qemu_disk_format_string(disks[i].format); + const char *format; char *drive; - const char *pdev_path; + const char *target_path; if (dev_number == -1) { LOG(WARN, "unable to determine"" disk number for %s", @@ -1171,22 +1171,22 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, continue; } - if (disks[i].is_cdrom) { - if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) - drive = libxl__sprintf - (gc, "if=ide,index=%d,readonly=%s,media=cdrom,cache=writeback,id=ide-%i", - disk, disks[i].readwrite ? "off" : "on", dev_number); - else - drive = libxl__sprintf - (gc, "file=%s,if=ide,index=%d,readonly=%s,media=cdrom,format=%s,cache=writeback,id=ide-%i", - disks[i].pdev_path, disk, disks[i].readwrite ? "off" : "on", format, dev_number); - } else { - if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) { + /* + * If qemu isn't doing the interpreting, the parameter is + * always raw + */ + if (disks[i].backend == LIBXL_DISK_BACKEND_QDISK) + format = qemu_disk_format_string(disks[i].format); + else + format = qemu_disk_format_string(LIBXL_DISK_FORMAT_RAW); + + if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) { + if (!disks[i].is_cdrom) { LOG(WARN, "cannot support"" empty disk format for %s", disks[i].vdev); continue; } - + } else { if (format == NULL) { LOG(WARN, "unable to determine"" disk image format %s", @@ -1194,14 +1194,22 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, continue; } - if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) { - format = qemu_disk_format_string(LIBXL_DISK_FORMAT_RAW); - pdev_path = libxl__blktap_devpath(gc, disks[i].pdev_path, - disks[i].format); - } else { - pdev_path = disks[i].pdev_path; - } + if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) + target_path = libxl__blktap_devpath(gc, disks[i].pdev_path, + disks[i].format); + else + target_path = disks[i].pdev_path; + } + + if (disks[i].is_cdrom) { + drive = libxl__sprintf(gc, + "if=ide,index=%d,readonly=%s,media=cdrom,cache=writeback,id=ide-%i", + disk, disks[i].readwrite ? "off" : "on", dev_number); + if (target_path) + drive = libxl__sprintf(gc, "%s,file=%s,format=%s", + drive, target_path, format); + } else { /* * Explicit sd disks are passed through as is. * @@ -1209,9 +1217,10 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, * hd[a-d] and ignore the rest. */ if (strncmp(disks[i].vdev, "sd", 2) == 0) { - drive = libxl__sprintf - (gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s,readonly=%s,cache=writeback", - pdev_path, disk, format, disks[i].readwrite ? "off" : "on"); + drive = libxl__sprintf(gc, + "file=%s,if=scsi,bus=0,unit=%d,format=%s,readonly=%s,cache=writeback", + target_path, disk, format, + disks[i].readwrite ? "off" : "on"); } else if (strncmp(disks[i].vdev, "xvd", 3) == 0) { /* * Do not add any emulated disk when PV disk are @@ -1225,7 +1234,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, } flexarray_vappend(dm_args, "-drive", GCSPRINTF("file=%s,if=none,id=ahcidisk-%d,format=%s,cache=writeback", - pdev_path, disk, format), + target_path, disk, format), "-device", GCSPRINTF("ide-hd,bus=ahci0.%d,unit=0,drive=ahcidisk-%d", disk, disk), NULL); continue; @@ -1236,7 +1245,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, } drive = libxl__sprintf (gc, "file=%s,if=ide,index=%d,media=disk,format=%s,cache=writeback", - pdev_path, disk, format); + target_path, disk, format); } else { continue; /* Do not emulate this disk */ } -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |