diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 805c06de4a..c46c2ec1fd 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3069,8 +3069,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; @@ -3091,6 +3092,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; } @@ -3115,7 +3126,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); diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index c11e9b811e..2a3d0326b7 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -1327,23 +1327,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) { diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e3c919dfe6..c87c42ae6e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2716,6 +2716,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