qga-win: refactor disk info

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>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Tomáš Golembiovský 2018-10-23 13:23:20 +02:00 committed by Michael Roth
parent fb08aa703f
commit 9e65fd659e

View File

@ -667,20 +667,15 @@ out_free:
return; return;
} }
/* VSS provider works with volumes, thus there is no difference if static void get_single_disk_info(char *name, GuestDiskAddress *disk,
* the volume consist of spanned disks. Info about the first disk in the Error **errp)
* volume is returned for the spanned disk group (LVM) */
static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
{ {
GuestDiskAddressList *list = NULL;
GuestDiskAddress *disk;
SCSI_ADDRESS addr, *scsi_ad; SCSI_ADDRESS addr, *scsi_ad;
DWORD len; DWORD len;
HANDLE vol_h; HANDLE vol_h;
Error *local_err = NULL; Error *local_err = NULL;
scsi_ad = &addr; scsi_ad = &addr;
char *name = g_strndup(guid, strlen(guid)-1);
g_debug("getting disk info for: %s", name); g_debug("getting disk info for: %s", name);
vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, vol_h = CreateFile(name, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
@ -690,7 +685,6 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
goto err; goto err;
} }
disk = g_malloc0(sizeof(*disk));
get_disk_properties(vol_h, disk, &local_err); get_disk_properties(vol_h, disk, &local_err);
if (local_err) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
@ -730,20 +724,44 @@ static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
* information about volume. */ * information about volume. */
} }
list = g_malloc0(sizeof(*list));
list->value = disk;
list->next = NULL;
CloseHandle(vol_h);
g_free(name);
return list;
err_close: err_close:
g_free(disk);
CloseHandle(vol_h); CloseHandle(vol_h);
err: 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); g_free(name);
return NULL; return list;
} }
#else #else