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"); | ... | ... |