Skip to content

Commit

Permalink
block/raw-win32: create one QEMUWin32AIOState per BDRVRawState
Browse files Browse the repository at this point in the history
Each QEMUWin32AIOState event notifier is associated with an AioContext.
Since BlockDriverState instances can use different AioContexts we cannot
continue to use a global QEMUWin32AIOState.

Let each BDRVRawState have its own QEMUWin32AIOState and free it when
BDRVRawState is closed.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
stefanhaRH committed Jun 4, 2014
1 parent abd269b commit 99cc598
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
1 change: 1 addition & 0 deletions block/raw-aio.h
Expand Up @@ -45,6 +45,7 @@ void laio_attach_aio_context(void *s, AioContext *new_context);
#ifdef _WIN32
typedef struct QEMUWin32AIOState QEMUWin32AIOState;
QEMUWin32AIOState *win32_aio_init(void);
void win32_aio_cleanup(QEMUWin32AIOState *aio);
int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile);
BlockDriverAIOCB *win32_aio_submit(BlockDriverState *bs,
QEMUWin32AIOState *aio, HANDLE hfile,
Expand Down
29 changes: 16 additions & 13 deletions block/raw-win32.c
Expand Up @@ -36,8 +36,6 @@
#define FTYPE_CD 1
#define FTYPE_HARDDISK 2

static QEMUWin32AIOState *aio;

typedef struct RawWin32AIOData {
BlockDriverState *bs;
HANDLE hfile;
Expand Down Expand Up @@ -300,15 +298,6 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,

raw_parse_flags(flags, &access_flags, &overlapped);

if ((flags & BDRV_O_NATIVE_AIO) && aio == NULL) {
aio = win32_aio_init();
if (aio == NULL) {
error_setg(errp, "Could not initialize AIO");
ret = -EINVAL;
goto fail;
}
}

if (filename[0] && filename[1] == ':') {
snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", filename[0]);
} else if (filename[0] == '\\' && filename[1] == '\\') {
Expand All @@ -335,13 +324,21 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
}

if (flags & BDRV_O_NATIVE_AIO) {
ret = win32_aio_attach(aio, s->hfile);
s->aio = win32_aio_init();
if (s->aio == NULL) {
CloseHandle(s->hfile);
error_setg(errp, "Could not initialize AIO");
ret = -EINVAL;
goto fail;
}

ret = win32_aio_attach(s->aio, s->hfile);
if (ret < 0) {
win32_aio_cleanup(s->aio);
CloseHandle(s->hfile);
error_setg_errno(errp, -ret, "Could not enable AIO");
goto fail;
}
s->aio = aio;
}

raw_probe_alignment(bs);
Expand Down Expand Up @@ -389,6 +386,12 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
static void raw_close(BlockDriverState *bs)
{
BDRVRawState *s = bs->opaque;

if (s->aio) {
win32_aio_cleanup(s->aio);
s->aio = NULL;
}

CloseHandle(s->hfile);
if (bs->open_flags & BDRV_O_TEMPORARY) {
unlink(bs->filename);
Expand Down
8 changes: 8 additions & 0 deletions block/win32-aio.c
Expand Up @@ -204,3 +204,11 @@ QEMUWin32AIOState *win32_aio_init(void)
g_free(s);
return NULL;
}

void win32_aio_cleanup(QEMUWin32AIOState *aio)
{
qemu_aio_set_event_notifier(&aio->e, NULL);
CloseHandle(aio->hIOCP);
event_notifier_cleanup(&aio->e);
g_free(aio);
}

0 comments on commit 99cc598

Please sign in to comment.