Commit 9e65fd65 authored by Tomáš Golembiovský's avatar Tomáš Golembiovský Committed by Michael Roth
Browse files

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: default avatarTomáš Golembiovský <tgolembi@redhat.com>
Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
parent fb08aa70
Loading
Loading
Loading
Loading
+35 −17
Original line number Diff line number Diff line
@@ -667,20 +667,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,
@@ -690,7 +685,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);
@@ -730,20 +724,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