From: George Dunlap <george.dunlap@citrix.com>
To: xen-devel@lists.xen.org
Cc: Wei Liu <wei.liu2@citrix.com>,
George Dunlap <george.dunlap@eu.citrix.com>,
Stefano Stabellini <stefano.stabellini@citrix.com>,
Anthony Perard <anthony.perard@citrix.com>,
Ian Jackson <ian.jackson@citrix.com>,
Roger Pau Monne <roger.pau@citrix.com>
Subject: [PATCH 5/8] libxl: Share logic for finding path between qemuu and pygrub
Date: Wed, 16 Mar 2016 16:09:14 +0000 [thread overview]
Message-ID: <1458144557-29070-6-git-send-email-george.dunlap@citrix.com> (raw)
In-Reply-To: <1458144557-29070-1-git-send-email-george.dunlap@citrix.com>
From: George Dunlap <george.dunlap@eu.citrix.com>
qemu can also access disks which will be provided with a qdisk backend
directly; add a flag to libxl__device_disk_find_local_path to indicate
whether to check for qdisk direct access.
Reorganize the qemuu disk argument code to make a clean separation
between finding a file to use (if any), and constructing the
parameters.
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.
Call libxl__device_disk_find_local_path() for most paths. If we can't find
a local path, print an error and skip the disk, rather than using a bogus path.
This should fix two bugs:
* In the case of a block script, or a non-dom0 backend, qemuu will now
print a warning and skip the disk, rather than adding bogus
parameters that will cause qemuu to error out.
* You should now be able to use any backend for a cdrom that you can
use for a normal disk. (Before it was limited to RAW files or things
that qemu could handle directly.)
I left the libxl__blktap_devpath in the qemuu-specific code rather than sharing
it with the pyrgub code because:
1) When the pygrub path runs the guest disks have not yet been set up
2) libxl__blktap_devpath() will give you the existing devpath if it
already exists, but will set one up for you if you don't. So on the pygrub path,
this would end up setting up a new tap device.
3) There is no TAP-specific teardown code on the pygrub path, and I
don't want to add any (particularly since I'm hoping to remove tapdisk
altogether soon).
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
---
CC: Ian Jackson <ian.jackson@citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Stefano Stabellini <stefano.stabellini@citrix.com>
CC: Anthony Perard <anthony.perard@citrix.com>
CC: Roger Pau Monne <roger.pau@citrix.com>
---
tools/libxl/libxl.c | 17 ++++++++++--
tools/libxl/libxl_dm.c | 66 +++++++++++++++++++++++++++++---------------
tools/libxl/libxl_internal.h | 8 ++++++
3 files changed, 66 insertions(+), 25 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index a57568f..d6302a9 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -3001,8 +3001,9 @@ static char * libxl__alloc_vdev(libxl__gc *gc, void *get_vdev_user,
/* Callbacks */
-static char * libxl__device_disk_find_local_path(libxl__gc *gc,
- const libxl_device_disk *disk) {
+char * libxl__device_disk_find_local_path(libxl__gc *gc,
+ const libxl_device_disk *disk,
+ bool qdisk_direct) {
char *path = NULL;
/* No local paths for driver domains */
@@ -3023,6 +3024,16 @@ static char * libxl__device_disk_find_local_path(libxl__gc *gc,
goto out;
}
+ /*
+ * If we're being called for a qemu path, we can pass the target
+ * string directly as well
+ */
+ if (qdisk_direct && disk->backend == LIBXL_DISK_BACKEND_QDISK ) {
+ path = libxl__strdup(gc, disk->pdev_path);
+ LOG(DEBUG, "Directly accessing local QDISK target %s", path);
+ goto out;
+ }
+
out:
return path;
}
@@ -3047,7 +3058,7 @@ void libxl__device_disk_local_initiate_attach(libxl__egc *egc,
LOG(DEBUG, "Trying to find local path");
- if ((dls->diskpath = libxl__device_disk_find_local_path(gc, in_disk))) {
+ if ((dls->diskpath = libxl__device_disk_find_local_path(gc, in_disk, false))) {
LOG(DEBUG, "Local path found, executing callback.");
dls->callback(egc, dls, 0);
} else {
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 4aca38e..917ebbf 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,36 @@ 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,
+ /*
+ * We can't call libxl__blktap_devpath from
+ * libxl__device_disk_find_local_path for now because
+ * the bootloader is called before the disks are set
+ * up, so this function would set up a blktap node,
+ * but there's no TAP tear-down on error conditions in
+ * the bootloader path.
+ */
+ if (disks[i].backend == LIBXL_DISK_BACKEND_TAP)
+ target_path = libxl__blktap_devpath(gc, disks[i].pdev_path,
disks[i].format);
- } else {
- pdev_path = disks[i].pdev_path;
+ else
+ target_path = libxl__device_disk_find_local_path(gc,
+ &disks[i], true);
+
+ if (!target_path) {
+ LOG(WARN, "No way to get local access disk to image: %s", disks[i].vdev);
+ continue;
}
+ }
+
+ 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.
*
@@ -1211,7 +1233,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
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");
+ 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 +1247,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 +1258,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 */
}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 005fe53..a511c6d 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -2670,6 +2670,14 @@ static inline void libxl__device_disk_local_init(libxl__disk_local_state *dls)
dls->rc = 0;
}
+/*
+ * See if we can find a way to access a disk locally
+ */
+_hidden char * libxl__device_disk_find_local_path(libxl__gc *gc,
+ const libxl_device_disk *disk,
+ bool qdisk_direct);
+
+
/* Make a disk available in this (the control) domain. Always calls
* dls->callback when finished.
* State Idle -> Attaching
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-03-16 16:09 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 16:09 [PATCH 0/8] tools: Allow HVM domains emulated access to disks provided by hotplug scripts George Dunlap
2016-03-16 16:09 ` [PATCH 1/8] tools/hotplug: Add a "dummy" hotplug script for testing George Dunlap
2016-03-16 16:54 ` Ian Jackson
2016-03-16 16:09 ` [PATCH 2/8] libxl: Remove redundant setting of phyical-device George Dunlap
2016-03-16 16:54 ` Ian Jackson
2016-03-16 16:09 ` [PATCH 3/8] tools/hotplug: Write physical-device-path in addition to physical-device George Dunlap
2016-03-16 16:56 ` Ian Jackson
2016-03-16 16:57 ` George Dunlap
2016-03-16 16:09 ` [PATCH 4/8] libxl: Move check for local access to a funciton George Dunlap
2016-03-16 16:58 ` Ian Jackson
2016-03-16 17:02 ` George Dunlap
2016-03-17 18:11 ` Ian Jackson
2016-03-21 15:35 ` George Dunlap
2016-03-16 16:09 ` George Dunlap [this message]
2016-03-17 18:22 ` [PATCH 5/8] libxl: Share logic for finding path between qemuu and pygrub Ian Jackson
2016-03-18 17:09 ` George Dunlap
2016-04-01 14:17 ` Ian Jackson
2016-03-16 16:09 ` [PATCH 6/8] libxl: Allow local access for block devices with hotplug scripts George Dunlap
2016-03-17 18:36 ` Ian Jackson
2016-03-18 17:17 ` George Dunlap
2016-03-16 16:09 ` [PATCH 7/8] docs: Document block-script protocol George Dunlap
2016-03-16 22:57 ` Jim Fehlig
2016-03-17 9:55 ` George Dunlap
2016-03-17 18:38 ` Ian Jackson
2016-03-16 16:09 ` [PATCH 8/8] DO NOT APPLY libxl: Change hotplug script interface to use physical-device-path George Dunlap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458144557-29070-6-git-send-email-george.dunlap@citrix.com \
--to=george.dunlap@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@citrix.com \
--cc=roger.pau@citrix.com \
--cc=stefano.stabellini@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).