All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node
@ 2018-10-23 11:23 Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 01/14] configure: add test for libudev Tomáš Golembiovský
                   ` (14 more replies)
  0 siblings, 15 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Note that PCI controller reporting on Windows was and still is broken.
Unfortunately I don't know how to fix it at the momemnt. See commit message and
code comment. If anyone has environment where the original code works let me
know. CCing author of the code In case I missed something obvious.

v5:
  - return -1 in PCI info
    I have cherry-picked three commits from Sameeh Jubran and Michael Roth:
    https://github.com/mdroth/qemu/commit/89f145d7e90d721dbc7c9d0082e564bad7e88247
    https://github.com/mdroth/qemu/commit/d5f5f7e7dc265a9e62e5f4c2ee342ab7e56cca53
    https://github.com/mdroth/qemu/commit/201db36b56d7d1ba5ff720eedcb3b62b75306fde
  - remove == TRUE from if-conditions
  - separate Linux and Windows changes so that the Linux part can be pushed
    independently; the relevant commits are ordered first.
  - fixed several typos

v4:
  - split changes into more patches
  - fixed UNC for physical drive to use device namespace
  - renamed g_debug_err() to debug_error()
  - fixed build without libudev

v3:
  - fix typos
  - add configure test for libudev
  - change order of patches fixing PCI controller info and build fix to avoid
    exposing broken code
  - split reporting of serial number and device node into two separate patches

v2:
  - fix checkpatch error

Michael Roth (1):
  *additonal fixup for NULL pci_controller field

Sameeh Jubran (2):
  qga-win: prevent crash when executing fsinfo command
  qga-win: fsinfo: pci-info: allow partial info

Tomáš Golembiovský (11):
  configure: add test for libudev
  qga: linux: report disk serial number
  qga: linux: return disk device in guest-get-fsinfo
  build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI
  qga-win: add debugging information
  qga-win: refactor disk properties (bus)
  qga-win: report disk serial number
  qga-win: refactor disk info
  qga-win: handle multi-disk volumes
  qga-win: return disk device in guest-get-fsinfo
  qga-win: demystify namespace stripping

 configure            |  24 +++-
 dtc                  |   2 +-
 qga/Makefile.objs    |   1 +
 qga/commands-posix.c |  37 +++++-
 qga/commands-win32.c | 269 +++++++++++++++++++++++++++++++++++--------
 qga/qapi-schema.json |   5 +-
 6 files changed, 287 insertions(+), 51 deletions(-)

-- 
2.19.0

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 01/14] configure: add test for libudev
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 02/14] qga: linux: report disk serial number Tomáš Golembiovský
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 configure | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/configure b/configure
index c3da1a2587..26e8605bbc 100755
--- a/configure
+++ b/configure
@@ -477,6 +477,7 @@ libxml2=""
 docker="no"
 debug_mutex="no"
 libpmem=""
+libudev="no"
 
 # cross compilers defaults, can be overridden with --cross-cc-ARCH
 cross_cc_aarch64="aarch64-linux-gnu-gcc"
@@ -873,6 +874,7 @@ Linux)
   vhost_vsock="yes"
   QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES"
   supported_os="yes"
+  libudev="yes"
 ;;
 esac
 
@@ -5665,6 +5667,20 @@ if test "$libnfs" != "no" ; then
   fi
 fi
 
+##########################################
+# Do we have libudev
+if test "$libudev" != "no" ; then
+  if $pkg_config libudev; then
+    libudev="yes"
+    libudev_libs=$($pkg_config --libs libudev)
+  else
+    if test "$libudev" = "yes" ; then
+      feature_not_found "libudev" "Install systemd development files"
+    fi
+    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"
@@ -6092,6 +6108,7 @@ echo "VxHS block device $vxhs"
 echo "capstone          $capstone"
 echo "docker            $docker"
 echo "libpmem support   $libpmem"
+echo "libudev           $libudev"
 
 if test "$sdl_too_old" = "yes"; then
 echo "-> Your SDL version is too old - please upgrade to have SDL support"
@@ -6936,6 +6953,11 @@ if test "$docker" != "no"; then
     echo "HAVE_USER_DOCKER=y" >> $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
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 02/14] qga: linux: report disk serial number
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 01/14] configure: add test for libudev Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 03/14] qga: linux: return disk device in guest-get-fsinfo Tomáš Golembiovský
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, 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ý <tgolembi@redhat.com>
---
 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 ed08c5917c..80e6bb3c2e 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 37e8a2d791..d08719ba68 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -48,6 +48,10 @@ extern char **environ;
 #include <net/if.h>
 #include <sys/statvfs.h>
 
+#ifdef CONFIG_LIBUDEV
+#include <libudev.h>
+#endif
+
 #ifdef FIFREEZE
 #define CONFIG_FSFREEZE
 #endif
@@ -872,6 +876,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",
@@ -936,6 +944,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:<unit>:0 */
         if (!has_host || !has_tgt) {
@@ -995,14 +1018,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 dfbc4a5e32..3bcda6257e 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -834,13 +834,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:
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 03/14] qga: linux: return disk device in guest-get-fsinfo
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 01/14] configure: add test for libudev Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 02/14] qga: linux: report disk serial number Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 04/14] qga-win: prevent crash when executing fsinfo command Tomáš Golembiovský
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Report device node of the disk on Linux (e.g. "/dev/sda2").
Requirs libudev.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 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 d08719ba68..0c04937a13 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -950,7 +950,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 3bcda6257e..c6725b3ec8 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -835,6 +835,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
 ##
@@ -842,7 +843,7 @@
   'data': {'pci-controller': 'GuestPCIAddress',
            'bus-type': 'GuestDiskBusType',
            'bus': 'int', 'target': 'int', 'unit': 'int',
-           '*serial': 'str'} }
+           '*serial': 'str', '*dev': 'str'} }
 
 ##
 # @GuestFilesystemInfo:
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 04/14] qga-win: prevent crash when executing fsinfo command
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (2 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 03/14] qga: linux: return disk device in guest-get-fsinfo Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 05/14] qga-win: fsinfo: pci-info: allow partial info Tomáš Golembiovský
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

From: Sameeh Jubran <sjubran@redhat.com>

The fsinfo command is currently implemented for Windows only and it's disk
parameter can be enabled by adding the define "CONFIG_QGA_NTDDSCSI" to the qga
code. When enabled and executed the qemu-ga crashed with the following message:

------------------------------------------------
File qapi/qapi-visit-core.c, Line 49

Expression: !(v->type & VISITOR_OUTPUT) || *obj)
------------------------------------------------

After some digging, turns out that the GuestPCIAddress is null and the
qapi visitor doesn't like that, so we can always allocate it instead and
initiate all it's members to -1.

Signed-off-by: Sameeh Jubran <sjubran@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>

(cherry picked from commit ecb8293d90eafde5b0423ef90aacfeff718ed913)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 98d9735389..8289e7d6ea 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -485,6 +485,11 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
     char *buffer = NULL;
     GuestPCIAddress *pci = NULL;
     char *name = g_strdup(&guid[4]);
+    pci = g_malloc0(sizeof(*pci));
+    pci->domain = -1;
+    pci->slot = -1;
+    pci->function = -1;
+    pci->bus = -1;
 
     if (!QueryDosDevice(name, dev_name, ARRAY_SIZE(dev_name))) {
         error_setg_win32(errp, GetLastError(), "failed to get dos device name");
@@ -556,7 +561,6 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
 
         func = addr & 0x0000FFFF;
         dev = (addr >> 16) & 0x0000FFFF;
-        pci = g_malloc0(sizeof(*pci));
         pci->domain = dev;
         pci->slot = slot;
         pci->function = func;
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 05/14] qga-win: fsinfo: pci-info: allow partial info
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (3 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 04/14] qga-win: prevent crash when executing fsinfo command Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 06/14] *additonal fixup for NULL pci_controller field Tomáš Golembiovský
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

From: Sameeh Jubran <sjubran@redhat.com>

The call to SetupDiGetDeviceRegistryProperty might fail because the
value doesn't exist in the registry, in this case we shouldn't exit from
the loop but instead continue to look for other available values in the
registry and set this value as unavailable (-1).

Signed-off-by: Sameeh Jubran <sjubran@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
(cherry picked from commit d42f51de2d10b318d396f4f439f7a3995fdc0f65)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 8289e7d6ea..a8967abf06 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -505,7 +505,8 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
 
     dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
     for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
-        DWORD addr, bus, slot, func, dev, data, size2;
+        DWORD addr, bus, slot, data, size2;
+        int func, dev;
         while (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                                             SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
                                             &data, (PBYTE)buffer, size,
@@ -535,21 +536,21 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
          */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_BUSNUMBER, &data, (PBYTE)&bus, size, NULL)) {
-            break;
+            bus = -1;
         }
 
         /* The function retrieves the device's address. This value will be
          * transformed into device function and number */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_ADDRESS, &data, (PBYTE)&addr, size, NULL)) {
-            break;
+            addr = -1;
         }
 
         /* This call returns UINumber of DEVICE_CAPABILITIES structure.
          * This number is typically a user-perceived slot number. */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_UI_NUMBER, &data, (PBYTE)&slot, size, NULL)) {
-            break;
+            slot = -1;
         }
 
         /* SetupApi gives us the same information as driver with
@@ -559,12 +560,12 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
          * DeviceNumber = (USHORT)(((propertyAddress) >> 16) & 0x0000FFFF);
          * SPDRP_ADDRESS is propertyAddress, so we do the same.*/
 
-        func = addr & 0x0000FFFF;
-        dev = (addr >> 16) & 0x0000FFFF;
+        func = ((int) addr == -1) ? -1 : addr & 0x0000FFFF;
+        dev = ((int) addr == -1) ? -1 : (addr >> 16) & 0x0000FFFF;
         pci->domain = dev;
-        pci->slot = slot;
+        pci->slot = (int) slot;
         pci->function = func;
-        pci->bus = bus;
+        pci->bus = (int) bus;
         break;
     }
 
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 06/14] *additonal fixup for NULL pci_controller field
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (4 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 05/14] qga-win: fsinfo: pci-info: allow partial info Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 07/14] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI Tomáš Golembiovský
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

From: Michael Roth <mdroth@linux.vnet.ibm.com>

(cherry picked from commit 51fe925a7b473c76e06b60ddb8a862c91901b290)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index a8967abf06..44b6b1ce88 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -627,6 +627,10 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
 
     disk = g_malloc0(sizeof(*disk));
     disk->bus_type = find_bus_type(bus);
+    /* always set pci_controller as required by schema. get_pci_info() should
+     * report -1 values for non-PCI buses rather than fail.
+     */
+    disk->pci_controller = get_pci_info(name, errp);
     if (bus == BusTypeScsi || bus == BusTypeAta || bus == BusTypeRAID
 #if (_WIN32_WINNT >= 0x0600)
             /* This bus type is not supported before Windows Server 2003 SP1 */
@@ -641,12 +645,9 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
             disk->unit = addr.Lun;
             disk->target = addr.TargetId;
             disk->bus = addr.PathId;
-            disk->pci_controller = get_pci_info(name, errp);
         }
         /* We do not set error in this case, because we still have enough
          * information about volume. */
-    } else {
-         disk->pci_controller = NULL;
     }
 
     list = g_malloc0(sizeof(*list));
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 07/14] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (5 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 06/14] *additonal fixup for NULL pci_controller field Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 08/14] qga-win: add debugging information Tomáš Golembiovský
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

There was inconsistency between commits:

  50cbebb9a3 configure: add configure check for ntdddisk.h
  a3ef3b2272 qga: added bus type and disk location path

The first commit added #define CONFIG_QGA_NTDDDISK but the second commit
expected the name to be CONFIG_QGA_NTDDSCSI. As a result the code in
second patch was never used.

Renaming the option to CONFIG_QGA_NTDDSCSI to match the name of header
file that is being checked for.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Sameeh Jubran <sjubran@redhat.com>
---
 configure | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure b/configure
index 26e8605bbc..491e6e85c4 100755
--- a/configure
+++ b/configure
@@ -6204,7 +6204,7 @@ if test "$mingw32" = "yes" ; then
     echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
   fi
   if test "$guest_agent_ntddscsi" = "yes" ; then
-    echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak
+    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
   fi
   if test "$guest_agent_msi" = "yes"; then
     echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 08/14] qga-win: add debugging information
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (6 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 07/14] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 09/14] qga-win: refactor disk properties (bus) Tomáš Golembiovský
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

The windows code generaly lacks debug information (compared to posix
code). This patch adds some related to HW info in guest-get-fsinfo
command.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 dtc                  |  2 +-
 qga/commands-win32.c | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/dtc b/dtc
index 88f18909db..e54388015a 160000
--- a/dtc
+++ b/dtc
@@ -1 +1 @@
-Subproject commit 88f18909db731a627456f26d779445f84e449536
+Subproject commit e54388015af1fb4bf04d0bca99caba1074d9cc42
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 44b6b1ce88..a3d28d06b3 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -89,6 +89,12 @@ static OpenFlags guest_file_open_modes[] = {
     {"a+b", FILE_GENERIC_APPEND|GENERIC_READ, OPEN_ALWAYS  }
 };
 
+#define debug_error(msg) do { \
+    char *suffix = g_win32_error_message(GetLastError()); \
+    g_debug("%s: %s", (msg), suffix); \
+    g_free(suffix); \
+} while (0)
+
 static OpenFlags *find_open_flag(const char *mode_str)
 {
     int mode;
@@ -503,6 +509,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
         goto out;
     }
 
+    g_debug("enumerating devices");
     dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
     for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
         DWORD addr, bus, slot, data, size2;
@@ -528,6 +535,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
         if (g_strcmp0(buffer, dev_name)) {
             continue;
         }
+        g_debug("found device %s", dev_name);
 
         /* There is no need to allocate buffer in the next functions. The size
          * is known and ULONG according to
@@ -536,6 +544,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
          */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_BUSNUMBER, &data, (PBYTE)&bus, size, NULL)) {
+            debug_error("failed to get bus");
             bus = -1;
         }
 
@@ -543,6 +552,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
          * transformed into device function and number */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_ADDRESS, &data, (PBYTE)&addr, size, NULL)) {
+            debug_error("failed to get address");
             addr = -1;
         }
 
@@ -550,6 +560,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
          * This number is typically a user-perceived slot number. */
         if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
                    SPDRP_UI_NUMBER, &data, (PBYTE)&slot, size, NULL)) {
+            debug_error("failed to get slot");
             slot = -1;
         }
 
@@ -613,6 +624,7 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     scsi_ad = &addr;
     char *name = g_strndup(guid, strlen(guid)-1);
 
+    g_debug("getting disk info for: %s", name);
     vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                        0, NULL);
     if (vol_h == INVALID_HANDLE_VALUE) {
@@ -620,6 +632,7 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
         goto out_free;
     }
 
+    g_debug("getting bus type");
     bus = get_disk_bus_type(vol_h, errp);
     if (bus < 0) {
         goto out_close;
@@ -627,6 +640,7 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
 
     disk = g_malloc0(sizeof(*disk));
     disk->bus_type = find_bus_type(bus);
+    g_debug("bus type %d", disk->bus_type);
     /* always set pci_controller as required by schema. get_pci_info() should
      * report -1 values for non-PCI buses rather than fail.
      */
@@ -640,6 +654,7 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
         /* We are able to use the same ioctls for different bus types
          * according to Microsoft docs
          * https://technet.microsoft.com/en-us/library/ee851589(v=ws.10).aspx */
+        g_debug("getting pci-controller info");
         if (DeviceIoControl(vol_h, IOCTL_SCSI_GET_ADDRESS, NULL, 0, scsi_ad,
                             sizeof(SCSI_ADDRESS), &len, NULL)) {
             disk->unit = addr.Lun;
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 09/14] qga-win: refactor disk properties (bus)
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (7 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 08/14] qga-win: add debugging information Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 10/14] qga-win: report disk serial number Tomáš Golembiovský
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Refactor code that queries bus type to be more generic. The function
get_disk_bus_type() has been renamed to build_guest_disk_info().
Following commit(s) will extend this function.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index a3d28d06b3..5ebacd241f 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -588,25 +588,28 @@ out:
     return pci;
 }
 
-static int get_disk_bus_type(HANDLE vol_h, Error **errp)
+static void get_disk_properties(HANDLE vol_h, GuestDiskAddress *disk,
+    Error **errp)
 {
     STORAGE_PROPERTY_QUERY query;
     STORAGE_DEVICE_DESCRIPTOR *dev_desc, buf;
     DWORD received;
+    ULONG size = sizeof(buf);
 
     dev_desc = &buf;
-    dev_desc->Size = sizeof(buf);
     query.PropertyId = StorageDeviceProperty;
     query.QueryType = PropertyStandardQuery;
 
     if (!DeviceIoControl(vol_h, IOCTL_STORAGE_QUERY_PROPERTY, &query,
                          sizeof(STORAGE_PROPERTY_QUERY), dev_desc,
-                         dev_desc->Size, &received, NULL)) {
+                         size, &received, NULL)) {
         error_setg_win32(errp, GetLastError(), "failed to get bus type");
-        return -1;
+        return;
     }
+    disk->bus_type = find_bus_type(dev_desc->BusType);
+    g_debug("bus type %d", disk->bus_type);
 
-    return dev_desc->BusType;
+    return;
 }
 
 /* VSS provider works with volumes, thus there is no difference if
@@ -618,8 +621,8 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     GuestDiskAddress *disk;
     SCSI_ADDRESS addr, *scsi_ad;
     DWORD len;
-    int bus;
     HANDLE vol_h;
+    Error *local_err = NULL;
 
     scsi_ad = &addr;
     char *name = g_strndup(guid, strlen(guid)-1);
@@ -629,26 +632,27 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
                        0, NULL);
     if (vol_h == INVALID_HANDLE_VALUE) {
         error_setg_win32(errp, GetLastError(), "failed to open volume");
-        goto out_free;
+        goto err;
     }
 
-    g_debug("getting bus type");
-    bus = get_disk_bus_type(vol_h, errp);
-    if (bus < 0) {
-        goto out_close;
+    disk = g_malloc0(sizeof(*disk));
+    get_disk_properties(vol_h, disk, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        goto err_close;
     }
 
-    disk = g_malloc0(sizeof(*disk));
-    disk->bus_type = find_bus_type(bus);
     g_debug("bus type %d", disk->bus_type);
     /* always set pci_controller as required by schema. get_pci_info() should
      * report -1 values for non-PCI buses rather than fail.
      */
     disk->pci_controller = get_pci_info(name, errp);
-    if (bus == BusTypeScsi || bus == BusTypeAta || bus == BusTypeRAID
+    if (disk->bus_type == GUEST_DISK_BUS_TYPE_SCSI
+            || disk->bus_type == GUEST_DISK_BUS_TYPE_IDE
+            || disk->bus_type == GUEST_DISK_BUS_TYPE_RAID
 #if (_WIN32_WINNT >= 0x0600)
             /* This bus type is not supported before Windows Server 2003 SP1 */
-            || bus == BusTypeSas
+            || disk->bus_type == GUEST_DISK_BUS_TYPE_SAS
 #endif
         ) {
         /* We are able to use the same ioctls for different bus types
@@ -668,11 +672,17 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     list = g_malloc0(sizeof(*list));
     list->value = disk;
     list->next = NULL;
-out_close:
     CloseHandle(vol_h);
-out_free:
     g_free(name);
     return list;
+
+err_close:
+    g_free(disk);
+    CloseHandle(vol_h);
+err:
+    g_free(name);
+
+    return NULL;
 }
 
 #else
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 10/14] qga-win: report disk serial number
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (8 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 09/14] qga-win: refactor disk properties (bus) Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 11/14] qga-win: refactor disk info Tomáš Golembiovský
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 5ebacd241f..e7d9cdea62 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -609,6 +609,31 @@ static void get_disk_properties(HANDLE vol_h, GuestDiskAddress *disk,
     disk->bus_type = find_bus_type(dev_desc->BusType);
     g_debug("bus type %d", disk->bus_type);
 
+    /* Query once more. Now with long enough buffer. */
+    size = dev_desc->Size;
+    dev_desc = g_malloc0(size);
+    if (!DeviceIoControl(vol_h, IOCTL_STORAGE_QUERY_PROPERTY, &query,
+                         sizeof(STORAGE_PROPERTY_QUERY), dev_desc,
+                         size, &received, NULL)) {
+        error_setg_win32(errp, GetLastError(), "failed to get serial number");
+        goto out_free;
+    }
+    if (dev_desc->SerialNumberOffset > 0) {
+        if (dev_desc->SerialNumberOffset >= received) {
+            error_setg(errp, "offset outside the buffer");
+            goto out_free;
+        }
+        const char *serial = (char *)dev_desc + dev_desc->SerialNumberOffset;
+        size_t len = received - dev_desc->SerialNumberOffset;
+        if (*serial != 0) {
+            disk->serial = g_strndup(serial, len);
+            disk->has_serial = true;
+            g_debug("serial number %s", disk->serial);
+        }
+    }
+out_free:
+    g_free(dev_desc);
+
     return;
 }
 
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 11/14] qga-win: refactor disk info
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (9 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 10/14] qga-win: report disk serial number Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 12/14] qga-win: handle multi-disk volumes Tomáš Golembiovský
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Refactor building of disk info into a function that builds the list and
a function that returns infor for single disk. This will be used in
future commit that will handle multi-disk volumes.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 58 ++++++++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 18 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index e7d9cdea62..bb9bf0218a 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -637,20 +637,15 @@ out_free:
     return;
 }
 
-/* VSS provider works with volumes, thus there is no difference if
- * the volume consist of spanned disks. Info about the first disk in the
- * volume is returned for the spanned disk group (LVM) */
-static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
+static void get_single_disk_info(char *name, GuestDiskAddress *disk,
+    Error **errp)
 {
-    GuestDiskAddressList *list = NULL;
-    GuestDiskAddress *disk;
     SCSI_ADDRESS addr, *scsi_ad;
     DWORD len;
     HANDLE vol_h;
     Error *local_err = NULL;
 
     scsi_ad = &addr;
-    char *name = g_strndup(guid, strlen(guid)-1);
 
     g_debug("getting disk info for: %s", name);
     vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
@@ -660,7 +655,6 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
         goto err;
     }
 
-    disk = g_malloc0(sizeof(*disk));
     get_disk_properties(vol_h, disk, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
@@ -671,7 +665,11 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     /* always set pci_controller as required by schema. get_pci_info() should
      * report -1 values for non-PCI buses rather than fail.
      */
-    disk->pci_controller = get_pci_info(name, errp);
+    disk->pci_controller = get_pci_info(name, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        goto err_close;
+    }
     if (disk->bus_type == GUEST_DISK_BUS_TYPE_SCSI
             || disk->bus_type == GUEST_DISK_BUS_TYPE_IDE
             || disk->bus_type == GUEST_DISK_BUS_TYPE_RAID
@@ -694,20 +692,44 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
          * information about volume. */
     }
 
-    list = g_malloc0(sizeof(*list));
-    list->value = disk;
-    list->next = NULL;
-    CloseHandle(vol_h);
-    g_free(name);
-    return list;
-
 err_close:
-    g_free(disk);
     CloseHandle(vol_h);
 err:
+    return;
+}
+
+/* VSS provider works with volumes, thus there is no difference if
+ * the volume consist of spanned disks. Info about the first disk in the
+ * volume is returned for the spanned disk group (LVM) */
+static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
+{
+    Error *local_err = NULL;
+    GuestDiskAddressList *list = NULL, *cur_item = NULL;
+    GuestDiskAddress *disk = NULL;
+
+    /* strip final backslash */
+    char *name = g_strdup(guid);
+    if (g_str_has_suffix(name, "\\")) {
+        name[strlen(name) - 1] = 0;
+    }
+
+    disk = g_malloc0(sizeof(GuestDiskAddress));
+    get_single_disk_info(name, disk, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        goto out;
+    }
+
+    cur_item = g_malloc0(sizeof(*list));
+    cur_item->value = disk;
+    disk = NULL;
+    list = cur_item;
+
+out:
+    qapi_free_GuestDiskAddress(disk);
     g_free(name);
 
-    return NULL;
+    return list;
 }
 
 #else
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 12/14] qga-win: handle multi-disk volumes
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (10 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 11/14] qga-win: refactor disk info Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 13/14] qga-win: return disk device in guest-get-fsinfo Tomáš Golembiovský
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Probe the volume for disk extents and return list of all disks.
Originally only first disk of composite volume was returned.

Note that the patch changes get_pci_info() from one state of brokenness
into a different state of brokenness. In other words it still does not do
what it's supposed to do (see comment in code). If anyone knows how to
fix it, please step in.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 126 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 108 insertions(+), 18 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index bb9bf0218a..09566b3f47 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -477,9 +477,26 @@ static GuestDiskBusType find_bus_type(STORAGE_BUS_TYPE bus)
     return win2qemu[(int)bus];
 }
 
+/* XXX: The following function is BROKEN!
+ *
+ * It does not work and probably has never worked. When we query for list of
+ * disks we get cryptic names like "\Device\0000001d" instead of
+ * "\PhysicalDriveX" or "\HarddiskX". Whether the names can be translated one
+ * way or the other for comparison is an open question.
+ *
+ * When we query volume names (the original version) we are able to match those
+ * but then the property queries report error "Invalid function". (duh!)
+ */
+
+/*
 DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
         0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2,
         0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+*/
+DEFINE_GUID(GUID_DEVINTERFACE_DISK,
+        0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2,
+        0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
 
 static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
 {
@@ -502,7 +519,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
         goto out;
     }
 
-    dev_info = SetupDiGetClassDevs(&GUID_DEVINTERFACE_VOLUME, 0, 0,
+    dev_info = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,
                                    DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
     if (dev_info == INVALID_HANDLE_VALUE) {
         error_setg_win32(errp, GetLastError(), "failed to get devices tree");
@@ -642,20 +659,20 @@ static void get_single_disk_info(char *name, GuestDiskAddress *disk,
 {
     SCSI_ADDRESS addr, *scsi_ad;
     DWORD len;
-    HANDLE vol_h;
+    HANDLE disk_h;
     Error *local_err = NULL;
 
     scsi_ad = &addr;
 
     g_debug("getting disk info for: %s", name);
-    vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+    disk_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                        0, NULL);
-    if (vol_h == INVALID_HANDLE_VALUE) {
-        error_setg_win32(errp, GetLastError(), "failed to open volume");
-        goto err;
+    if (disk_h == INVALID_HANDLE_VALUE) {
+        error_setg_win32(errp, GetLastError(), "failed to open disk");
+        return;
     }
 
-    get_disk_properties(vol_h, disk, &local_err);
+    get_disk_properties(disk_h, disk, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto err_close;
@@ -682,7 +699,7 @@ static void get_single_disk_info(char *name, GuestDiskAddress *disk,
          * according to Microsoft docs
          * https://technet.microsoft.com/en-us/library/ee851589(v=ws.10).aspx */
         g_debug("getting pci-controller info");
-        if (DeviceIoControl(vol_h, IOCTL_SCSI_GET_ADDRESS, NULL, 0, scsi_ad,
+        if (DeviceIoControl(disk_h, IOCTL_SCSI_GET_ADDRESS, NULL, 0, scsi_ad,
                             sizeof(SCSI_ADDRESS), &len, NULL)) {
             disk->unit = addr.Lun;
             disk->target = addr.TargetId;
@@ -693,8 +710,7 @@ static void get_single_disk_info(char *name, GuestDiskAddress *disk,
     }
 
 err_close:
-    CloseHandle(vol_h);
-err:
+    CloseHandle(disk_h);
     return;
 }
 
@@ -706,6 +722,10 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     Error *local_err = NULL;
     GuestDiskAddressList *list = NULL, *cur_item = NULL;
     GuestDiskAddress *disk = NULL;
+    int i;
+    HANDLE vol_h;
+    DWORD size;
+    PVOLUME_DISK_EXTENTS extents = NULL;
 
     /* strip final backslash */
     char *name = g_strdup(guid);
@@ -713,20 +733,90 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
         name[strlen(name) - 1] = 0;
     }
 
-    disk = g_malloc0(sizeof(GuestDiskAddress));
-    get_single_disk_info(name, disk, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    g_debug("opening %s", name);
+    vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+                       0, NULL);
+    if (vol_h == INVALID_HANDLE_VALUE) {
+        error_setg_win32(errp, GetLastError(), "failed to open volume");
         goto out;
     }
 
-    cur_item = g_malloc0(sizeof(*list));
-    cur_item->value = disk;
-    disk = NULL;
-    list = cur_item;
+    /* Get list of extents */
+    g_debug("getting disk extents");
+    size = sizeof(VOLUME_DISK_EXTENTS);
+    extents = g_malloc0(size);
+    if (!DeviceIoControl(vol_h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL,
+                         0, extents, size, NULL, NULL)) {
+        DWORD last_err = GetLastError();
+        if (last_err == ERROR_MORE_DATA) {
+            /* Try once more with big enough buffer */
+            size = sizeof(VOLUME_DISK_EXTENTS)
+                + extents->NumberOfDiskExtents*sizeof(DISK_EXTENT);
+            g_free(extents);
+            extents = g_malloc0(size);
+            if (!DeviceIoControl(
+                    vol_h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL,
+                    0, extents, size, NULL, NULL)) {
+                error_setg_win32(errp, GetLastError(),
+                    "failed to get disk extents");
+                return NULL;
+            }
+        } else if (last_err == ERROR_INVALID_FUNCTION) {
+            /* Possibly CD-ROM or a shared drive. Try to pass the volume */
+            g_debug("volume not on disk");
+            disk = g_malloc0(sizeof(GuestDiskAddress));
+            get_single_disk_info(name, disk, &local_err);
+            if (local_err) {
+                g_debug("failed to get disk info, ignoring error: %s",
+                    error_get_pretty(local_err));
+                error_free(local_err);
+                goto out;
+            }
+            list = g_malloc0(sizeof(*list));
+            list->value = disk;
+            disk = NULL;
+            list->next = NULL;
+            goto out;
+        } else {
+            error_setg_win32(errp, GetLastError(),
+                "failed to get disk extents");
+            goto out;
+        }
+    }
+    g_debug("Number of extents: %lu", extents->NumberOfDiskExtents);
+
+    /* Go through each extent */
+    for (i = 0; i < extents->NumberOfDiskExtents; i++) {
+        char *disk_name = NULL;
+        disk = g_malloc0(sizeof(GuestDiskAddress));
+
+        /* Disk numbers directly correspond to numbers used in UNCs
+         *
+         * See documentation for DISK_EXTENT:
+         * https://docs.microsoft.com/en-us/windows/desktop/api/winioctl/ns-winioctl-_disk_extent
+         *
+         * See also Naming Files, Paths and Namespaces:
+         * https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#win32-device-namespaces
+         */
+        disk_name = g_strdup_printf("\\\\.\\PhysicalDrive%lu",
+            extents->Extents[i].DiskNumber);
+        get_single_disk_info(disk_name, disk, &local_err);
+        g_free(disk_name);
+        if (local_err) {
+            error_propagate(errp, local_err);
+            goto out;
+        }
+        cur_item = g_malloc0(sizeof(*list));
+        cur_item->value = disk;
+        disk = NULL;
+        cur_item->next = list;
+        list = cur_item;
+    }
+
 
 out:
     qapi_free_GuestDiskAddress(disk);
+    g_free(extents);
     g_free(name);
 
     return list;
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 13/14] qga-win: return disk device in guest-get-fsinfo
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (11 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 12/14] qga-win: handle multi-disk volumes Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 14/14] qga-win: demystify namespace stripping Tomáš Golembiovský
  2018-10-30  3:27 ` [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Michael Roth
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

Report device UNC of the disk. It is reported as "\\.\PhysicalDriveX".

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 09566b3f47..12aba8cc50 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -654,8 +654,7 @@ out_free:
     return;
 }
 
-static void get_single_disk_info(char *name, GuestDiskAddress *disk,
-    Error **errp)
+static void get_single_disk_info(GuestDiskAddress *disk, Error **errp)
 {
     SCSI_ADDRESS addr, *scsi_ad;
     DWORD len;
@@ -664,8 +663,8 @@ static void get_single_disk_info(char *name, GuestDiskAddress *disk,
 
     scsi_ad = &addr;
 
-    g_debug("getting disk info for: %s", name);
-    disk_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+    g_debug("getting disk info for: %s", disk->dev);
+    disk_h = CreateFile(disk->dev, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                        0, NULL);
     if (disk_h == INVALID_HANDLE_VALUE) {
         error_setg_win32(errp, GetLastError(), "failed to open disk");
@@ -682,7 +681,7 @@ static void get_single_disk_info(char *name, GuestDiskAddress *disk,
     /* always set pci_controller as required by schema. get_pci_info() should
      * report -1 values for non-PCI buses rather than fail.
      */
-    disk->pci_controller = get_pci_info(name, &local_err);
+    disk->pci_controller = get_pci_info(disk->dev, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto err_close;
@@ -765,7 +764,9 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
             /* Possibly CD-ROM or a shared drive. Try to pass the volume */
             g_debug("volume not on disk");
             disk = g_malloc0(sizeof(GuestDiskAddress));
-            get_single_disk_info(name, disk, &local_err);
+            disk->has_dev = true;
+            disk->dev = g_strdup(name);
+            get_single_disk_info(disk, &local_err);
             if (local_err) {
                 g_debug("failed to get disk info, ignoring error: %s",
                     error_get_pretty(local_err));
@@ -787,7 +788,6 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
 
     /* Go through each extent */
     for (i = 0; i < extents->NumberOfDiskExtents; i++) {
-        char *disk_name = NULL;
         disk = g_malloc0(sizeof(GuestDiskAddress));
 
         /* Disk numbers directly correspond to numbers used in UNCs
@@ -798,10 +798,11 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
          * See also Naming Files, Paths and Namespaces:
          * https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#win32-device-namespaces
          */
-        disk_name = g_strdup_printf("\\\\.\\PhysicalDrive%lu",
+        disk->has_dev = true;
+        disk->dev = g_strdup_printf("\\\\.\\PhysicalDrive%lu",
             extents->Extents[i].DiskNumber);
-        get_single_disk_info(disk_name, disk, &local_err);
-        g_free(disk_name);
+
+        get_single_disk_info(disk, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             goto out;
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 14/14] qga-win: demystify namespace stripping
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (12 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 13/14] qga-win: return disk device in guest-get-fsinfo Tomáš Golembiovský
@ 2018-10-23 11:23 ` Tomáš Golembiovský
  2018-10-30  3:27 ` [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Michael Roth
  14 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-23 11:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal,
	Michael Roth, Tomáš Golembiovský

It was not obvious what exactly the cryptic string copying does to the
GUID. This change makes the intent clearer.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 qga/commands-win32.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 12aba8cc50..779c8ce1fa 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -507,13 +507,21 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
     char dev_name[MAX_PATH];
     char *buffer = NULL;
     GuestPCIAddress *pci = NULL;
-    char *name = g_strdup(&guid[4]);
+    char *name = NULL;
+
     pci = g_malloc0(sizeof(*pci));
     pci->domain = -1;
     pci->slot = -1;
     pci->function = -1;
     pci->bus = -1;
 
+    if (g_str_has_prefix(guid, "\\\\.\\") ||
+        g_str_has_prefix(guid, "\\\\?\\")) {
+        name = g_strdup(guid + 4);
+    } else {
+        name = g_strdup(guid);
+    }
+
     if (!QueryDosDevice(name, dev_name, ARRAY_SIZE(dev_name))) {
         error_setg_win32(errp, GetLastError(), "failed to get dos device name");
         goto out;
-- 
2.19.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node
  2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
                   ` (13 preceding siblings ...)
  2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 14/14] qga-win: demystify namespace stripping Tomáš Golembiovský
@ 2018-10-30  3:27 ` Michael Roth
  2018-10-30 10:00   ` Tomáš Golembiovský
  14 siblings, 1 reply; 17+ messages in thread
From: Michael Roth @ 2018-10-30  3:27 UTC (permalink / raw)
  To: Tomáš Golembiovský, qemu-devel
  Cc: Eric Blake, Sameeh Jubran, Marc-André Lureau, Olga Krishtal

Quoting Tomáš Golembiovský (2018-10-23 06:23:09)
> Note that PCI controller reporting on Windows was and still is broken.
> Unfortunately I don't know how to fix it at the momemnt. See commit message and
> code comment. If anyone has environment where the original code works let me
> know. CCing author of the code In case I missed something obvious.
> 
> v5:
>   - return -1 in PCI info
>     I have cherry-picked three commits from Sameeh Jubran and Michael Roth:
>     https://github.com/mdroth/qemu/commit/89f145d7e90d721dbc7c9d0082e564bad7e88247
>     https://github.com/mdroth/qemu/commit/d5f5f7e7dc265a9e62e5f4c2ee342ab7e56cca53
>     https://github.com/mdroth/qemu/commit/201db36b56d7d1ba5ff720eedcb3b62b75306fde
>   - remove == TRUE from if-conditions
>   - separate Linux and Windows changes so that the Linux part can be pushed
>     independently; the relevant commits are ordered first.
>   - fixed several typos
> 
> v4:
>   - split changes into more patches
>   - fixed UNC for physical drive to use device namespace
>   - renamed g_debug_err() to debug_error()
>   - fixed build without libudev
> 
> v3:
>   - fix typos
>   - add configure test for libudev
>   - change order of patches fixing PCI controller info and build fix to avoid
>     exposing broken code
>   - split reporting of serial number and device node into two separate patches
> 
> v2:
>   - fix checkpatch error
> 
> Michael Roth (1):
>   *additonal fixup for NULL pci_controller field
> 
> Sameeh Jubran (2):
>   qga-win: prevent crash when executing fsinfo command
>   qga-win: fsinfo: pci-info: allow partial info
> 
> Tomáš Golembiovský (11):
>   configure: add test for libudev
>   qga: linux: report disk serial number
>   qga: linux: return disk device in guest-get-fsinfo
>   build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI
>   qga-win: add debugging information
>   qga-win: refactor disk properties (bus)
>   qga-win: report disk serial number
>   qga-win: refactor disk info
>   qga-win: handle multi-disk volumes
>   qga-win: return disk device in guest-get-fsinfo
>   qga-win: demystify namespace stripping

Thanks, applied to qga tree with some small fix-ups:
  https://github.com/mdroth/qemu/commits/qga

> 
>  configure            |  24 +++-
>  dtc                  |   2 +-
>  qga/Makefile.objs    |   1 +
>  qga/commands-posix.c |  37 +++++-
>  qga/commands-win32.c | 269 +++++++++++++++++++++++++++++++++++--------
>  qga/qapi-schema.json |   5 +-
>  6 files changed, 287 insertions(+), 51 deletions(-)
> 
> -- 
> 2.19.0
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node
  2018-10-30  3:27 ` [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Michael Roth
@ 2018-10-30 10:00   ` Tomáš Golembiovský
  0 siblings, 0 replies; 17+ messages in thread
From: Tomáš Golembiovský @ 2018-10-30 10:00 UTC (permalink / raw)
  To: Michael Roth
  Cc: qemu-devel, Eric Blake, Sameeh Jubran, Marc-André Lureau,
	Olga Krishtal

On Mon, 29 Oct 2018 22:27:45 -0500
Michael Roth <mdroth@linux.vnet.ibm.com> wrote:

> Quoting Tomáš Golembiovský (2018-10-23 06:23:09)
> > Note that PCI controller reporting on Windows was and still is broken.
> > Unfortunately I don't know how to fix it at the momemnt. See commit message and
> > code comment. If anyone has environment where the original code works let me
> > know. CCing author of the code In case I missed something obvious.
> > 
> > v5:
> >   - return -1 in PCI info
> >     I have cherry-picked three commits from Sameeh Jubran and Michael Roth:
> >     https://github.com/mdroth/qemu/commit/89f145d7e90d721dbc7c9d0082e564bad7e88247
> >     https://github.com/mdroth/qemu/commit/d5f5f7e7dc265a9e62e5f4c2ee342ab7e56cca53
> >     https://github.com/mdroth/qemu/commit/201db36b56d7d1ba5ff720eedcb3b62b75306fde
> >   - remove == TRUE from if-conditions
> >   - separate Linux and Windows changes so that the Linux part can be pushed
> >     independently; the relevant commits are ordered first.
> >   - fixed several typos
> > 
> > v4:
> >   - split changes into more patches
> >   - fixed UNC for physical drive to use device namespace
> >   - renamed g_debug_err() to debug_error()
> >   - fixed build without libudev
> > 
> > v3:
> >   - fix typos
> >   - add configure test for libudev
> >   - change order of patches fixing PCI controller info and build fix to avoid
> >     exposing broken code
> >   - split reporting of serial number and device node into two separate patches
> > 
> > v2:
> >   - fix checkpatch error
> > 
> > Michael Roth (1):
> >   *additonal fixup for NULL pci_controller field
> > 
> > Sameeh Jubran (2):
> >   qga-win: prevent crash when executing fsinfo command
> >   qga-win: fsinfo: pci-info: allow partial info
> > 
> > Tomáš Golembiovský (11):
> >   configure: add test for libudev
> >   qga: linux: report disk serial number
> >   qga: linux: return disk device in guest-get-fsinfo
> >   build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI
> >   qga-win: add debugging information
> >   qga-win: refactor disk properties (bus)
> >   qga-win: report disk serial number
> >   qga-win: refactor disk info
> >   qga-win: handle multi-disk volumes
> >   qga-win: return disk device in guest-get-fsinfo
> >   qga-win: demystify namespace stripping  
> 
> Thanks, applied to qga tree with some small fix-ups:
>   https://github.com/mdroth/qemu/commits/qga

Thank you

> 
> > 
> >  configure            |  24 +++-
> >  dtc                  |   2 +-
> >  qga/Makefile.objs    |   1 +
> >  qga/commands-posix.c |  37 +++++-
> >  qga/commands-win32.c | 269 +++++++++++++++++++++++++++++++++++--------
> >  qga/qapi-schema.json |   5 +-
> >  6 files changed, 287 insertions(+), 51 deletions(-)
> > 
> > -- 
> > 2.19.0
> >   


-- 
Tomáš Golembiovský <tgolembi@redhat.com>

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2018-10-30 10:00 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-23 11:23 [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 01/14] configure: add test for libudev Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 02/14] qga: linux: report disk serial number Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 03/14] qga: linux: return disk device in guest-get-fsinfo Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 04/14] qga-win: prevent crash when executing fsinfo command Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 05/14] qga-win: fsinfo: pci-info: allow partial info Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 06/14] *additonal fixup for NULL pci_controller field Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 07/14] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 08/14] qga-win: add debugging information Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 09/14] qga-win: refactor disk properties (bus) Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 10/14] qga-win: report disk serial number Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 11/14] qga-win: refactor disk info Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 12/14] qga-win: handle multi-disk volumes Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 13/14] qga-win: return disk device in guest-get-fsinfo Tomáš Golembiovský
2018-10-23 11:23 ` [Qemu-devel] [PATCH v5 14/14] qga-win: demystify namespace stripping Tomáš Golembiovský
2018-10-30  3:27 ` [Qemu-devel] [PATCH v5 00/14] qga: report serial number and disk node Michael Roth
2018-10-30 10:00   ` Tomáš Golembiovský

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.