[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 5/9] libxl: Rearrange qemu upstream disk argument code
George Dunlap writes ("[PATCH v3 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: This didn't apply to staging, since colo went in. I have tried to rebase it and the result compiles. Can you check it's right please ? Thanks, Ian. From 6ab86b63462c8e6dc243c796f5ea10240aadc5de Mon Sep 17 00:00:00 2001 From: George Dunlap <george.dunlap@xxxxxxxxxx> Date: Thu, 24 Mar 2016 17:18:33 +0000 Subject: [PATCH] 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> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- 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 | 76 ++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 3522fbf..c11e9b8 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -761,7 +761,7 @@ enum { LIBXL__COLO_SECONDARY, }; -static char *qemu_disk_scsi_drive_string(libxl__gc *gc, const char *pdev_path, +static char *qemu_disk_scsi_drive_string(libxl__gc *gc, const char *target_path, int unit, const char *format, const libxl_device_disk *disk, int colo_mode) @@ -775,14 +775,14 @@ static char *qemu_disk_scsi_drive_string(libxl__gc *gc, const char *pdev_path, case LIBXL__COLO_NONE: drive = libxl__sprintf (gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s,cache=writeback", - pdev_path, unit, format); + target_path, unit, format); break; case LIBXL__COLO_PRIMARY: /* * primary: * -dirve if=scsi,bus=0,unit=x,cache=writeback,driver=quorum,\ * id=exportname,\ - * children.0.file.filename=pdev_path,\ + * children.0.file.filename=target_path,\ * children.0.driver=format,\ * read-pattern=fifo,\ * vote-threshold=1 @@ -794,7 +794,7 @@ static char *qemu_disk_scsi_drive_string(libxl__gc *gc, const char *pdev_path, "children.0.driver=%s," "read-pattern=fifo," "vote-threshold=1", - unit, exportname, pdev_path, format); + unit, exportname, target_path, format); break; case LIBXL__COLO_SECONDARY: /* @@ -823,7 +823,7 @@ static char *qemu_disk_scsi_drive_string(libxl__gc *gc, const char *pdev_path, return drive; } -static char *qemu_disk_ide_drive_string(libxl__gc *gc, const char *pdev_path, +static char *qemu_disk_ide_drive_string(libxl__gc *gc, const char *target_path, int unit, const char *format, const libxl_device_disk *disk, int colo_mode) @@ -837,14 +837,14 @@ static char *qemu_disk_ide_drive_string(libxl__gc *gc, const char *pdev_path, case LIBXL__COLO_NONE: drive = GCSPRINTF ("file=%s,if=ide,index=%d,media=disk,format=%s,cache=writeback", - pdev_path, unit, format); + target_path, unit, format); break; case LIBXL__COLO_PRIMARY: /* * primary: * -dirve if=ide,index=x,media=disk,cache=writeback,driver=quorum,\ * id=exportname,\ - * children.0.file.filename=pdev_path,\ + * children.0.file.filename=target_path,\ * children.0.driver=format,\ * read-pattern=fifo,\ * vote-threshold=1 @@ -856,7 +856,7 @@ static char *qemu_disk_ide_drive_string(libxl__gc *gc, const char *pdev_path, "children.0.driver=%s," "read-pattern=fifo," "vote-threshold=1", - unit, exportname, pdev_path, format); + unit, exportname, target_path, format); break; case LIBXL__COLO_SECONDARY: /* @@ -1305,9 +1305,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; int colo_mode; if (dev_number == -1) { @@ -1316,22 +1316,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", @@ -1339,14 +1339,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. * @@ -1367,12 +1375,12 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, if (colo_mode == LIBXL__COLO_SECONDARY) { drive = libxl__sprintf (gc, "if=none,driver=%s,file=%s,id=%s", - format, pdev_path, disks[i].colo_export); + format, target_path, disks[i].colo_export); flexarray_append(dm_args, "-drive"); flexarray_append(dm_args, drive); } - drive = qemu_disk_scsi_drive_string(gc, pdev_path, disk, + drive = qemu_disk_scsi_drive_string(gc, target_path, disk, format, &disks[i], colo_mode); @@ -1389,7 +1397,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; @@ -1401,12 +1409,12 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, if (colo_mode == LIBXL__COLO_SECONDARY) { drive = libxl__sprintf (gc, "if=none,driver=%s,file=%s,id=%s", - format, pdev_path, disks[i].colo_export); + format, target_path, disks[i].colo_export); flexarray_append(dm_args, "-drive"); flexarray_append(dm_args, drive); } - drive = qemu_disk_ide_drive_string(gc, pdev_path, disk, + drive = qemu_disk_ide_drive_string(gc, target_path, disk, format, &disks[i], colo_mode); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |