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 <mprivozn@redhat.com>
---
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(&buf, "pr-manager-helper,id=%s,path=%s", alias, obj->path);
+ virCommandAddArg(data->cmd, "-object");
+ virCommandAddArgBuffer(data->cmd, &buf);
+ return 0;
+}
+
+
+static int
+qemuBuildMasterPRCommandLine(virCommandPtr cmd,
+ qemuDomainObjPrivatePtr priv)
+{
+ struct qemuBuildMasterPRCommandLineData data = {.cmd = cmd };
+ int ret = -1;
+
+ if (priv->prHelpers &&
+ virHashForEach(priv->prHelpers,
+ qemuBuildMasterPRCommandLineHelper, &data) < 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 000000000..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 000000000..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 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-helper0,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/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index be32d891e..153098e8c 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2959,6 +2959,14 @@ mymain(void)
QEMU_CAPS_HDA_DUPLEX);
DO_TEST("user-aliases2", QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI);
+ DO_TEST("disk-virtio-scsi-reservations",
+ QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_SCSI,
+ QEMU_CAPS_SCSI_BLOCK, QEMU_CAPS_PR_MANAGER_HELPER);
+
+ DO_TEST("disk-virtio-scsi-reservations-not-managed",
+ QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_SCSI,
+ QEMU_CAPS_SCSI_BLOCK, QEMU_CAPS_PR_MANAGER_HELPER);
+
if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
virFileDeleteTree(fakerootdir);
--
2.13.6
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Jan 18, 2018 at 17:04:39 +0100, Michal Privoznik wrote:
> 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 <mprivozn@redhat.com>
> ---
> 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)
This code should really just look whether the alias is allocated rather
than duplicating the logic of when it's used.
> + return;
> +
> + virBufferAsprintf(buf, ",file.pr-manager=%s", srcPriv->prAlias);
According qemu.git/qapi/block-core.json, the pr-manager field is
supported only for '@BlockdevOptionsFile'. This means that you need to
check that it's used only for local paths which eventually translate to
BlockdevOptionsFile. Otherwise qemu will refuse this with any network
based disk. virStorageSourceIsLocalStorage is your friend.
> +
> 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;
> +};
Do you really need a single member struct for the void pointer?
> +
> +
> +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(&buf, "pr-manager-helper,id=%s,path=%s", alias, obj->path);
> + virCommandAddArg(data->cmd, "-object");
> + virCommandAddArgBuffer(data->cmd, &buf);
> + return 0;
> +}
> +
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2026 Red Hat, Inc.