aboutsummaryrefslogtreecommitdiff
path: root/block-raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'block-raw.c')
-rw-r--r--block-raw.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/block-raw.c b/block-raw.c
index 77502b0979..413a8c4732 100644
--- a/block-raw.c
+++ b/block-raw.c
@@ -207,10 +207,11 @@ typedef struct RawAIOCB {
static int aio_sig_num = SIGUSR2;
static BlockDriverAIOCB *first_aio; /* AIO issued */
+static int aio_initialized = 0;
-#ifndef QEMU_TOOL
static void aio_signal_handler(int signum)
{
+#ifndef QEMU_TOOL
CPUState *env = cpu_single_env;
if (env) {
/* stop the currently executing cpu because a timer occured */
@@ -221,11 +222,14 @@ static void aio_signal_handler(int signum)
}
#endif
}
+#endif
}
void qemu_aio_init(void)
{
struct sigaction act;
+
+ aio_initialized = 1;
sigfillset(&act.sa_mask);
act.sa_flags = 0; /* do not restart syscalls to interrupt select() */
@@ -242,7 +246,6 @@ void qemu_aio_init(void)
aio_init(&ai);
}
}
-#endif /* !QEMU_TOOL */
void qemu_aio_poll(void)
{
@@ -293,6 +296,9 @@ static sigset_t wait_oset;
void qemu_aio_wait_start(void)
{
sigset_t set;
+
+ if (!aio_initialized)
+ qemu_aio_init();
sigemptyset(&set);
sigaddset(&set, aio_sig_num);
sigprocmask(SIG_BLOCK, &set, &wait_oset);
@@ -570,7 +576,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
} else {
access_flags = GENERIC_READ;
}
- if (flags & BDRV_O_CREATE) {
+ if (flags & BDRV_O_CREAT) {
create_flags = CREATE_ALWAYS;
} else {
create_flags = OPEN_EXISTING;
@@ -632,15 +638,17 @@ static int raw_aio_new(BlockDriverAIOCB *acb)
if (!acb1)
return -ENOMEM;
acb->opaque = acb1;
- s->hevent = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!s->hevent)
+ s->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (!s->hEvent)
return -ENOMEM;
return 0;
}
static void raw_aio_cb(void *opaque)
{
- BlockDriverAIOCB *acb = acb1;
+ BlockDriverAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->bs;
+ BDRVRawState *s = bs->opaque;
RawAIOCB *acb1 = acb->opaque;
DWORD ret_count;
int ret;
@@ -659,7 +667,6 @@ static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num,
BlockDriverState *bs = acb->bs;
BDRVRawState *s = bs->opaque;
RawAIOCB *acb1 = acb->opaque;
- DWORD ret_count;
int ret;
int64_t offset;
@@ -682,7 +689,6 @@ static int raw_aio_write(BlockDriverAIOCB *acb, int64_t sector_num,
BlockDriverState *bs = acb->bs;
BDRVRawState *s = bs->opaque;
RawAIOCB *acb1 = acb->opaque;
- DWORD ret_count;
int ret;
int64_t offset;
@@ -734,8 +740,8 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset)
BDRVRawState *s = bs->opaque;
DWORD low, high;
- low = length;
- high = length >> 32;
+ low = offset;
+ high = offset >> 32;
if (!SetFilePointer(s->hfile, low, &high, FILE_BEGIN))
return -EIO;
if (!SetEndOfFile(s->hfile))