qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]