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:
parent
fb08aa703f
commit
9e65fd659e
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user