Commit 6dd2db52a9b74984a7b14d4a7dc9d55af1c80a1c
1 parent
dceaf394
Revert 4367
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4377 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
6 additions
and
113 deletions
block-raw-posix.c
... | ... | @@ -77,10 +77,10 @@ |
77 | 77 | typedef struct BDRVRawState { |
78 | 78 | int fd; |
79 | 79 | int type; |
80 | - int open_flags; | |
81 | 80 | unsigned int lseek_err_cnt; |
82 | 81 | #if defined(__linux__) |
83 | 82 | /* linux floppy specific */ |
83 | + int fd_open_flags; | |
84 | 84 | int64_t fd_open_time; |
85 | 85 | int64_t fd_error_time; |
86 | 86 | int fd_got_error; |
... | ... | @@ -111,7 +111,6 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
111 | 111 | open_flags |= O_DIRECT; |
112 | 112 | #endif |
113 | 113 | |
114 | - s->open_flags = open_flags; | |
115 | 114 | s->type = FTYPE_FILE; |
116 | 115 | |
117 | 116 | fd = open(filename, open_flags, 0644); |
... | ... | @@ -142,14 +141,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
142 | 141 | #endif |
143 | 142 | */ |
144 | 143 | |
145 | -/* | |
146 | - * offset and count are in bytes, but must be multiples of 512 for files | |
147 | - * opened with O_DIRECT. buf must be aligned to 512 bytes then. | |
148 | - * | |
149 | - * This function may be called without alignment if the caller ensures | |
150 | - * that O_DIRECT is not in effect. | |
151 | - */ | |
152 | -static int raw_pread_aligned(BlockDriverState *bs, int64_t offset, | |
144 | +static int raw_pread(BlockDriverState *bs, int64_t offset, | |
153 | 145 | uint8_t *buf, int count) |
154 | 146 | { |
155 | 147 | BDRVRawState *s = bs->opaque; |
... | ... | @@ -202,14 +194,7 @@ label__raw_read__success: |
202 | 194 | return ret; |
203 | 195 | } |
204 | 196 | |
205 | -/* | |
206 | - * offset and count are in bytes, but must be multiples of 512 for files | |
207 | - * opened with O_DIRECT. buf must be aligned to 512 bytes then. | |
208 | - * | |
209 | - * This function may be called without alignment if the caller ensures | |
210 | - * that O_DIRECT is not in effect. | |
211 | - */ | |
212 | -static int raw_pwrite_aligned(BlockDriverState *bs, int64_t offset, | |
197 | +static int raw_pwrite(BlockDriverState *bs, int64_t offset, | |
213 | 198 | const uint8_t *buf, int count) |
214 | 199 | { |
215 | 200 | BDRVRawState *s = bs->opaque; |
... | ... | @@ -245,67 +230,6 @@ label__raw_write__success: |
245 | 230 | return ret; |
246 | 231 | } |
247 | 232 | |
248 | - | |
249 | -#ifdef O_DIRECT | |
250 | -/* | |
251 | - * offset and count are in bytes and possibly not aligned. For files opened | |
252 | - * with O_DIRECT, necessary alignments are ensured before calling | |
253 | - * raw_pread_aligned to do the actual read. | |
254 | - */ | |
255 | -static int raw_pread(BlockDriverState *bs, int64_t offset, | |
256 | - uint8_t *buf, int count) | |
257 | -{ | |
258 | - BDRVRawState *s = bs->opaque; | |
259 | - | |
260 | - if (unlikely((s->open_flags & O_DIRECT) && | |
261 | - (offset % 512 || count % 512 || (uintptr_t) buf % 512))) { | |
262 | - | |
263 | - int ret; | |
264 | - | |
265 | - // Temporarily disable O_DIRECT for unaligned access | |
266 | - fcntl(s->fd, F_SETFL, s->open_flags & ~O_DIRECT); | |
267 | - ret = raw_pread_aligned(bs, offset, buf, count); | |
268 | - fcntl(s->fd, F_SETFL, s->open_flags); | |
269 | - | |
270 | - return ret; | |
271 | - | |
272 | - } else { | |
273 | - return raw_pread_aligned(bs, offset, buf, count); | |
274 | - } | |
275 | -} | |
276 | - | |
277 | -/* | |
278 | - * offset and count are in bytes and possibly not aligned. For files opened | |
279 | - * with O_DIRECT, necessary alignments are ensured before calling | |
280 | - * raw_pwrite_aligned to do the actual write. | |
281 | - */ | |
282 | -static int raw_pwrite(BlockDriverState *bs, int64_t offset, | |
283 | - const uint8_t *buf, int count) | |
284 | -{ | |
285 | - BDRVRawState *s = bs->opaque; | |
286 | - | |
287 | - if (unlikely((s->open_flags & O_DIRECT) && | |
288 | - (offset % 512 || count % 512 || (uintptr_t) buf % 512))) { | |
289 | - | |
290 | - int ret; | |
291 | - | |
292 | - // Temporarily disable O_DIRECT for unaligned access | |
293 | - fcntl(s->fd, F_SETFL, s->open_flags & ~O_DIRECT); | |
294 | - ret = raw_pwrite_aligned(bs, offset, buf, count); | |
295 | - fcntl(s->fd, F_SETFL, s->open_flags); | |
296 | - | |
297 | - return ret; | |
298 | - } else { | |
299 | - return raw_pwrite_aligned(bs, offset, buf, count); | |
300 | - } | |
301 | -} | |
302 | - | |
303 | -#else | |
304 | -#define raw_pread raw_pread_aligned | |
305 | -#define raw_pwrite raw_pwrite_aligned | |
306 | -#endif | |
307 | - | |
308 | - | |
309 | 233 | /***********************************************************/ |
310 | 234 | /* Unix AIO using POSIX AIO */ |
311 | 235 | |
... | ... | @@ -478,26 +402,10 @@ static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs, |
478 | 402 | BlockDriverCompletionFunc *cb, void *opaque) |
479 | 403 | { |
480 | 404 | RawAIOCB *acb; |
481 | - BDRVRawState *s = bs->opaque; | |
482 | - | |
483 | - /* | |
484 | - * If O_DIRECT is used and the buffer is not aligned fall back | |
485 | - * to synchronous IO. | |
486 | - */ | |
487 | - if (unlikely((s->open_flags & O_DIRECT) && ((uintptr_t) buf % 512))) { | |
488 | - int ret; | |
489 | - | |
490 | - acb = qemu_aio_get(bs, cb, opaque); | |
491 | - ret = raw_pread(bs, 512 * sector_num, buf, 512 * nb_sectors); | |
492 | - acb->common.cb(acb->common.opaque, ret); | |
493 | - qemu_aio_release(acb); | |
494 | - return &acb->common; | |
495 | - } | |
496 | 405 | |
497 | 406 | acb = raw_aio_setup(bs, sector_num, buf, nb_sectors, cb, opaque); |
498 | 407 | if (!acb) |
499 | 408 | return NULL; |
500 | - | |
501 | 409 | if (aio_read(&acb->aiocb) < 0) { |
502 | 410 | qemu_aio_release(acb); |
503 | 411 | return NULL; |
... | ... | @@ -510,21 +418,6 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs, |
510 | 418 | BlockDriverCompletionFunc *cb, void *opaque) |
511 | 419 | { |
512 | 420 | RawAIOCB *acb; |
513 | - BDRVRawState *s = bs->opaque; | |
514 | - | |
515 | - /* | |
516 | - * If O_DIRECT is used and the buffer is not aligned fall back | |
517 | - * to synchronous IO. | |
518 | - */ | |
519 | - if (unlikely((s->open_flags & O_DIRECT) && ((uintptr_t) buf % 512))) { | |
520 | - int ret; | |
521 | - | |
522 | - acb = qemu_aio_get(bs, cb, opaque); | |
523 | - ret = raw_pwrite(bs, 512 * sector_num, buf, 512 * nb_sectors); | |
524 | - acb->common.cb(acb->common.opaque, ret); | |
525 | - qemu_aio_release(acb); | |
526 | - return &acb->common; | |
527 | - } | |
528 | 421 | |
529 | 422 | acb = raw_aio_setup(bs, sector_num, (uint8_t*)buf, nb_sectors, cb, opaque); |
530 | 423 | if (!acb) |
... | ... | @@ -786,7 +679,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
786 | 679 | s->type = FTYPE_CD; |
787 | 680 | } else if (strstart(filename, "/dev/fd", NULL)) { |
788 | 681 | s->type = FTYPE_FD; |
789 | - s->open_flags = open_flags; | |
682 | + s->fd_open_flags = open_flags; | |
790 | 683 | /* open will not fail even if no floppy is inserted */ |
791 | 684 | open_flags |= O_NONBLOCK; |
792 | 685 | } else if (strstart(filename, "/dev/sg", NULL)) { |
... | ... | @@ -841,7 +734,7 @@ static int fd_open(BlockDriverState *bs) |
841 | 734 | #endif |
842 | 735 | return -EIO; |
843 | 736 | } |
844 | - s->fd = open(bs->filename, s->open_flags); | |
737 | + s->fd = open(bs->filename, s->fd_open_flags); | |
845 | 738 | if (s->fd < 0) { |
846 | 739 | s->fd_error_time = qemu_get_clock(rt_clock); |
847 | 740 | s->fd_got_error = 1; |
... | ... | @@ -938,7 +831,7 @@ static int raw_eject(BlockDriverState *bs, int eject_flag) |
938 | 831 | close(s->fd); |
939 | 832 | s->fd = -1; |
940 | 833 | } |
941 | - fd = open(bs->filename, s->open_flags | O_NONBLOCK); | |
834 | + fd = open(bs->filename, s->fd_open_flags | O_NONBLOCK); | |
942 | 835 | if (fd >= 0) { |
943 | 836 | if (ioctl(fd, FDEJECT, 0) < 0) |
944 | 837 | perror("FDEJECT"); | ... | ... |