From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:37717) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SfdRV-0005GO-6S for qemu-devel@nongnu.org; Fri, 15 Jun 2012 16:48:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SfdRT-00017Z-B9 for qemu-devel@nongnu.org; Fri, 15 Jun 2012 16:48:28 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:56979) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SfdRT-00016o-4b for qemu-devel@nongnu.org; Fri, 15 Jun 2012 16:48:27 -0400 Received: from /spool/local by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 15 Jun 2012 14:48:23 -0600 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id D7915C9005A for ; Fri, 15 Jun 2012 16:48:18 -0400 (EDT) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q5FKmJfW163324 for ; Fri, 15 Jun 2012 16:48:19 -0400 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q5FKmJmX002902 for ; Fri, 15 Jun 2012 16:48:19 -0400 From: Supriya Kannery Date: Sat, 16 Jun 2012 02:18:15 +0530 Message-Id: <20120615204815.9853.28942.sendpatchset@skannery.in.ibm.com> In-Reply-To: <20120615204648.9853.1225.sendpatchset@skannery.in.ibm.com> References: <20120615204648.9853.1225.sendpatchset@skannery.in.ibm.com> Subject: [Qemu-devel] [v1 Patch 6/10]Qemu: raw-win32 image file reopen List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Shrinidhi Joshi , Stefan Hajnoczi , Jeff Cody , Luiz Capitulino , Christoph Hellwig raw-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 Signed-off-by: Shrinidhi Joshi 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 +#include #include #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; + } + } + } else { + + DuplicateHandle(GetCurrentProcess(), + raw_rs->stash_hfile, + GetCurrentProcess(), + &s->hfile, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + bs->drv->bdrv_close(bs); + ret = bs->drv->bdrv_open(bs, bs->filename, flags); + } + return ret; +} + + +static void raw_reopen_commit(BlockDriverState *bs, BDRVReopenState *rs) +{ + BDRVRawReopenState *raw_rs; + + raw_rs = container_of(rs, BDRVRawReopenState, reopen_state); + + /* clean up stashed handle */ + CloseHandle(raw_rs->stash_hfile); + g_free(raw_rs); + +} + +static void raw_reopen_abort(BlockDriverState *bs, BDRVReopenState *rs) +{ + + BDRVRawReopenState *raw_rs; + BDRVRawState *s = bs->opaque; + + raw_rs = container_of(rs, BDRVRawReopenState, reopen_state); + + if (s->hfile && (s->hfile != INVALID_HANDLE_VALUE)) { + CloseHandle(s->hfile); + } + s->hfile = raw_rs->stash_hfile; + s->overlapped = raw_rs->stash_overlapped; + g_free(raw_rs); +} + static int raw_read(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors) {