[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC Patch 6/7]Qemu: raw-win32 image file reopen
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-devel] [RFC Patch 6/7]Qemu: raw-win32 image file reopen |
Date: |
Wed, 08 Feb 2012 16:02:55 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20111222 Thunderbird/9.0 |
Am 01.02.2012 04:07, schrieb Supriya Kannery:
> win32 driver changes for bdrv_reopen_xx functions to
> safely reopen image files. Reopening of image files while
> changing hostcache dynamically is handled here.
>
> Signed-off-by: Supriya Kannery <address@hidden>
>
> Index: qemu/block/raw-win32.c
> ===================================================================
> --- qemu.orig/block/raw-win32.c
> +++ qemu/block/raw-win32.c
> @@ -26,18 +26,27 @@
> #include "block_int.h"
> #include "module.h"
> #include <windows.h>
> +#include <winbase.h>
> #include <winioctl.h>
>
> #define FTYPE_FILE 0
> #define FTYPE_CD 1
> #define FTYPE_HARDDISK 2
> +#define WINDOWS_VISTA 6
>
> typedef struct BDRVRawState {
> HANDLE hfile;
> int type;
> char drive_path[16]; /* format: "d:\" */
> + DWORD overlapped;
> } BDRVRawState;
>
> +typedef struct BDRVRawReopenState {
> + BDRVReopenState reopen_state;
> + HANDLE stash_hfile;
> + DWORD stash_overlapped;
> +} BDRVRawReopenState;
> +
> int qemu_ftruncate64(int fd, int64_t length)
> {
> LARGE_INTEGER li;
> @@ -106,9 +115,96 @@ static int raw_open(BlockDriverState *bs
> return -EACCES;
> return -1;
> }
> + s->overlapped = overlapped;
> return 0;
> }
>
> +static int raw_reopen_prepare(BlockDriverState *bs, BDRVReopenState **prs,
> + int flags)
> +{
> + BDRVRawReopenState *raw_rs = g_malloc0(sizeof(BDRVRawReopenState));
> + BDRVRawState *s = bs->opaque;
> + int ret = 0;
> + OSVERSIONINFO osvi;
> + BOOL bIsWindowsVistaorLater;
> +
> + raw_rs->bs = bs;
> + raw_rs->stash_hfile = s->hfile;
> + raw_rs->stash_overlapped = s->overlapped;
> + *prs = raw_rs;
> +
> + if (flags & BDRV_O_NOCACHE) {
> + s->overlapped |= FILE_FLAG_NO_BUFFERING;
> + } else {
> + s->overlapped &= ~FILE_FLAG_NO_BUFFERING;
> + }
> +
> + if (!(flags & BDRV_O_CACHE_WB)) {
> + s->overlapped |= FILE_FLAG_WRITE_THROUGH;
> + } else {
> + s->overlapped &= ~FILE_FLAG_WRITE_THROUGH;
> + }
> +
> + ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
> + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
> +
> + GetVersionEx(&osvi);
> +
> + if (osvi.dwMajorVersion >= WINDOWS_VISTA) {
> + s->hfile = ReOpenFile(raw_rs->stash_hfile, 0, FILE_SHARE_READ,
> + overlapped);
> + if (s->hfile == INVALID_HANDLE_VALUE) {
> + int err = GetLastError();
> + if (err == ERROR_ACCESS_DENIED) {
> + ret = -EACCES;
> + } else {
> + ret = -1;
Returning -1 where -errno is expected is bad (turns out as -EPERM on
Linux, which is misleading). Maybe -EIO here.
Kevin
- Re: [Qemu-devel] [RFC Patch 6/7]Qemu: raw-win32 image file reopen,
Kevin Wolf <=