diff --git a/SOURCES/qemuga-configure-add-test-for-libudev.patch b/SOURCES/qemuga-configure-add-test-for-libudev.patch new file mode 100644 index 0000000..719d739 --- /dev/null +++ b/SOURCES/qemuga-configure-add-test-for-libudev.patch @@ -0,0 +1,95 @@ +From e7f6b98b4f9d3205fadf2bb5e978a0f516ac3056 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= +Date: Fri, 23 Nov 2018 15:16:53 +0100 +Subject: [PATCH 3/5] configure: add test for libudev +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Marc-André Lureau +Message-id: <20181123151655.23498-3-marcandre.lureau@redhat.com> +Patchwork-id: 83152 +O-Subject: [RHEL-7.7 qemu-guest-agent PATCH 2/4] configure: add test for libudev +Bugzilla: 1635571 +RH-Acked-by: Markus Armbruster +RH-Acked-by: Philippe Mathieu-Daudé +RH-Acked-by: Laurent Vivier + +From: Tomáš Golembiovský + +Signed-off-by: Tomáš Golembiovský +Reviewed-by: Marc-André Lureau +*make libudev optional to avoid breaking existing build/test environments +*disable libudev for --static builds +Signed-off-by: Michael Roth + +(cherry picked from commit 3efac6ebb88e4d099f07fef65178ebaa595ae770) +[ Various simple conflicts due to upstream changes ] +Signed-off-by: Marc-André Lureau + +Signed-off-by: Miroslav Rezanina +--- + configure | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/configure b/configure +index 0a19b03..62aa775 100755 +--- a/configure ++++ b/configure +@@ -451,6 +451,7 @@ jemalloc="no" + replication="yes" + vxhs="" + libxml2="" ++libudev="no" + + supported_cpu="no" + supported_os="no" +@@ -819,6 +820,7 @@ Linux) + vhost_vsock="yes" + QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" + supported_os="yes" ++ libudev="yes" + ;; + esac + +@@ -5456,6 +5458,17 @@ if test "$libnfs" != "no" ; then + fi + fi + ++########################################## ++# Do we have libudev ++if test "$libudev" != "no" ; then ++ if $pkg_config libudev && test "$static" != "yes"; then ++ libudev="yes" ++ libudev_libs=$($pkg_config --libs libudev) ++ else ++ libudev="no" ++ fi ++fi ++ + # Now we've finished running tests it's OK to add -Werror to the compiler flags + if test "$werror" = "yes"; then + QEMU_CFLAGS="-Werror $QEMU_CFLAGS" +@@ -5874,6 +5887,7 @@ echo "avx2 optimization $avx2_opt" + echo "replication support $replication" + echo "VxHS block device $vxhs" + echo "capstone $capstone" ++echo "libudev $libudev" + + if test "$sdl_too_old" = "yes"; then + echo "-> Your SDL version is too old - please upgrade to have SDL support" +@@ -6697,6 +6711,11 @@ if test "$gcov" = "yes" ; then + echo "GCOV=$gcov_tool" >> $config_host_mak + fi + ++if test "$libudev" != "no"; then ++ echo "CONFIG_LIBUDEV=y" >> $config_host_mak ++ echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak ++fi ++ + # use included Linux headers + if test "$linux" = "yes" ; then + mkdir -p linux-headers +-- +1.8.3.1 + diff --git a/SOURCES/qemuga-qga-ignore-non-present-cpus-when-handling-qmp_guest_.patch b/SOURCES/qemuga-qga-ignore-non-present-cpus-when-handling-qmp_guest_.patch new file mode 100644 index 0000000..57bb363 --- /dev/null +++ b/SOURCES/qemuga-qga-ignore-non-present-cpus-when-handling-qmp_guest_.patch @@ -0,0 +1,199 @@ +From 34ff13c0974bf94c3e61b0b8af8134a6933194ea Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= +Date: Thu, 15 Nov 2018 09:45:19 +0100 +Subject: [PATCH 1/5] qga: ignore non present cpus when handling + qmp_guest_get_vcpus() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Marc-André Lureau +Message-id: <20181115094519.22641-1-marcandre.lureau@redhat.com> +Patchwork-id: 83030 +O-Subject: [RHEL-7.7 qemu-guest-agent PATCH] qga: ignore non present cpus when handling qmp_guest_get_vcpus() +Bugzilla: 1611062 +RH-Acked-by: Laszlo Ersek +RH-Acked-by: Igor Mammedov +RH-Acked-by: Markus Armbruster + +From: Igor Mammedov + +If VM has VCPUs plugged sparselly (for example a VM started with +3 VCPUs (cpu0, cpu1 and cpu2) and then cpu1 was hotunplugged so +only cpu0 and cpu2 are present), QGA will rise a error + error: internal error: unable to execute QEMU agent command 'guest-get-vcpus': + open("/sys/devices/system/cpu/cpu1/"): No such file or directory +when + virsh vcpucount FOO --guest +is executed. +Fix it by ignoring non present CPUs when fetching CPUs status from sysfs. + +Signed-off-by: Igor Mammedov +Reviewed-by: Laszlo Ersek +Reviewed-by: Marc-André Lureau +Signed-off-by: Michael Roth + +BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1611062 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=19189361 + +(cherry picked from commit b4bf912a6c19449e68af7b4173a8c6da21904d99) +Signed-off-by: Marc-André Lureau +Signed-off-by: Miroslav Rezanina +--- + qga/commands-posix.c | 115 ++++++++++++++++++++++++++------------------------- + 1 file changed, 59 insertions(+), 56 deletions(-) + +diff --git a/qga/commands-posix.c b/qga/commands-posix.c +index 26c1863..f4d9380 100644 +--- a/qga/commands-posix.c ++++ b/qga/commands-posix.c +@@ -1913,61 +1913,56 @@ static long sysconf_exact(int name, const char *name_str, Error **errp) + * Written members remain unmodified on error. + */ + static void transfer_vcpu(GuestLogicalProcessor *vcpu, bool sys2vcpu, +- Error **errp) ++ char *dirpath, Error **errp) + { +- char *dirpath; ++ int fd; ++ int res; + int dirfd; ++ static const char fn[] = "online"; + +- dirpath = g_strdup_printf("/sys/devices/system/cpu/cpu%" PRId64 "/", +- vcpu->logical_id); + dirfd = open(dirpath, O_RDONLY | O_DIRECTORY); + if (dirfd == -1) { + error_setg_errno(errp, errno, "open(\"%s\")", dirpath); +- } else { +- static const char fn[] = "online"; +- int fd; +- int res; +- +- fd = openat(dirfd, fn, sys2vcpu ? O_RDONLY : O_RDWR); +- if (fd == -1) { +- if (errno != ENOENT) { +- error_setg_errno(errp, errno, "open(\"%s/%s\")", dirpath, fn); +- } else if (sys2vcpu) { +- vcpu->online = true; +- vcpu->can_offline = false; +- } else if (!vcpu->online) { +- error_setg(errp, "logical processor #%" PRId64 " can't be " +- "offlined", vcpu->logical_id); +- } /* otherwise pretend successful re-onlining */ +- } else { +- unsigned char status; +- +- res = pread(fd, &status, 1, 0); +- if (res == -1) { +- error_setg_errno(errp, errno, "pread(\"%s/%s\")", dirpath, fn); +- } else if (res == 0) { +- error_setg(errp, "pread(\"%s/%s\"): unexpected EOF", dirpath, +- fn); +- } else if (sys2vcpu) { +- vcpu->online = (status != '0'); +- vcpu->can_offline = true; +- } else if (vcpu->online != (status != '0')) { +- status = '0' + vcpu->online; +- if (pwrite(fd, &status, 1, 0) == -1) { +- error_setg_errno(errp, errno, "pwrite(\"%s/%s\")", dirpath, +- fn); +- } +- } /* otherwise pretend successful re-(on|off)-lining */ ++ return; ++ } + +- res = close(fd); +- g_assert(res == 0); +- } ++ fd = openat(dirfd, fn, sys2vcpu ? O_RDONLY : O_RDWR); ++ if (fd == -1) { ++ if (errno != ENOENT) { ++ error_setg_errno(errp, errno, "open(\"%s/%s\")", dirpath, fn); ++ } else if (sys2vcpu) { ++ vcpu->online = true; ++ vcpu->can_offline = false; ++ } else if (!vcpu->online) { ++ error_setg(errp, "logical processor #%" PRId64 " can't be " ++ "offlined", vcpu->logical_id); ++ } /* otherwise pretend successful re-onlining */ ++ } else { ++ unsigned char status; ++ ++ res = pread(fd, &status, 1, 0); ++ if (res == -1) { ++ error_setg_errno(errp, errno, "pread(\"%s/%s\")", dirpath, fn); ++ } else if (res == 0) { ++ error_setg(errp, "pread(\"%s/%s\"): unexpected EOF", dirpath, ++ fn); ++ } else if (sys2vcpu) { ++ vcpu->online = (status != '0'); ++ vcpu->can_offline = true; ++ } else if (vcpu->online != (status != '0')) { ++ status = '0' + vcpu->online; ++ if (pwrite(fd, &status, 1, 0) == -1) { ++ error_setg_errno(errp, errno, "pwrite(\"%s/%s\")", dirpath, ++ fn); ++ } ++ } /* otherwise pretend successful re-(on|off)-lining */ + +- res = close(dirfd); ++ res = close(fd); + g_assert(res == 0); + } + +- g_free(dirpath); ++ res = close(dirfd); ++ g_assert(res == 0); + } + + GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp) +@@ -1985,17 +1980,21 @@ GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp) + while (local_err == NULL && current < sc_max) { + GuestLogicalProcessor *vcpu; + GuestLogicalProcessorList *entry; +- +- vcpu = g_malloc0(sizeof *vcpu); +- vcpu->logical_id = current++; +- vcpu->has_can_offline = true; /* lolspeak ftw */ +- transfer_vcpu(vcpu, true, &local_err); +- +- entry = g_malloc0(sizeof *entry); +- entry->value = vcpu; +- +- *link = entry; +- link = &entry->next; ++ int64_t id = current++; ++ char *path = g_strdup_printf("/sys/devices/system/cpu/cpu%" PRId64 "/", ++ id); ++ ++ if (g_file_test(path, G_FILE_TEST_EXISTS)) { ++ vcpu = g_malloc0(sizeof *vcpu); ++ vcpu->logical_id = id; ++ vcpu->has_can_offline = true; /* lolspeak ftw */ ++ transfer_vcpu(vcpu, true, path, &local_err); ++ entry = g_malloc0(sizeof *entry); ++ entry->value = vcpu; ++ *link = entry; ++ link = &entry->next; ++ } ++ g_free(path); + } + + if (local_err == NULL) { +@@ -2016,7 +2015,11 @@ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp) + + processed = 0; + while (vcpus != NULL) { +- transfer_vcpu(vcpus->value, false, &local_err); ++ char *path = g_strdup_printf("/sys/devices/system/cpu/cpu%" PRId64 "/", ++ vcpus->value->logical_id); ++ ++ transfer_vcpu(vcpus->value, false, path, &local_err); ++ g_free(path); + if (local_err != NULL) { + break; + } +-- +1.8.3.1 + diff --git a/SOURCES/qemuga-qga-linux-report-disk-serial-number.patch b/SOURCES/qemuga-qga-linux-report-disk-serial-number.patch new file mode 100644 index 0000000..3249e7e --- /dev/null +++ b/SOURCES/qemuga-qga-linux-report-disk-serial-number.patch @@ -0,0 +1,151 @@ +From 67a5f203179a6ed491b127a851fdbd6bc3ac5a0c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= +Date: Fri, 23 Nov 2018 15:16:54 +0100 +Subject: [PATCH 4/5] qga: linux: report disk serial number +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Marc-André Lureau +Message-id: <20181123151655.23498-4-marcandre.lureau@redhat.com> +Patchwork-id: 83151 +O-Subject: [RHEL-7.7 qemu-guest-agent PATCH 3/4] qga: linux: report disk serial number +Bugzilla: 1635571 +RH-Acked-by: Markus Armbruster +RH-Acked-by: Philippe Mathieu-Daudé +RH-Acked-by: Laurent Vivier + +From: Tomáš Golembiovský + +Add reporting of disk serial number on Linux guests. The feature depends +on libudev. + +Example: + + { + "name": "dm-2", + "mountpoint": "/", + ... + "disk": [ + { + "serial": "SAMSUNG_MZ7LN512HCHP-000L1_S1ZKNXAG822493", + ... + } + ], + } + +Signed-off-by: Tomáš Golembiovský +Signed-off-by: Michael Roth + +(cherry picked from commit b616105a904bc350a409e12c39af0ae210900124) +Signed-off-by: Marc-André Lureau +Signed-off-by: Miroslav Rezanina +--- + qga/Makefile.objs | 1 + + qga/commands-posix.c | 32 ++++++++++++++++++++++++++++++-- + qga/qapi-schema.json | 4 +++- + 3 files changed, 34 insertions(+), 3 deletions(-) + +diff --git a/qga/Makefile.objs b/qga/Makefile.objs +index ed08c59..80e6bb3 100644 +--- a/qga/Makefile.objs ++++ b/qga/Makefile.objs +@@ -1,3 +1,4 @@ ++commands-posix.o-libs := $(LIBUDEV_LIBS) + qga-obj-y = commands.o guest-agent-command-state.o main.o + qga-obj-$(CONFIG_POSIX) += commands-posix.o channel-posix.o + qga-obj-$(CONFIG_WIN32) += commands-win32.o channel-win32.o service-win32.o +diff --git a/qga/commands-posix.c b/qga/commands-posix.c +index f4d9380..c0430e6 100644 +--- a/qga/commands-posix.c ++++ b/qga/commands-posix.c +@@ -47,6 +47,10 @@ extern char **environ; + #include + #include + ++#ifdef CONFIG_LIBUDEV ++#include ++#endif ++ + #ifdef FIFREEZE + #define CONFIG_FSFREEZE + #endif +@@ -871,6 +875,10 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, + GuestDiskAddressList *list = NULL; + bool has_ata = false, has_host = false, has_tgt = false; + char *p, *q, *driver = NULL; ++#ifdef CONFIG_LIBUDEV ++ struct udev *udev = NULL; ++ struct udev_device *udevice = NULL; ++#endif + + p = strstr(syspath, "/devices/pci"); + if (!p || sscanf(p + 12, "%*x:%*x/%x:%x:%x.%x%n", +@@ -935,6 +943,21 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, + list = g_malloc0(sizeof(*list)); + list->value = disk; + ++#ifdef CONFIG_LIBUDEV ++ udev = udev_new(); ++ udevice = udev_device_new_from_syspath(udev, syspath); ++ if (udev == NULL || udevice == NULL) { ++ g_debug("failed to query udev"); ++ } else { ++ const char *serial; ++ serial = udev_device_get_property_value(udevice, "ID_SERIAL"); ++ if (serial != NULL && *serial != 0) { ++ disk->serial = g_strdup(serial); ++ disk->has_serial = true; ++ } ++ } ++#endif ++ + if (strcmp(driver, "ata_piix") == 0) { + /* a host per ide bus, target*:0::0 */ + if (!has_host || !has_tgt) { +@@ -994,14 +1017,19 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, + + list->next = fs->disk; + fs->disk = list; +- g_free(driver); +- return; ++ goto out; + + cleanup: + if (list) { + qapi_free_GuestDiskAddressList(list); + } ++out: + g_free(driver); ++#ifdef CONFIG_LIBUDEV ++ udev_unref(udev); ++ udev_device_unref(udevice); ++#endif ++ return; + } + + static void build_guest_fsinfo_for_device(char const *devpath, +diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json +index 17884c7..426528c 100644 +--- a/qga/qapi-schema.json ++++ b/qga/qapi-schema.json +@@ -832,13 +832,15 @@ + # @bus: bus id + # @target: target id + # @unit: unit id ++# @serial: serial number (since: 3.1) + # + # Since: 2.2 + ## + { 'struct': 'GuestDiskAddress', + 'data': {'pci-controller': 'GuestPCIAddress', + 'bus-type': 'GuestDiskBusType', +- 'bus': 'int', 'target': 'int', 'unit': 'int'} } ++ 'bus': 'int', 'target': 'int', 'unit': 'int', ++ '*serial': 'str'} } + + ## + # @GuestFilesystemInfo: +-- +1.8.3.1 + diff --git a/SOURCES/qemuga-qga-linux-return-disk-device-in-guest-get-fsinfo.patch b/SOURCES/qemuga-qga-linux-return-disk-device-in-guest-get-fsinfo.patch new file mode 100644 index 0000000..be14fcd --- /dev/null +++ b/SOURCES/qemuga-qga-linux-return-disk-device-in-guest-get-fsinfo.patch @@ -0,0 +1,75 @@ +From 00665748e4495bcb0b45dd5e15a7a9cc8331c77f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= +Date: Fri, 23 Nov 2018 15:16:55 +0100 +Subject: [PATCH 5/5] qga: linux: return disk device in guest-get-fsinfo +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Marc-André Lureau +Message-id: <20181123151655.23498-5-marcandre.lureau@redhat.com> +Patchwork-id: 83153 +O-Subject: [RHEL-7.7 qemu-guest-agent PATCH 4/4] qga: linux: return disk device in guest-get-fsinfo +Bugzilla: 1635571 +RH-Acked-by: Markus Armbruster +RH-Acked-by: Philippe Mathieu-Daudé +RH-Acked-by: Laurent Vivier + +From: Tomáš Golembiovský + +Report device node of the disk on Linux (e.g. "/dev/sda2"). +Requirs libudev. + +Signed-off-by: Tomáš Golembiovský +Signed-off-by: Michael Roth + +(cherry picked from commit 6589ce35734e7e71463485650e5fb6e4bbe64729) +Signed-off-by: Marc-André Lureau +Signed-off-by: Miroslav Rezanina +--- + qga/commands-posix.c | 7 ++++++- + qga/qapi-schema.json | 3 ++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/qga/commands-posix.c b/qga/commands-posix.c +index c0430e6..09884d7 100644 +--- a/qga/commands-posix.c ++++ b/qga/commands-posix.c +@@ -949,7 +949,12 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, + if (udev == NULL || udevice == NULL) { + g_debug("failed to query udev"); + } else { +- const char *serial; ++ const char *devnode, *serial; ++ devnode = udev_device_get_devnode(udevice); ++ if (devnode != NULL) { ++ disk->dev = g_strdup(devnode); ++ disk->has_dev = true; ++ } + serial = udev_device_get_property_value(udevice, "ID_SERIAL"); + if (serial != NULL && *serial != 0) { + disk->serial = g_strdup(serial); +diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json +index 426528c..ca022ad 100644 +--- a/qga/qapi-schema.json ++++ b/qga/qapi-schema.json +@@ -833,6 +833,7 @@ + # @target: target id + # @unit: unit id + # @serial: serial number (since: 3.1) ++# @dev: device node (POSIX) or device UNC (Windows) (since: 3.1) + # + # Since: 2.2 + ## +@@ -840,7 +841,7 @@ + 'data': {'pci-controller': 'GuestPCIAddress', + 'bus-type': 'GuestDiskBusType', + 'bus': 'int', 'target': 'int', 'unit': 'int', +- '*serial': 'str'} } ++ '*serial': 'str', '*dev': 'str'} } + + ## + # @GuestFilesystemInfo: +-- +1.8.3.1 + diff --git a/SPECS/qemu-guest-agent.spec b/SPECS/qemu-guest-agent.spec index b8a969b..f194165 100644 --- a/SPECS/qemu-guest-agent.spec +++ b/SPECS/qemu-guest-agent.spec @@ -15,7 +15,7 @@ %global have_usbredir 0 %endif -%ifarch s390 s390x %{arm} +%ifarch s390 s390x %global have_librdma 0 %global have_numa 0 %global have_tcmalloc 0 @@ -48,10 +48,6 @@ %global kvm_target aarch64 %global have_fdt 1 %endif -%ifarch %{arm} - %global kvm_target arm - %global have_fdt 1 -%endif #Versions of various parts: @@ -60,7 +56,7 @@ Summary: QEMU guest agent Name: qemu-guest-agent Version: 2.12.0 -Release: 2%{?dist} +Release: 3%{?dist} # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped Epoch: 10 License: GPLv2 @@ -86,10 +82,19 @@ Source4: build_configure.sh Patch1: qemuga-qemu-ga-make-get-fsinfo-work-over-pci-bridges.patch # For bz#1567041 - qemu-guest-agent does not parse PCI bridge links in "build_guest_fsinfo_for_real_device" (q35) Patch2: qemuga-qga-fix-driver-leak-in-guest-get-fsinfo.patch +# For bz#1611062 - "virsh vcpucount --guest" fails after hotunplug a vcpu with intermediate order by "setvcpu" +Patch3: qemuga-qga-ignore-non-present-cpus-when-handling-qmp_guest_.patch +# For bz#1635571 - [RFE] Report disk device name and serial number (qemu-guest-agent on Linux) +Patch5: qemuga-configure-add-test-for-libudev.patch +# For bz#1635571 - [RFE] Report disk device name and serial number (qemu-guest-agent on Linux) +Patch6: qemuga-qga-linux-report-disk-serial-number.patch +# For bz#1635571 - [RFE] Report disk device name and serial number (qemu-guest-agent on Linux) +Patch7: qemuga-qga-linux-return-disk-device-in-guest-get-fsinfo.patch BuildRequires: zlib-devel BuildRequires: glib2-devel BuildRequires: systemd +BuildRequires: systemd-devel BuildRequires: python BuildRequires: systemtap-sdt-devel BuildRequires: perl-podlators @@ -122,6 +127,10 @@ This package does not need to be installed on the host OS. %setup -q -n qemu-%{version} %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 # if patch fuzzy patch applying will be forbidden %define with_fuzzy_patches 0 @@ -263,8 +272,16 @@ install -m 0644 qemu-ga.8 ${RPM_BUILD_ROOT}%{_mandir}/man8/ %changelog -* Thu May 16 2019 Johnny Hughes -- Build on armhfp +* Wed Dec 12 2018 Miroslav Rezanina - 2.12.0-3.el7 +- qemuga-qga-ignore-non-present-cpus-when-handling-qmp_guest_.patch [bz#1611062] +- qemuga-qemu-guest-agent.spec-add-systemd-devel-dependency.patch [bz#1635571] +- qemuga-configure-add-test-for-libudev.patch [bz#1635571] +- qemuga-qga-linux-report-disk-serial-number.patch [bz#1635571] +- qemuga-qga-linux-return-disk-device-in-guest-get-fsinfo.patch [bz#1635571] +- Resolves: bz#1611062 + ("virsh vcpucount --guest" fails after hotunplug a vcpu with intermediate order by "setvcpu") +- Resolves: bz#1635571 + ([RFE] Report disk device name and serial number (qemu-guest-agent on Linux)) * Tue Jul 24 2018 Miroslav Rezanina - 2.12.0-2.el7 - qemuga-qemu-ga-make-get-fsinfo-work-over-pci-bridges.patch [bz#1567041]