This is the easier part. All we need to do here is put -object
pr-manger-helper,id=$alias,path=$socketPath and then just
reference the object in -drive file.pr-manger=$alias.
Signed-off-by: Michal Privoznik
---
src/qemu/qemu_command.c| 59 ++
.../disk-virtio-scsi-reservations-not-managed.args | 28 ++
.../disk-virtio-scsi-reservations.args | 29 +++
tests/qemuxml2argvtest.c | 8 +++
4 files changed, 124 insertions(+)
create mode 100644
tests/qemuxml2argvdata/disk-virtio-scsi-reservations-not-managed.args
create mode 100644 tests/qemuxml2argvdata/disk-virtio-scsi-reservations.args
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b8aede32d..13f2e4fd0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1515,6 +1515,20 @@ qemuDiskSourceGetProps(virStorageSourcePtr src)
}
+static void
+qemuBuildDriveSourcePR(virBufferPtr buf,
+ virStorageSourcePtr src)
+{
+qemuDomainStorageSourcePrivatePtr srcPriv =
QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
+
+if (!src->pr ||
+src->pr->enabled != VIR_TRISTATE_BOOL_YES)
+return;
+
+virBufferAsprintf(buf, ",file.pr-manager=%s", srcPriv->prAlias);
+}
+
+
static int
qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
virQEMUCapsPtr qemuCaps,
@@ -1591,6 +1605,8 @@ qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
if (disk->src->debug)
virBufferAsprintf(buf, ",file.debug=%d", disk->src->debugLevel);
+
+qemuBuildDriveSourcePR(buf, disk->src);
} else {
if (!(source = virQEMUBuildDriveCommandlineFromJSON(srcprops)))
goto cleanup;
@@ -10033,6 +10049,46 @@ qemuBuildPanicCommandLine(virCommandPtr cmd,
}
+struct qemuBuildMasterPRCommandLineData {
+virCommandPtr cmd;
+};
+
+
+static int
+qemuBuildMasterPRCommandLineHelper(void *payload,
+ const void *name,
+ void *opaque)
+{
+qemuDomainDiskPRObjectPtr obj = payload;
+struct qemuBuildMasterPRCommandLineData *data = opaque;
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+const char *alias = name;
+
+virBufferAsprintf(, "pr-manager-helper,id=%s,path=%s", alias,
obj->path);
+virCommandAddArg(data->cmd, "-object");
+virCommandAddArgBuffer(data->cmd, );
+return 0;
+}
+
+
+static int
+qemuBuildMasterPRCommandLine(virCommandPtr cmd,
+ qemuDomainObjPrivatePtr priv)
+{
+struct qemuBuildMasterPRCommandLineData data = {.cmd = cmd };
+int ret = -1;
+
+if (priv->prHelpers &&
+virHashForEach(priv->prHelpers,
+ qemuBuildMasterPRCommandLineHelper, ) < 0)
+goto cleanup;
+
+ret = 0;
+ cleanup:
+return ret;
+}
+
+
/**
* qemuBuildCommandLineValidate:
*
@@ -10185,6 +10241,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
if (qemuBuildMasterKeyCommandLine(cmd, priv) < 0)
goto error;
+if (qemuBuildMasterPRCommandLine(cmd, priv) < 0)
+goto error;
+
if (enableFips)
virCommandAddArg(cmd, "-enable-fips");
diff --git
a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations-not-managed.args
b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations-not-managed.args
new file mode 100644
index 0..387432c18
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations-not-managed.args
@@ -0,0 +1,28 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-i686 \
+-name QEMUGuest1 \
+-S \
+-object pr-manager-helper,id=pr-helper-sdb,path=/path/to/qemu-pr-helper.sock \
+-M pc \
+-m 214 \
+-smp 8,sockets=8,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-chardev
socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-no-acpi \
+-boot c \
+-device virtio-scsi-pci,id=scsi0,num_queues=8,bus=pci.0,addr=0x3 \
+-usb \
+-drive file=/dev/HostVG/QEMUGuest1,file.pr-manager=pr-helper-sdb,format=raw,\
+if=none,id=drive-scsi0-0-0-0,boot=on \
+-device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\
+drive=drive-scsi0-0-0-0,id=scsi0-0-0-0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.args
b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.args
new file mode 100644
index 0..2dc53cf05
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.args
@@ -0,0 +1,29 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-i686 \
+-name QEMUGuest1 \
+-S \
+-object pr-manager-helper,id=pr-helper0,\
+path=/tmp/lib/domain--1-QEMUGuest1/pr-helper0.sock \
+-M pc \
+-m 214 \
+-smp