All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, "Sameeh Jubran" <sjubran@redhat.com>,
	"Tomáš Golembiovský" <tgolembi@redhat.com>
Subject: [Qemu-devel] [PULL v2 08/24] qga-win: fsinfo: pci-info: allow partial info
Date: Tue, 30 Oct 2018 20:38:05 -0500	[thread overview]
Message-ID: <20181031013821.24023-9-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <20181031013821.24023-1-mdroth@linux.vnet.ibm.com>

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>
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
*squash in fix for when get_pci_info() returns NULL pci_controller field
*fix handling for error_set() cases in get_pci_info(), not just NULL return
*force all -1 PCI addr fields if any single one of them isn't found
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 qga/commands-win32.c | 46 +++++++++++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index f0e6f6128b..4fe1517778 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -499,6 +499,7 @@ static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
     char *buffer = NULL;
     GuestPCIAddress *pci = NULL;
     char *name = g_strdup(&guid[4]);
+    bool partial_pci = false;
     pci = g_malloc0(sizeof(*pci));
     pci->domain = -1;
     pci->slot = -1;
@@ -519,7 +520,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,
@@ -549,21 +551,24 @@ 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;
+            partial_pci = true;
         }
 
         /* 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;
+            partial_pci = true;
         }
 
         /* 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;
+            partial_pci = true;
         }
 
         /* SetupApi gives us the same information as driver with
@@ -573,12 +578,19 @@ 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;
-        pci->domain = dev;
-        pci->slot = slot;
-        pci->function = func;
-        pci->bus = bus;
+        if (partial_pci) {
+            pci->domain = -1;
+            pci->slot = -1;
+            pci->function = -1;
+            pci->bus = -1;
+        } else {
+            func = ((int) addr == -1) ? -1 : addr & 0x0000FFFF;
+            dev = ((int) addr == -1) ? -1 : (addr >> 16) & 0x0000FFFF;
+            pci->domain = dev;
+            pci->slot = (int) slot;
+            pci->function = func;
+            pci->bus = (int) bus;
+        }
         break;
     }
 
@@ -622,6 +634,7 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
     DWORD len;
     int bus;
     HANDLE vol_h;
+    Error *local_err = NULL;
 
     scsi_ad = &addr;
     char *name = g_strndup(guid, strlen(guid)-1);
@@ -640,6 +653,16 @@ 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. fail the command
+     * if that doesn't hold since that suggests some other unexpected
+     * breakage
+     */
+    disk->pci_controller = get_pci_info(name, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        goto out_close;
+    }
     if (bus == BusTypeScsi || bus == BusTypeAta || bus == BusTypeRAID
 #if (_WIN32_WINNT >= 0x0600)
             /* This bus type is not supported before Windows Server 2003 SP1 */
@@ -654,12 +677,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.17.1

  parent reply	other threads:[~2018-10-31  1:41 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-31  1:37 [Qemu-devel] [PULL v2 00/24] qemu-ga patch queue for soft-freeze Michael Roth
2018-10-31  1:37 ` [Qemu-devel] [PULL v2 01/24] qga: Support Unicode paths in guest-file-open on win32 Michael Roth
2018-10-31  1:37 ` [Qemu-devel] [PULL v2 02/24] qga-win: add support for qmp_guest_fsfreeze_freeze_list Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 03/24] qga: ignore non present cpus when handling qmp_guest_get_vcpus() Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 04/24] configure: add test for libudev Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 05/24] qga: linux: report disk serial number Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 06/24] qga: linux: return disk device in guest-get-fsinfo Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 07/24] qga-win: prevent crash when executing fsinfo command Michael Roth
2018-10-31  1:38 ` Michael Roth [this message]
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 09/24] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 10/24] qga-win: add debugging information Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 11/24] qga-win: refactor disk properties (bus) Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 12/24] qga-win: report disk serial number Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 13/24] qga-win: refactor disk info Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 14/24] qga-win: handle multi-disk volumes Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 15/24] qga-win: return disk device in guest-get-fsinfo Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 16/24] qga-win: demystify namespace stripping Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 17/24] qga: fix an off-by-one issue Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 18/24] qga: group agent init/cleanup init separate routines Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 19/24] qga: hang GAConfig/socket_activation off of GAState global Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 20/24] qga: move w32 service handling out of run_agent() Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 21/24] qga: add --retry-path option for re-initializing channel on failure Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 22/24] qga-win: install service with --retry-path set by default Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 23/24] qga-win: report specific error when failing to open channel Michael Roth
2018-10-31  1:38 ` [Qemu-devel] [PULL v2 24/24] qga-win: changing --retry-path option behavior Michael Roth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181031013821.24023-9-mdroth@linux.vnet.ibm.com \
    --to=mdroth@linux.vnet.ibm.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=sjubran@redhat.com \
    --cc=tgolembi@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.