Revision 03ff3ca3 block-raw-win32.c
b/block-raw-win32.c | ||
---|---|---|
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 | 24 |
#include "qemu-common.h" |
25 |
#ifndef QEMU_IMG |
|
26 | 25 |
#include "qemu-timer.h" |
27 |
#include "exec-all.h" |
|
28 |
#endif |
|
29 | 26 |
#include "block_int.h" |
30 | 27 |
#include <assert.h> |
31 | 28 |
#include <winioctl.h> |
32 | 29 |
|
30 |
//#define WIN32_AIO |
|
31 |
|
|
33 | 32 |
#define FTYPE_FILE 0 |
34 | 33 |
#define FTYPE_CD 1 |
35 | 34 |
#define FTYPE_HARDDISK 2 |
... | ... | |
100 | 99 |
} else { |
101 | 100 |
create_flags = OPEN_EXISTING; |
102 | 101 |
} |
103 |
#ifdef QEMU_IMG |
|
104 |
overlapped = FILE_ATTRIBUTE_NORMAL; |
|
105 |
#else |
|
102 |
#ifdef WIN32_AIO |
|
106 | 103 |
overlapped = FILE_FLAG_OVERLAPPED; |
104 |
#else |
|
105 |
overlapped = FILE_ATTRIBUTE_NORMAL; |
|
107 | 106 |
#endif |
108 | 107 |
if (flags & BDRV_O_DIRECT) |
109 | 108 |
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; |
... | ... | |
133 | 132 |
ov.OffsetHigh = offset >> 32; |
134 | 133 |
ret = ReadFile(s->hfile, buf, count, &ret_count, &ov); |
135 | 134 |
if (!ret) { |
135 |
#ifdef WIN32_AIO |
|
136 | 136 |
ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); |
137 | 137 |
if (!ret) |
138 | 138 |
return -EIO; |
139 | 139 |
else |
140 |
#endif |
|
140 | 141 |
return ret_count; |
141 | 142 |
} |
142 | 143 |
return ret_count; |
... | ... | |
155 | 156 |
ov.OffsetHigh = offset >> 32; |
156 | 157 |
ret = WriteFile(s->hfile, buf, count, &ret_count, &ov); |
157 | 158 |
if (!ret) { |
159 |
#ifdef WIN32_AIO |
|
158 | 160 |
ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); |
159 | 161 |
if (!ret) |
160 | 162 |
return -EIO; |
161 | 163 |
else |
164 |
#endif |
|
162 | 165 |
return ret_count; |
163 | 166 |
} |
164 | 167 |
return ret_count; |
165 | 168 |
} |
166 | 169 |
|
167 |
#if 0 |
|
168 |
#ifndef QEMU_IMG |
|
170 |
#ifdef WIN32_AIO |
|
169 | 171 |
static void raw_aio_cb(void *opaque) |
170 | 172 |
{ |
171 | 173 |
RawAIOCB *acb = opaque; |
... | ... | |
181 | 183 |
acb->common.cb(acb->common.opaque, 0); |
182 | 184 |
} |
183 | 185 |
} |
184 |
#endif |
|
185 | 186 |
|
186 | 187 |
static RawAIOCB *raw_aio_setup(BlockDriverState *bs, |
187 | 188 |
int64_t sector_num, uint8_t *buf, int nb_sectors, |
... | ... | |
204 | 205 |
acb->ov.OffsetHigh = offset >> 32; |
205 | 206 |
acb->ov.hEvent = acb->hEvent; |
206 | 207 |
acb->count = nb_sectors * 512; |
207 |
#ifndef QEMU_IMG |
|
208 | 208 |
qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb); |
209 |
#endif |
|
210 | 209 |
return acb; |
211 | 210 |
} |
212 | 211 |
|
... | ... | |
226 | 225 |
qemu_aio_release(acb); |
227 | 226 |
return NULL; |
228 | 227 |
} |
229 |
#ifdef QEMU_IMG |
|
230 | 228 |
qemu_aio_release(acb); |
231 |
#endif |
|
232 | 229 |
return (BlockDriverAIOCB *)acb; |
233 | 230 |
} |
234 | 231 |
|
... | ... | |
248 | 245 |
qemu_aio_release(acb); |
249 | 246 |
return NULL; |
250 | 247 |
} |
251 |
#ifdef QEMU_IMG |
|
252 | 248 |
qemu_aio_release(acb); |
253 |
#endif |
|
254 | 249 |
return (BlockDriverAIOCB *)acb; |
255 | 250 |
} |
256 | 251 |
|
257 | 252 |
static void raw_aio_cancel(BlockDriverAIOCB *blockacb) |
258 | 253 |
{ |
259 |
#ifndef QEMU_IMG |
|
260 | 254 |
RawAIOCB *acb = (RawAIOCB *)blockacb; |
261 | 255 |
BlockDriverState *bs = acb->common.bs; |
262 | 256 |
BDRVRawState *s = bs->opaque; |
... | ... | |
265 | 259 |
/* XXX: if more than one async I/O it is not correct */ |
266 | 260 |
CancelIo(s->hfile); |
267 | 261 |
qemu_aio_release(acb); |
268 |
#endif |
|
269 | 262 |
} |
270 |
#endif /* #if 0 */
|
|
263 |
#endif /* #if WIN32_AIO */
|
|
271 | 264 |
|
272 | 265 |
static void raw_flush(BlockDriverState *bs) |
273 | 266 |
{ |
... | ... | |
356 | 349 |
|
357 | 350 |
void qemu_aio_wait(void) |
358 | 351 |
{ |
359 |
#ifndef QEMU_IMG |
|
360 | 352 |
qemu_bh_poll(); |
361 |
#endif |
|
362 | 353 |
} |
363 | 354 |
|
364 | 355 |
BlockDriver bdrv_raw = { |
... | ... | |
372 | 363 |
raw_create, |
373 | 364 |
raw_flush, |
374 | 365 |
|
375 |
#if 0
|
|
366 |
#ifdef WIN32_AIO
|
|
376 | 367 |
.bdrv_aio_read = raw_aio_read, |
377 | 368 |
.bdrv_aio_write = raw_aio_write, |
378 | 369 |
.bdrv_aio_cancel = raw_aio_cancel, |
... | ... | |
458 | 449 |
} |
459 | 450 |
create_flags = OPEN_EXISTING; |
460 | 451 |
|
461 |
#ifdef QEMU_IMG |
|
462 |
overlapped = FILE_ATTRIBUTE_NORMAL; |
|
463 |
#else |
|
452 |
#ifdef WIN32_AIO |
|
464 | 453 |
overlapped = FILE_FLAG_OVERLAPPED; |
454 |
#else |
|
455 |
overlapped = FILE_ATTRIBUTE_NORMAL; |
|
465 | 456 |
#endif |
466 | 457 |
if (flags & BDRV_O_DIRECT) |
467 | 458 |
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; |
... | ... | |
524 | 515 |
NULL, |
525 | 516 |
raw_flush, |
526 | 517 |
|
527 |
#if 0
|
|
518 |
#ifdef WIN32_AIO
|
|
528 | 519 |
.bdrv_aio_read = raw_aio_read, |
529 | 520 |
.bdrv_aio_write = raw_aio_write, |
530 | 521 |
.bdrv_aio_cancel = raw_aio_cancel, |
Also available in: Unified diff