diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index db3d171c3c..8a3c3b7686 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1713,9 +1713,11 @@
address
address
element ties the disk
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 0d2083ffc7..63478f72cd 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2384,26 +2384,35 @@ qemuParseNBDString(virDomainDiskDefPtr disk)
goto no_memory;
host = disk->src + strlen("nbd:");
- port = strchr(host, ':');
- if (!port) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("cannot parse nbd filename '%s'"), disk->src);
- goto error;
+ if (STRPREFIX(host, "unix:/")) {
+ src = strchr(host + strlen("unix:"), ':');
+ if (src)
+ *src++ = '\0';
+
+ h->transport = VIR_DOMAIN_DISK_PROTO_TRANS_UNIX;
+ h->socket = strdup(host + strlen("unix:"));
+ } else {
+ port = strchr(host, ':');
+ if (!port) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse nbd filename '%s'"), disk->src);
+ goto error;
+ }
+
+ *port++ = '\0';
+ h->name = strdup(host);
+ if (!h->name)
+ goto no_memory;
+
+ src = strchr(port, ':');
+ if (src)
+ *src++ = '\0';
+
+ h->port = strdup(port);
+ if (!h->port)
+ goto no_memory;
}
- *port++ = '\0';
- h->name = strdup(host);
- if (!h->name)
- goto no_memory;
-
- src = strchr(port, ':');
- if (src)
- *src++ = '\0';
-
- h->port = strdup(port);
- if (!h->port)
- goto no_memory;
-
if (src && STRPREFIX(src, "exportname=")) {
src = strdup(strchr(src, '=') + 1);
if (!src)
@@ -2510,6 +2519,14 @@ qemuBuildNBDString(virDomainDiskDefPtr disk, virBufferPtr opt)
disk->hosts->port ? disk->hosts->port :
QEMU_DEFAULT_NBD_PORT);
break;
+ case VIR_DOMAIN_DISK_PROTO_TRANS_UNIX:
+ if (!disk->hosts->socket) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("socket attribute required for unix transport"));
+ return -1;
+ }
+ virBufferEscape(opt, ',', ",", "unix:%s", disk->hosts->socket);
+ break;
default:
transp = virDomainDiskProtocolTransportTypeToString(disk->hosts->transport);
virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
index 24f8129c12..a284233776 100644
--- a/tests/qemuargv2xmltest.c
+++ b/tests/qemuargv2xmltest.c
@@ -186,6 +186,7 @@ mymain(void)
DO_TEST("disk-drive-cache-unsafe");
DO_TEST("disk-drive-network-nbd");
DO_TEST("disk-drive-network-nbd-export");
+ DO_TEST("disk-drive-network-nbd-unix");
DO_TEST("disk-drive-network-gluster");
DO_TEST("disk-drive-network-rbd");
DO_TEST("disk-drive-network-rbd-ipv6");
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.args
new file mode 100644
index 0000000000..977b68faba
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.args
@@ -0,0 +1,5 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
+pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
+-no-acpi -boot c -usb -drive file=/dev/HostVG/QEMUGuest1,if=ide,bus=0,unit=0 \
+-drive file=nbd:unix:/var/run/nbdsock:exportname=bar,if=virtio,format=raw \
+-net none -serial none -parallel none
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml
new file mode 100644
index 0000000000..46114d53cc
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml
@@ -0,0 +1,33 @@
+