diff mbox

[09/10] qga: added bus type and disk location path

Message ID 1434733075-24240-10-git-send-email-den@openvz.org
State New
Headers show

Commit Message

Denis V. Lunev June 19, 2015, 4:57 p.m. UTC
From: Olga Krishtal <okrishtal@virtuozzo.com>

According to Microsoft disk location path can be obtained via
IOCTL_SCSI_GET_ADDRESS. Unfortunately this ioctl can not be used for all
devices. There are certain bus types which could be obtained with this
API. Please refer to the following link for more details
https://technet.microsoft.com/en-us/library/ee851589(v=ws.10).aspx

Bus type could be obtained using IOCTL_STORAGE_QUERY_PROPERTY. Enum
STORAGE_BUS_TYPE describes all buses supported by OS.

Windows defines more bus types that Linux. Thus some values have been added
to GuestDiskBusType.

Signed-off-by: Olga Krishtal <okrishtal@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Eric Blake <eblake@redhat.com>
CC: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 qga/commands-win32.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 qga/qapi-schema.json |  15 +++++-
 2 files changed, 139 insertions(+), 3 deletions(-)

Comments

Eric Blake June 19, 2015, 5:10 p.m. UTC | #1
On 06/19/2015 10:57 AM, Denis V. Lunev wrote:
> From: Olga Krishtal <okrishtal@virtuozzo.com>
> 
> According to Microsoft disk location path can be obtained via
> IOCTL_SCSI_GET_ADDRESS. Unfortunately this ioctl can not be used for all
> devices. There are certain bus types which could be obtained with this
> API. Please refer to the following link for more details
> https://technet.microsoft.com/en-us/library/ee851589(v=ws.10).aspx
> 
> Bus type could be obtained using IOCTL_STORAGE_QUERY_PROPERTY. Enum
> STORAGE_BUS_TYPE describes all buses supported by OS.
> 
> Windows defines more bus types that Linux. Thus some values have been added

s/that/than/

> to GuestDiskBusType.
> 
> Signed-off-by: Olga Krishtal <okrishtal@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Eric Blake <eblake@redhat.com>
> CC: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
>  qga/commands-win32.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>  qga/qapi-schema.json |  15 +++++-
>  2 files changed, 139 insertions(+), 3 deletions(-)
> 

> +static WinToLin buses[] = {
> +    {BusTypeUnknown, GUEST_DISK_BUS_TYPE_UNKNOWN},
> +    {BusTypeScsi, GUEST_DISK_BUS_TYPE_SCSI},
> +    {BusTypeAtapi, GUEST_DISK_BUS_TYPE_IDE},
> +    {BusTypeAta, GUEST_DISK_BUS_TYPE_IDE},
> +    {BusType1394, GUEST_DISK_BUS_TYPE_1394},
> +    {BusTypeSsa, GUEST_DISK_BUS_TYPE_SSA},
> +    {BusTypeFibre, GUEST_DISK_BUS_TYPE_SSA},
> +    {BusTypeUsb, GUEST_DISK_BUS_TYPE_USB},
> +    {BusTypeRAID, GUEST_DISK_BUS_TYPE_RAID},
> +#if (_WIN32_WINNT >= 0x0600)
> +    {BusTypeiScsi, GUEST_DISK_BUS_TYPE_I_SCSI},
> +    {BusTypeSas, GUEST_DISK_BUS_TYPE_SAS},
> +    {BusTypeSata, GUEST_DISK_BUS_TYPE_SATA},
> +    {BusTypeSd, GUEST_DISK_BUS_TYPE_SD},
> +    {BusTypeMmc, GUEST_DISK_BUS_TYPE_MMC},
> +    {BusTypeVirtual, GUEST_DISK_BUS_TYPE_VIRTUAL },
> +    {BusTypeFileBackedVirtuaul, GUEST_DISK_BUS_TYPE_FBIRTUAL},
> +    {BusTypeSpaces, GUEST_DISK_BUS_TYPE_SPACES}
> +#endif

I'd use a trailing comma, so that future additions can be pure additions
rather than amending existing lines.


> +++ b/qga/qapi-schema.json
> @@ -711,6 +711,7 @@
>  # @GuestDiskBusType
>  #
>  # An enumeration of bus type of disks
> +# is devided a bit on Linux and Windows guest
>  #

s/devided/divided/

>  # @ide: IDE disks
>  # @fdc: floppy disks
> @@ -721,12 +722,22 @@
>  # @uml: UML disks
>  # @sata: SATA disks
>  # @sd: SD cards
> -#
> +# @Unknown: Unknown bus type
> +# @1394: Win IEEE 1394 bus type
> +# @Ssa: Win SSA bus type
> +# @Fibre: Win fiber channel bus type
> +# @Raid: Win RAID bus type
> +# @iScsi: Win iScsi bus type
> +# @Sas: Win serial-attaches SCSI bus type
> +# @Mmc: Win multimedia card (MMC) bus type
> +# @Virtual: Win virtual bus type
> +# @FB: Win file-backed bus type
>  # Since: 2.2

Missing information about when elements were added: simplest (but
redundant) by adding '(since 2.4)' everywhere, or shorter (but might
cause grief down the road if we try to automate doc generation) by doing
something like:

# Since: 2.2; 'Unknown' and all later entries since 2.4

>  ##
>  { 'enum': 'GuestDiskBusType',
>    'data': [ 'ide', 'fdc', 'scsi', 'virtio', 'xen', 'usb', 'uml', 'sata',
> -            'sd' ] }
> +            'sd', 'unknown', '1394','Ssa', 'fibre', 'RAID', 'iScsi', 'sas',

Uggh - '1394' is a purely numeric enum name.  Not the first time (so the
qapi generator allows it), but we considered blacklisting future
additions of it:
https://lists.gnu.org/archive/html/qemu-devel/2015-05/msg00229.html
Denis V. Lunev June 19, 2015, 6:02 p.m. UTC | #2
On 19/06/15 20:10, Eric Blake wrote:
> On 06/19/2015 10:57 AM, Denis V. Lunev wrote:
>> From: Olga Krishtal <okrishtal@virtuozzo.com>
>>
>> According to Microsoft disk location path can be obtained via
>> IOCTL_SCSI_GET_ADDRESS. Unfortunately this ioctl can not be used for all
>> devices. There are certain bus types which could be obtained with this
>> API. Please refer to the following link for more details
>> https://technet.microsoft.com/en-us/library/ee851589(v=ws.10).aspx
>>
>> Bus type could be obtained using IOCTL_STORAGE_QUERY_PROPERTY. Enum
>> STORAGE_BUS_TYPE describes all buses supported by OS.
>>
>> Windows defines more bus types that Linux. Thus some values have been added
> s/that/than/
>
>> to GuestDiskBusType.
>>
>> Signed-off-by: Olga Krishtal <okrishtal@virtuozzo.com>
>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>> CC: Eric Blake <eblake@redhat.com>
>> CC: Michael Roth <mdroth@linux.vnet.ibm.com>
>> ---
>>   qga/commands-win32.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>>   qga/qapi-schema.json |  15 +++++-
>>   2 files changed, 139 insertions(+), 3 deletions(-)
>>
>> +static WinToLin buses[] = {
>> +    {BusTypeUnknown, GUEST_DISK_BUS_TYPE_UNKNOWN},
>> +    {BusTypeScsi, GUEST_DISK_BUS_TYPE_SCSI},
>> +    {BusTypeAtapi, GUEST_DISK_BUS_TYPE_IDE},
>> +    {BusTypeAta, GUEST_DISK_BUS_TYPE_IDE},
>> +    {BusType1394, GUEST_DISK_BUS_TYPE_1394},
>> +    {BusTypeSsa, GUEST_DISK_BUS_TYPE_SSA},
>> +    {BusTypeFibre, GUEST_DISK_BUS_TYPE_SSA},
>> +    {BusTypeUsb, GUEST_DISK_BUS_TYPE_USB},
>> +    {BusTypeRAID, GUEST_DISK_BUS_TYPE_RAID},
>> +#if (_WIN32_WINNT >= 0x0600)
>> +    {BusTypeiScsi, GUEST_DISK_BUS_TYPE_I_SCSI},
>> +    {BusTypeSas, GUEST_DISK_BUS_TYPE_SAS},
>> +    {BusTypeSata, GUEST_DISK_BUS_TYPE_SATA},
>> +    {BusTypeSd, GUEST_DISK_BUS_TYPE_SD},
>> +    {BusTypeMmc, GUEST_DISK_BUS_TYPE_MMC},
>> +    {BusTypeVirtual, GUEST_DISK_BUS_TYPE_VIRTUAL },
>> +    {BusTypeFileBackedVirtuaul, GUEST_DISK_BUS_TYPE_FBIRTUAL},
>> +    {BusTypeSpaces, GUEST_DISK_BUS_TYPE_SPACES}
>> +#endif
> I'd use a trailing comma, so that future additions can be pure additions
> rather than amending existing lines.
>
>
>> +++ b/qga/qapi-schema.json
>> @@ -711,6 +711,7 @@
>>   # @GuestDiskBusType
>>   #
>>   # An enumeration of bus type of disks
>> +# is devided a bit on Linux and Windows guest
>>   #
> s/devided/divided/
>
>>   # @ide: IDE disks
>>   # @fdc: floppy disks
>> @@ -721,12 +722,22 @@
>>   # @uml: UML disks
>>   # @sata: SATA disks
>>   # @sd: SD cards
>> -#
>> +# @Unknown: Unknown bus type
>> +# @1394: Win IEEE 1394 bus type
>> +# @Ssa: Win SSA bus type
>> +# @Fibre: Win fiber channel bus type
>> +# @Raid: Win RAID bus type
>> +# @iScsi: Win iScsi bus type
>> +# @Sas: Win serial-attaches SCSI bus type
>> +# @Mmc: Win multimedia card (MMC) bus type
>> +# @Virtual: Win virtual bus type
>> +# @FB: Win file-backed bus type
>>   # Since: 2.2
> Missing information about when elements were added: simplest (but
> redundant) by adding '(since 2.4)' everywhere, or shorter (but might
> cause grief down the road if we try to automate doc generation) by doing
> something like:
>
> # Since: 2.2; 'Unknown' and all later entries since 2.4
>
>>   ##
>>   { 'enum': 'GuestDiskBusType',
>>     'data': [ 'ide', 'fdc', 'scsi', 'virtio', 'xen', 'usb', 'uml', 'sata',
>> -            'sd' ] }
>> +            'sd', 'unknown', '1394','Ssa', 'fibre', 'RAID', 'iScsi', 'sas',
> Uggh - '1394' is a purely numeric enum name.  Not the first time (so the
> qapi generator allows it), but we considered blacklisting future
> additions of it:
> https://lists.gnu.org/archive/html/qemu-devel/2015-05/msg00229.html
>
no prob, we can change this to 'ieee1394', the rest here is clear, we'll
do that on Monday

Den
diff mbox

Patch

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 7acb258..09f0e82 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -16,6 +16,8 @@ 
 #include <powrprof.h>
 #include <stdio.h>
 #include <string.h>
+#include <winioctl.h>
+#include <ntddscsi.h>
 #include "qga/guest-agent-core.h"
 #include "qga/vss-win32.h"
 #include "qga-qmp-commands.h"
@@ -86,6 +88,44 @@  static OpenFlags *find_open_flag(const char *mode_str)
     return NULL;
 }
 
+typedef struct WinToLin {
+    STORAGE_BUS_TYPE win;
+    GuestDiskBusType lin;
+} WinToLin;
+
+static WinToLin buses[] = {
+    {BusTypeUnknown, GUEST_DISK_BUS_TYPE_UNKNOWN},
+    {BusTypeScsi, GUEST_DISK_BUS_TYPE_SCSI},
+    {BusTypeAtapi, GUEST_DISK_BUS_TYPE_IDE},
+    {BusTypeAta, GUEST_DISK_BUS_TYPE_IDE},
+    {BusType1394, GUEST_DISK_BUS_TYPE_1394},
+    {BusTypeSsa, GUEST_DISK_BUS_TYPE_SSA},
+    {BusTypeFibre, GUEST_DISK_BUS_TYPE_SSA},
+    {BusTypeUsb, GUEST_DISK_BUS_TYPE_USB},
+    {BusTypeRAID, GUEST_DISK_BUS_TYPE_RAID},
+#if (_WIN32_WINNT >= 0x0600)
+    {BusTypeiScsi, GUEST_DISK_BUS_TYPE_I_SCSI},
+    {BusTypeSas, GUEST_DISK_BUS_TYPE_SAS},
+    {BusTypeSata, GUEST_DISK_BUS_TYPE_SATA},
+    {BusTypeSd, GUEST_DISK_BUS_TYPE_SD},
+    {BusTypeMmc, GUEST_DISK_BUS_TYPE_MMC},
+    {BusTypeVirtual, GUEST_DISK_BUS_TYPE_VIRTUAL },
+    {BusTypeFileBackedVirtuaul, GUEST_DISK_BUS_TYPE_FBIRTUAL},
+    {BusTypeSpaces, GUEST_DISK_BUS_TYPE_SPACES}
+#endif
+};
+
+static GuestDiskBusType find_bus_type(STORAGE_BUS_TYPE bus)
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(buses); ++i) {
+        if (buses[i].win == bus) {
+            return buses[i].lin;
+        }
+    }
+    return GUEST_DISK_BUS_TYPE_MAX;
+}
+
 static int64_t guest_file_handle_add(HANDLE fh, HANDLE pipe_other_end_fd,
                                      Error **errp)
 {
@@ -769,6 +809,91 @@  done:
     return ge;
 }
 
+static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
+{
+    return NULL;
+}
+
+static int get_disk_bus_type(HANDLE vol_h, Error **errp)
+{
+    STORAGE_PROPERTY_QUERY query;
+    STORAGE_DEVICE_DESCRIPTOR *dev_desc, buf;
+    DWORD received;
+
+    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)) {
+        error_setg_win32(errp, GetLastError(), "failed to get bus type");
+        return -1;
+    }
+
+    return dev_desc->BusType;
+}
+
+static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
+{
+    /* VSS provider works with volumes, so there is no difference if
+    * the volume consist of spanned disks. As the result we can obtain
+    * info for first disk in the spanned disks group. */
+
+    GuestDiskAddressList *list;
+    GuestDiskAddress *disk;
+    SCSI_ADDRESS addr, *scsi_ad;
+    DWORD len;
+    int bus;
+    HANDLE vol_h;
+
+    scsi_ad = &addr;
+    char *name = g_strndup(guid, strlen(guid)-1);
+
+    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");
+        return NULL;
+    }
+    g_free(name);
+    bus = get_disk_bus_type(vol_h, errp);
+    if (bus < 0) {
+        return NULL;
+    }
+    disk = g_malloc0(sizeof(*disk));
+    disk->bus_type = find_bus_type(bus);
+    if (bus == BusTypeScsi || bus == BusTypeAta || bus == BusTypeRAID
+#if (_WIN32_WINNT >= 0x0600)
+            /* This bus type is not supported before Windows Server 2003 SP1 */
+            || bus == BusTypeSas
+#endif
+        ) {
+        /* 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 */
+        if (DeviceIoControl(vol_h, IOCTL_SCSI_GET_ADDRESS, NULL, 0, scsi_ad,
+                      sizeof(SCSI_ADDRESS), &len, NULL)) {
+            disk->unit = scsi_ad->Lun;
+            disk->target = scsi_ad->TargetId;
+            disk->bus = scsi_ad->PathId;
+            disk->pci_controller = get_pci_info(name, errp);
+        }
+        /* We do set error in this case, because we still have enough
+         * information about volume. */
+    } else {
+         disk->pci_controller = NULL;
+    }
+
+    list = g_malloc0(sizeof(*list));
+    list->value = disk;
+    list->next = NULL;
+    CloseHandle(vol_h);
+    return list;
+
+}
+
 static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
 {
     DWORD info_size;
@@ -812,7 +937,7 @@  static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
     fs->name = g_strdup(guid);
     fs->mountpoint = g_strndup(mnt_point, len);
     fs->type = g_strdup(fs_name);
-    fs->disk = NULL;
+    fs->disk = build_guest_disk_info(guid, errp);
     g_free(mnt_point);
     return fs;
 
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index 21997cf..59f6d9b 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -711,6 +711,7 @@ 
 # @GuestDiskBusType
 #
 # An enumeration of bus type of disks
+# is devided a bit on Linux and Windows guest
 #
 # @ide: IDE disks
 # @fdc: floppy disks
@@ -721,12 +722,22 @@ 
 # @uml: UML disks
 # @sata: SATA disks
 # @sd: SD cards
-#
+# @Unknown: Unknown bus type
+# @1394: Win IEEE 1394 bus type
+# @Ssa: Win SSA bus type
+# @Fibre: Win fiber channel bus type
+# @Raid: Win RAID bus type
+# @iScsi: Win iScsi bus type
+# @Sas: Win serial-attaches SCSI bus type
+# @Mmc: Win multimedia card (MMC) bus type
+# @Virtual: Win virtual bus type
+# @FB: Win file-backed bus type
 # Since: 2.2
 ##
 { 'enum': 'GuestDiskBusType',
   'data': [ 'ide', 'fdc', 'scsi', 'virtio', 'xen', 'usb', 'uml', 'sata',
-            'sd' ] }
+            'sd', 'unknown', '1394','Ssa', 'fibre', 'RAID', 'iScsi', 'sas',
+            'mmc', 'virtual', 'fbirtual' ] }
 
 ##
 # @GuestPCIAddress: