@@ -3000,8 +3000,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;
@@ -3022,6 +3023,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;
}
@@ -3046,7 +3057,7 @@ void libxl__device_disk_local_initiate_attach(libxl__egc *egc,
LOG(DEBUG, "Trying to find local path");
- dls->diskpath = libxl__device_disk_find_local_path(gc, in_disk);
+ dls->diskpath = libxl__device_disk_find_local_path(gc, in_disk, false);
if (dls->diskpath) {
LOG(DEBUG, "Local path found, executing callback.");
dls->callback(egc, dls, 0);
@@ -1188,23 +1188,42 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) {
if (!disks[i].is_cdrom) {
- LOG(WARN, "cannot support"" empty disk format for %s",
+ 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",
+ "Unable to determine disk image format: %s\n"
+ "Disk will be available via PV drivers but not as an"
+ "emulated disk.",
disks[i].vdev);
continue;
}
+ /*
+ * 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
- target_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\n"
+ "Disk will be available via PV drivers but not as an"
+ "emulated disk.",
+ disks[i].vdev);
+ continue;
+ }
}
if (disks[i].is_cdrom) {
@@ -2688,6 +2688,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