From patchwork Sat May 2 10:13:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Denis V. Lunev" X-Patchwork-Id: 467220 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BC89140311 for ; Sat, 2 May 2015 20:25:13 +1000 (AEST) Received: from localhost ([::1]:56563 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YoUbc-0000P8-L7 for incoming@patchwork.ozlabs.org; Sat, 02 May 2015 06:25:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49769) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YoUb4-0007kn-H5 for qemu-devel@nongnu.org; Sat, 02 May 2015 06:24:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YoUQ5-0004Xk-M0 for qemu-devel@nongnu.org; Sat, 02 May 2015 06:13:15 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:30557 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YoUQ5-0004Vb-8o for qemu-devel@nongnu.org; Sat, 02 May 2015 06:13:13 -0400 Received: from hades.sw.ru ([10.30.8.132]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id t42ACvSF017326; Sat, 2 May 2015 13:13:01 +0300 (MSK) From: "Denis V. Lunev" To: Date: Sat, 2 May 2015 13:13:19 +0300 Message-Id: <1430561601-19184-3-git-send-email-den@openvz.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1430561601-19184-1-git-send-email-den@openvz.org> References: <1430561601-19184-1-git-send-email-den@openvz.org> X-detected-operating-system: by eggs.gnu.org: OpenBSD 3.x X-Received-From: 195.214.232.25 Cc: Michael Roth , Olga Krishtal , qemu-devel@nongnu.org, "Denis V. Lunev" Subject: [Qemu-devel] [PATCH 2/4] qga: added mountpoint and filesystem type for single X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Olga Krishtal We should use GetVolumeXXX api to work with volumes. This will help us to resolve the situation with volumes without drive letter, i.e. when the volume is mounted as a folder. This case is called mounted folder. This volume is a regular mounted volume from all other points of view. The information about non mounted volume is reported as System Reserved. This volume is not mounted and thus it is not writable. GuestDiskAddressList API is not used as operations are performed with volumess rather when with disks. This means that spanned disk will be counted and handled as a single volume. It is worth to note that the information about every disk in the volume can be queried via IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Signed-off-by: Olga Krishtal Signed-off-by: Denis V. Lunev CC: Michael Roth --- qga/commands-win32.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 1a82ec9..d26fd59 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -384,7 +384,48 @@ static void guest_file_init(void) static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp) { - return NULL; + DWORD info_size; + char mnt, *mnt_point; + char fs_name[32]; + char vol_info[MAX_PATH+1]; + size_t len; + GuestFilesystemInfo *fs = NULL; + + GetVolumePathNamesForVolumeName(guid, mnt, NULL, &info_size); + if (GetLastError() != ERROR_MORE_DATA) { + error_setg_win32(errp, GetLastError(), "failed to get volume name"); + return NULL; + } + + mnt_point = g_malloc(info_size + 1); + if (!GetVolumePathNamesForVolumeName(guid, mnt_point, info_size, + &info_size)) { + error_setg_win32(errp, GetLastError(), "failed to get volume name"); + goto free; + } + + len = strlen(mnt_point); + mnt_point[len] = '\\'; + mnt_point[len+1] = 0; + if (!GetVolumeInformation(mnt_point, vol_info, sizeof(vol_info), NULL, NULL, + NULL, &fs_name, sizeof(fs_name))) { + error_setg_win32(errp, GetLastError(), "failed to get volume info"); + goto free; + } + + fs_name[sizeof(fs_name) - 1] = 0; + fs = g_malloc(sizeof(*fs)); + fs->name = g_strdup(guid); + if (len == 0) { + fs->mountpoint = g_strdup("System Reserved"); + } else { + fs->mountpoint = g_strndup(mnt_point, len); + } + fs->type = g_strdup(fs_name); + fs->disk = NULL; +free: + g_free(mnt_point); + return fs; } GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)