blktap exposes disks over UNIX socket Network Block Device (NBD).
Modify libxl__device_disk_find_local_path() to provide back the
QEMU-formatted NBD path. This allows tapdisk to be used for booting an
HVM.
Use the nbd+unix:/// format specified by the protocol at
https://github.com/NetworkBlockDevice/nbd/blob/master/doc/uri.md
Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
---
tools/libs/light/libxl_disk.c | 17 +++++++++++++----
tools/libs/light/libxl_dm.c | 1 -
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/tools/libs/light/libxl_disk.c b/tools/libs/light/libxl_disk.c
index 59ff996837..b65cad33cc 100644
--- a/tools/libs/light/libxl_disk.c
+++ b/tools/libs/light/libxl_disk.c
@@ -1317,7 +1317,8 @@ char *libxl__device_disk_find_local_path(libxl__gc *gc,
* If the format isn't raw and / or we're using a script, then see
* if the script has written a path to the "cooked" node
*/
- if (disk->script && guest_domid != INVALID_DOMID) {
+ if ((disk->script && guest_domid != INVALID_DOMID) ||
+ disk->backend == LIBXL_DISK_BACKEND_TAP) {
libxl__device device;
char *be_path, *pdpath;
int rc;
@@ -1337,10 +1338,18 @@ char *libxl__device_disk_find_local_path(libxl__gc *gc,
LOGD(DEBUG, guest_domid, "Attempting to read node %s", pdpath);
path = libxl__xs_read(gc, XBT_NULL, pdpath);
- if (path)
+ if (path) {
LOGD(DEBUG, guest_domid, "Accessing cooked block device %s", path);
- else
- LOGD(DEBUG, guest_domid, "No physical-device-path, can't access locally.");
+
+ /* tapdisk exposes disks locally over UNIX socket NBD. */
+ if (disk->backend == LIBXL_DISK_BACKEND_TAP) {
+ path = libxl__sprintf(gc, "nbd+unix:///?socket=%s", path);
+ LOGD(DEBUG, guest_domid,
+ "Directly accessing local TAP target %s", path);
+ }
+ } else
+ LOGD(DEBUG, guest_domid,
+ "No physical-device-path, can't access locally.");
goto out;
}
diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c
index 14b593110f..f7c796011d 100644
--- a/tools/libs/light/libxl_dm.c
+++ b/tools/libs/light/libxl_dm.c
@@ -1915,7 +1915,6 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
continue;
}
- assert(disks[i].backend != LIBXL_DISK_BACKEND_TAP);
target_path = libxl__device_disk_find_local_path(gc,
guest_domid, &disks[i], true);
--
2.43.0
On Thu, Feb 01, 2024 at 01:30:24PM -0500, Jason Andryuk wrote:
> diff --git a/tools/libs/light/libxl_disk.c b/tools/libs/light/libxl_disk.c
> @@ -1337,10 +1338,18 @@ char *libxl__device_disk_find_local_path(libxl__gc *gc,
> LOGD(DEBUG, guest_domid, "Attempting to read node %s", pdpath);
> path = libxl__xs_read(gc, XBT_NULL, pdpath);
>
> - if (path)
> + if (path) {
> LOGD(DEBUG, guest_domid, "Accessing cooked block device %s", path);
> - else
> - LOGD(DEBUG, guest_domid, "No physical-device-path, can't access locally.");
> +
> + /* tapdisk exposes disks locally over UNIX socket NBD. */
> + if (disk->backend == LIBXL_DISK_BACKEND_TAP) {
> + path = libxl__sprintf(gc, "nbd+unix:///?socket=%s", path);
> + LOGD(DEBUG, guest_domid,
> + "Directly accessing local TAP target %s", path);
> + }
> + } else
> + LOGD(DEBUG, guest_domid,
> + "No physical-device-path, can't access locally.");
Here, the coding style call to have both side of the if..else to have { }
or none of them. Could you add {}-block for the else side?
Beside that, patch looks fine to me:
Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
Thanks,
--
Anthony PERARD
© 2016 - 2026 Red Hat, Inc.