Revert r5532, r5536 and a piece of r5531.
[qemu] / block-raw-posix.c
1 /*
2  * Block driver for RAW files (posix)
3  *
4  * Copyright (c) 2006 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "qemu-common.h"
25 #include "qemu-timer.h"
26 #include "qemu-char.h"
27 #include "block_int.h"
28 #include <assert.h>
29 #ifdef CONFIG_AIO
30 #include <aio.h>
31 #endif
32
33 #ifdef CONFIG_COCOA
34 #include <paths.h>
35 #include <sys/param.h>
36 #include <IOKit/IOKitLib.h>
37 #include <IOKit/IOBSD.h>
38 #include <IOKit/storage/IOMediaBSDClient.h>
39 #include <IOKit/storage/IOMedia.h>
40 #include <IOKit/storage/IOCDMedia.h>
41 //#include <IOKit/storage/IOCDTypes.h>
42 #include <CoreFoundation/CoreFoundation.h>
43 #endif
44
45 #ifdef __sun__
46 #define _POSIX_PTHREAD_SEMANTICS 1
47 #include <signal.h>
48 #include <sys/dkio.h>
49 #endif
50 #ifdef __linux__
51 #include <sys/ioctl.h>
52 #include <linux/cdrom.h>
53 #include <linux/fd.h>
54 #endif
55 #ifdef __FreeBSD__
56 #include <signal.h>
57 #include <sys/disk.h>
58 #endif
59
60 #ifdef __OpenBSD__
61 #include <sys/ioctl.h>
62 #include <sys/disklabel.h>
63 #include <sys/dkio.h>
64 #endif
65
66 //#define DEBUG_FLOPPY
67
68 //#define DEBUG_BLOCK
69 #if defined(DEBUG_BLOCK)
70 #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0)  \
71     { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0)
72 #else
73 #define DEBUG_BLOCK_PRINT(formatCstr, args...)
74 #endif
75
76 /* OS X does not have O_DSYNC */
77 #ifndef O_DSYNC
78 #define O_DSYNC O_SYNC
79 #endif
80
81 /* Approximate O_DIRECT with O_DSYNC if O_DIRECT isn't available */
82 #ifndef O_DIRECT
83 #define O_DIRECT O_DSYNC
84 #endif
85
86 #define FTYPE_FILE   0
87 #define FTYPE_CD     1
88 #define FTYPE_FD     2
89
90 #define ALIGNED_BUFFER_SIZE (32 * 512)
91
92 /* if the FD is not accessed during that time (in ms), we try to
93    reopen it to see if the disk has been changed */
94 #define FD_OPEN_TIMEOUT 1000
95
96 /* posix-aio doesn't allow multiple outstanding requests to a single file
97  * descriptor.  we implement a pool of dup()'d file descriptors to work
98  * around this */
99 #define RAW_FD_POOL_SIZE        64
100
101 typedef struct BDRVRawState {
102     int fd;
103     int type;
104     unsigned int lseek_err_cnt;
105     int fd_pool[RAW_FD_POOL_SIZE];
106 #if defined(__linux__)
107     /* linux floppy specific */
108     int fd_open_flags;
109     int64_t fd_open_time;
110     int64_t fd_error_time;
111     int fd_got_error;
112     int fd_media_changed;
113 #endif
114     uint8_t* aligned_buf;
115 } BDRVRawState;
116
117 static int posix_aio_init(void);
118
119 static int fd_open(BlockDriverState *bs);
120
121 static int raw_open(BlockDriverState *bs, const char *filename, int flags)
122 {
123     BDRVRawState *s = bs->opaque;
124     int fd, open_flags, ret;
125     int i;
126
127     posix_aio_init();
128
129     s->lseek_err_cnt = 0;
130
131     open_flags = O_BINARY;
132     if ((flags & BDRV_O_ACCESS) == O_RDWR) {
133         open_flags |= O_RDWR;
134     } else {
135         open_flags |= O_RDONLY;
136         bs->read_only = 1;
137     }
138     if (flags & BDRV_O_CREAT)
139         open_flags |= O_CREAT | O_TRUNC;
140
141     /* Use O_DSYNC for write-through caching, no flags for write-back caching,
142      * and O_DIRECT for no caching. */
143     if ((flags & BDRV_O_NOCACHE))
144         open_flags |= O_DIRECT;
145     else if (!(flags & BDRV_O_CACHE_WB))
146         open_flags |= O_DSYNC;
147
148     s->type = FTYPE_FILE;
149
150     fd = open(filename, open_flags, 0644);
151     if (fd < 0) {
152         ret = -errno;
153         if (ret == -EROFS)
154             ret = -EACCES;
155         return ret;
156     }
157     s->fd = fd;
158     for (i = 0; i < RAW_FD_POOL_SIZE; i++)
159         s->fd_pool[i] = -1;
160     s->aligned_buf = NULL;
161     if ((flags & BDRV_O_NOCACHE)) {
162         s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
163         if (s->aligned_buf == NULL) {
164             ret = -errno;
165             close(fd);
166             return ret;
167         }
168     }
169     return 0;
170 }
171
172 /* XXX: use host sector size if necessary with:
173 #ifdef DIOCGSECTORSIZE
174         {
175             unsigned int sectorsize = 512;
176             if (!ioctl(fd, DIOCGSECTORSIZE, &sectorsize) &&
177                 sectorsize > bufsize)
178                 bufsize = sectorsize;
179         }
180 #endif
181 #ifdef CONFIG_COCOA
182         u_int32_t   blockSize = 512;
183         if ( !ioctl( fd, DKIOCGETBLOCKSIZE, &blockSize ) && blockSize > bufsize) {
184             bufsize = blockSize;
185         }
186 #endif
187 */
188
189 /*
190  * offset and count are in bytes, but must be multiples of 512 for files
191  * opened with O_DIRECT. buf must be aligned to 512 bytes then.
192  *
193  * This function may be called without alignment if the caller ensures
194  * that O_DIRECT is not in effect.
195  */
196 static int raw_pread_aligned(BlockDriverState *bs, int64_t offset,
197                      uint8_t *buf, int count)
198 {
199     BDRVRawState *s = bs->opaque;
200     int ret;
201
202     ret = fd_open(bs);
203     if (ret < 0)
204         return ret;
205
206     if (offset >= 0 && lseek(s->fd, offset, SEEK_SET) == (off_t)-1) {
207         ++(s->lseek_err_cnt);
208         if(s->lseek_err_cnt <= 10) {
209             DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
210                               "] lseek failed : %d = %s\n",
211                               s->fd, bs->filename, offset, buf, count,
212                               bs->total_sectors, errno, strerror(errno));
213         }
214         return -1;
215     }
216     s->lseek_err_cnt=0;
217
218     ret = read(s->fd, buf, count);
219     if (ret == count)
220         goto label__raw_read__success;
221
222     DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
223                       "] read failed %d : %d = %s\n",
224                       s->fd, bs->filename, offset, buf, count,
225                       bs->total_sectors, ret, errno, strerror(errno));
226
227     /* Try harder for CDrom. */
228     if (bs->type == BDRV_TYPE_CDROM) {
229         lseek(s->fd, offset, SEEK_SET);
230         ret = read(s->fd, buf, count);
231         if (ret == count)
232             goto label__raw_read__success;
233         lseek(s->fd, offset, SEEK_SET);
234         ret = read(s->fd, buf, count);
235         if (ret == count)
236             goto label__raw_read__success;
237
238         DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
239                           "] retry read failed %d : %d = %s\n",
240                           s->fd, bs->filename, offset, buf, count,
241                           bs->total_sectors, ret, errno, strerror(errno));
242     }
243
244 label__raw_read__success:
245
246     return ret;
247 }
248
249 /*
250  * offset and count are in bytes, but must be multiples of 512 for files
251  * opened with O_DIRECT. buf must be aligned to 512 bytes then.
252  *
253  * This function may be called without alignment if the caller ensures
254  * that O_DIRECT is not in effect.
255  */
256 static int raw_pwrite_aligned(BlockDriverState *bs, int64_t offset,
257                       const uint8_t *buf, int count)
258 {
259     BDRVRawState *s = bs->opaque;
260     int ret;
261
262     ret = fd_open(bs);
263     if (ret < 0)
264         return ret;
265
266     if (offset >= 0 && lseek(s->fd, offset, SEEK_SET) == (off_t)-1) {
267         ++(s->lseek_err_cnt);
268         if(s->lseek_err_cnt) {
269             DEBUG_BLOCK_PRINT("raw_pwrite(%d:%s, %" PRId64 ", %p, %d) [%"
270                               PRId64 "] lseek failed : %d = %s\n",
271                               s->fd, bs->filename, offset, buf, count,
272                               bs->total_sectors, errno, strerror(errno));
273         }
274         return -1;
275     }
276     s->lseek_err_cnt = 0;
277
278     ret = write(s->fd, buf, count);
279     if (ret == count)
280         goto label__raw_write__success;
281
282     DEBUG_BLOCK_PRINT("raw_pwrite(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
283                       "] write failed %d : %d = %s\n",
284                       s->fd, bs->filename, offset, buf, count,
285                       bs->total_sectors, ret, errno, strerror(errno));
286
287 label__raw_write__success:
288
289     return ret;
290 }
291
292
293 /*
294  * offset and count are in bytes and possibly not aligned. For files opened
295  * with O_DIRECT, necessary alignments are ensured before calling
296  * raw_pread_aligned to do the actual read.
297  */
298 static int raw_pread(BlockDriverState *bs, int64_t offset,
299                      uint8_t *buf, int count)
300 {
301     BDRVRawState *s = bs->opaque;
302     int size, ret, shift, sum;
303
304     sum = 0;
305
306     if (s->aligned_buf != NULL)  {
307
308         if (offset & 0x1ff) {
309             /* align offset on a 512 bytes boundary */
310
311             shift = offset & 0x1ff;
312             size = (shift + count + 0x1ff) & ~0x1ff;
313             if (size > ALIGNED_BUFFER_SIZE)
314                 size = ALIGNED_BUFFER_SIZE;
315             ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf, size);
316             if (ret < 0)
317                 return ret;
318
319             size = 512 - shift;
320             if (size > count)
321                 size = count;
322             memcpy(buf, s->aligned_buf + shift, size);
323
324             buf += size;
325             offset += size;
326             count -= size;
327             sum += size;
328
329             if (count == 0)
330                 return sum;
331         }
332         if (count & 0x1ff || (uintptr_t) buf & 0x1ff) {
333
334             /* read on aligned buffer */
335
336             while (count) {
337
338                 size = (count + 0x1ff) & ~0x1ff;
339                 if (size > ALIGNED_BUFFER_SIZE)
340                     size = ALIGNED_BUFFER_SIZE;
341
342                 ret = raw_pread_aligned(bs, offset, s->aligned_buf, size);
343                 if (ret < 0)
344                     return ret;
345
346                 size = ret;
347                 if (size > count)
348                     size = count;
349
350                 memcpy(buf, s->aligned_buf, size);
351
352                 buf += size;
353                 offset += size;
354                 count -= size;
355                 sum += size;
356             }
357
358             return sum;
359         }
360     }
361
362     return raw_pread_aligned(bs, offset, buf, count) + sum;
363 }
364
365 /*
366  * offset and count are in bytes and possibly not aligned. For files opened
367  * with O_DIRECT, necessary alignments are ensured before calling
368  * raw_pwrite_aligned to do the actual write.
369  */
370 static int raw_pwrite(BlockDriverState *bs, int64_t offset,
371                       const uint8_t *buf, int count)
372 {
373     BDRVRawState *s = bs->opaque;
374     int size, ret, shift, sum;
375
376     sum = 0;
377
378     if (s->aligned_buf != NULL) {
379
380         if (offset & 0x1ff) {
381             /* align offset on a 512 bytes boundary */
382             shift = offset & 0x1ff;
383             ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf, 512);
384             if (ret < 0)
385                 return ret;
386
387             size = 512 - shift;
388             if (size > count)
389                 size = count;
390             memcpy(s->aligned_buf + shift, buf, size);
391
392             ret = raw_pwrite_aligned(bs, offset - shift, s->aligned_buf, 512);
393             if (ret < 0)
394                 return ret;
395
396             buf += size;
397             offset += size;
398             count -= size;
399             sum += size;
400
401             if (count == 0)
402                 return sum;
403         }
404         if (count & 0x1ff || (uintptr_t) buf & 0x1ff) {
405
406             while ((size = (count & ~0x1ff)) != 0) {
407
408                 if (size > ALIGNED_BUFFER_SIZE)
409                     size = ALIGNED_BUFFER_SIZE;
410
411                 memcpy(s->aligned_buf, buf, size);
412
413                 ret = raw_pwrite_aligned(bs, offset, s->aligned_buf, size);
414                 if (ret < 0)
415                     return ret;
416
417                 buf += ret;
418                 offset += ret;
419                 count -= ret;
420                 sum += ret;
421             }
422             /* here, count < 512 because (count & ~0x1ff) == 0 */
423             if (count) {
424                 ret = raw_pread_aligned(bs, offset, s->aligned_buf, 512);
425                 if (ret < 0)
426                     return ret;
427                  memcpy(s->aligned_buf, buf, count);
428
429                  ret = raw_pwrite_aligned(bs, offset, s->aligned_buf, 512);
430                  if (ret < 0)
431                      return ret;
432                  if (count < ret)
433                      ret = count;
434
435                  sum += ret;
436             }
437             return sum;
438         }
439     }
440     return raw_pwrite_aligned(bs, offset, buf, count) + sum;
441 }
442
443 #ifdef CONFIG_AIO
444 /***********************************************************/
445 /* Unix AIO using POSIX AIO */
446
447 typedef struct RawAIOCB {
448     BlockDriverAIOCB common;
449     int fd;
450     struct aiocb aiocb;
451     struct RawAIOCB *next;
452     int ret;
453 } RawAIOCB;
454
455 typedef struct PosixAioState
456 {
457     int rfd, wfd;
458     RawAIOCB *first_aio;
459 } PosixAioState;
460
461 static int raw_fd_pool_get(BDRVRawState *s)
462 {
463     int i;
464
465     for (i = 0; i < RAW_FD_POOL_SIZE; i++) {
466         /* already in use */
467         if (s->fd_pool[i] != -1)
468             continue;
469
470         /* try to dup file descriptor */
471         s->fd_pool[i] = dup(s->fd);
472         if (s->fd_pool[i] != -1)
473             return s->fd_pool[i];
474     }
475
476     /* we couldn't dup the file descriptor so just use the main one */
477     return s->fd;
478 }
479
480 static void raw_fd_pool_put(RawAIOCB *acb)
481 {
482     BDRVRawState *s = acb->common.bs->opaque;
483     int i;
484
485     for (i = 0; i < RAW_FD_POOL_SIZE; i++) {
486         if (s->fd_pool[i] == acb->fd) {
487             close(s->fd_pool[i]);
488             s->fd_pool[i] = -1;
489         }
490     }
491 }
492
493 static void posix_aio_read(void *opaque)
494 {
495     PosixAioState *s = opaque;
496     RawAIOCB *acb, **pacb;
497     int ret;
498     ssize_t len;
499
500     do {
501         char byte;
502
503         len = read(s->rfd, &byte, 1);
504         if (len == -1 && errno == EINTR)
505             continue;
506         if (len == -1 && errno == EAGAIN)
507             break;
508     } while (len == -1);
509
510     for(;;) {
511         pacb = &s->first_aio;
512         for(;;) {
513             acb = *pacb;
514             if (!acb)
515                 goto the_end;
516             ret = aio_error(&acb->aiocb);
517             if (ret == ECANCELED) {
518                 /* remove the request */
519                 *pacb = acb->next;
520                 raw_fd_pool_put(acb);
521                 qemu_aio_release(acb);
522             } else if (ret != EINPROGRESS) {
523                 /* end of aio */
524                 if (ret == 0) {
525                     ret = aio_return(&acb->aiocb);
526                     if (ret == acb->aiocb.aio_nbytes)
527                         ret = 0;
528                     else
529                         ret = -EINVAL;
530                 } else {
531                     ret = -ret;
532                 }
533                 /* remove the request */
534                 *pacb = acb->next;
535                 /* call the callback */
536                 acb->common.cb(acb->common.opaque, ret);
537                 raw_fd_pool_put(acb);
538                 qemu_aio_release(acb);
539                 break;
540             } else {
541                 pacb = &acb->next;
542             }
543         }
544     }
545  the_end: ;
546 }
547
548 static int posix_aio_flush(void *opaque)
549 {
550     PosixAioState *s = opaque;
551     return !!s->first_aio;
552 }
553
554 static PosixAioState *posix_aio_state;
555
556 static void aio_signal_handler(int signum)
557 {
558     if (posix_aio_state) {
559         char byte = 0;
560
561         write(posix_aio_state->wfd, &byte, sizeof(byte));
562     }
563
564     qemu_service_io();
565 }
566
567 static int posix_aio_init(void)
568 {
569     struct sigaction act;
570     PosixAioState *s;
571     int fds[2];
572   
573     if (posix_aio_state)
574         return 0;
575
576     s = qemu_malloc(sizeof(PosixAioState));
577     if (s == NULL)
578         return -ENOMEM;
579
580     sigfillset(&act.sa_mask);
581     act.sa_flags = 0; /* do not restart syscalls to interrupt select() */
582     act.sa_handler = aio_signal_handler;
583     sigaction(SIGUSR2, &act, NULL);
584
585     s->first_aio = NULL;
586     if (pipe(fds) == -1) {
587         fprintf(stderr, "failed to create pipe\n");
588         return -errno;
589     }
590
591     s->rfd = fds[0];
592     s->wfd = fds[1];
593
594     fcntl(s->wfd, F_SETFL, O_NONBLOCK);
595
596     qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush, s);
597
598 #if defined(__linux__)
599     {
600         struct aioinit ai;
601
602         memset(&ai, 0, sizeof(ai));
603 #if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 4)
604         ai.aio_threads = 64;
605         ai.aio_num = 64;
606 #else
607         /* XXX: aio thread exit seems to hang on RedHat 9 and this init
608            seems to fix the problem. */
609         ai.aio_threads = 1;
610         ai.aio_num = 1;
611         ai.aio_idle_time = 365 * 100000;
612 #endif
613         aio_init(&ai);
614     }
615 #endif
616     posix_aio_state = s;
617
618     return 0;
619 }
620
621 static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
622         int64_t sector_num, uint8_t *buf, int nb_sectors,
623         BlockDriverCompletionFunc *cb, void *opaque)
624 {
625     BDRVRawState *s = bs->opaque;
626     RawAIOCB *acb;
627
628     if (fd_open(bs) < 0)
629         return NULL;
630
631     acb = qemu_aio_get(bs, cb, opaque);
632     if (!acb)
633         return NULL;
634     acb->fd = raw_fd_pool_get(s);
635     acb->aiocb.aio_fildes = acb->fd;
636     acb->aiocb.aio_sigevent.sigev_signo = SIGUSR2;
637     acb->aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
638     acb->aiocb.aio_buf = buf;
639     if (nb_sectors < 0)
640         acb->aiocb.aio_nbytes = -nb_sectors;
641     else
642         acb->aiocb.aio_nbytes = nb_sectors * 512;
643     acb->aiocb.aio_offset = sector_num * 512;
644     acb->next = posix_aio_state->first_aio;
645     posix_aio_state->first_aio = acb;
646     return acb;
647 }
648
649 static void raw_aio_em_cb(void* opaque)
650 {
651     RawAIOCB *acb = opaque;
652     acb->common.cb(acb->common.opaque, acb->ret);
653     qemu_aio_release(acb);
654 }
655
656 static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
657         int64_t sector_num, uint8_t *buf, int nb_sectors,
658         BlockDriverCompletionFunc *cb, void *opaque)
659 {
660     RawAIOCB *acb;
661
662     /*
663      * If O_DIRECT is used and the buffer is not aligned fall back
664      * to synchronous IO.
665      */
666     BDRVRawState *s = bs->opaque;
667
668     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
669         QEMUBH *bh;
670         acb = qemu_aio_get(bs, cb, opaque);
671         acb->ret = raw_pread(bs, 512 * sector_num, buf, 512 * nb_sectors);
672         bh = qemu_bh_new(raw_aio_em_cb, acb);
673         qemu_bh_schedule(bh);
674         return &acb->common;
675     }
676
677     acb = raw_aio_setup(bs, sector_num, buf, nb_sectors, cb, opaque);
678     if (!acb)
679         return NULL;
680     if (aio_read(&acb->aiocb) < 0) {
681         qemu_aio_release(acb);
682         return NULL;
683     }
684     return &acb->common;
685 }
686
687 static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs,
688         int64_t sector_num, const uint8_t *buf, int nb_sectors,
689         BlockDriverCompletionFunc *cb, void *opaque)
690 {
691     RawAIOCB *acb;
692
693     /*
694      * If O_DIRECT is used and the buffer is not aligned fall back
695      * to synchronous IO.
696      */
697     BDRVRawState *s = bs->opaque;
698
699     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
700         QEMUBH *bh;
701         acb = qemu_aio_get(bs, cb, opaque);
702         acb->ret = raw_pwrite(bs, 512 * sector_num, buf, 512 * nb_sectors);
703         bh = qemu_bh_new(raw_aio_em_cb, acb);
704         qemu_bh_schedule(bh);
705         return &acb->common;
706     }
707
708     acb = raw_aio_setup(bs, sector_num, (uint8_t*)buf, nb_sectors, cb, opaque);
709     if (!acb)
710         return NULL;
711     if (aio_write(&acb->aiocb) < 0) {
712         qemu_aio_release(acb);
713         return NULL;
714     }
715     return &acb->common;
716 }
717
718 static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
719 {
720     int ret;
721     RawAIOCB *acb = (RawAIOCB *)blockacb;
722     RawAIOCB **pacb;
723
724     ret = aio_cancel(acb->aiocb.aio_fildes, &acb->aiocb);
725     if (ret == AIO_NOTCANCELED) {
726         /* fail safe: if the aio could not be canceled, we wait for
727            it */
728         while (aio_error(&acb->aiocb) == EINPROGRESS);
729     }
730
731     /* remove the callback from the queue */
732     pacb = &posix_aio_state->first_aio;
733     for(;;) {
734         if (*pacb == NULL) {
735             break;
736         } else if (*pacb == acb) {
737             *pacb = acb->next;
738             raw_fd_pool_put(acb);
739             qemu_aio_release(acb);
740             break;
741         }
742         pacb = &acb->next;
743     }
744 }
745
746 #else /* CONFIG_AIO */
747 static int posix_aio_init(void)
748 {
749     return 0;
750 }
751 #endif /* CONFIG_AIO */
752
753 static void raw_close_fd_pool(BDRVRawState *s)
754 {
755     int i;
756
757     for (i = 0; i < RAW_FD_POOL_SIZE; i++) {
758         if (s->fd_pool[i] != -1) {
759             close(s->fd_pool[i]);
760             s->fd_pool[i] = -1;
761         }
762     }
763 }
764
765 static void raw_close(BlockDriverState *bs)
766 {
767     BDRVRawState *s = bs->opaque;
768     if (s->fd >= 0) {
769         close(s->fd);
770         s->fd = -1;
771         if (s->aligned_buf != NULL)
772             qemu_free(s->aligned_buf);
773     }
774     raw_close_fd_pool(s);
775 }
776
777 static int raw_truncate(BlockDriverState *bs, int64_t offset)
778 {
779     BDRVRawState *s = bs->opaque;
780     if (s->type != FTYPE_FILE)
781         return -ENOTSUP;
782     if (ftruncate(s->fd, offset) < 0)
783         return -errno;
784     return 0;
785 }
786
787 #ifdef __OpenBSD__
788 static int64_t raw_getlength(BlockDriverState *bs)
789 {
790     BDRVRawState *s = bs->opaque;
791     int fd = s->fd;
792     struct stat st;
793
794     if (fstat(fd, &st))
795         return -1;
796     if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
797         struct disklabel dl;
798
799         if (ioctl(fd, DIOCGDINFO, &dl))
800             return -1;
801         return (uint64_t)dl.d_secsize *
802             dl.d_partitions[DISKPART(st.st_rdev)].p_size;
803     } else
804         return st.st_size;
805 }
806 #else /* !__OpenBSD__ */
807 static int64_t  raw_getlength(BlockDriverState *bs)
808 {
809     BDRVRawState *s = bs->opaque;
810     int fd = s->fd;
811     int64_t size;
812 #ifdef _BSD
813     struct stat sb;
814 #endif
815 #ifdef __sun__
816     struct dk_minfo minfo;
817     int rv;
818 #endif
819     int ret;
820
821     ret = fd_open(bs);
822     if (ret < 0)
823         return ret;
824
825 #ifdef _BSD
826     if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
827 #ifdef DIOCGMEDIASIZE
828         if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
829 #endif
830 #ifdef CONFIG_COCOA
831         size = LONG_LONG_MAX;
832 #else
833         size = lseek(fd, 0LL, SEEK_END);
834 #endif
835     } else
836 #endif
837 #ifdef __sun__
838     /*
839      * use the DKIOCGMEDIAINFO ioctl to read the size.
840      */
841     rv = ioctl ( fd, DKIOCGMEDIAINFO, &minfo );
842     if ( rv != -1 ) {
843         size = minfo.dki_lbsize * minfo.dki_capacity;
844     } else /* there are reports that lseek on some devices
845               fails, but irc discussion said that contingency
846               on contingency was overkill */
847 #endif
848     {
849         size = lseek(fd, 0, SEEK_END);
850     }
851     return size;
852 }
853 #endif
854
855 static int raw_create(const char *filename, int64_t total_size,
856                       const char *backing_file, int flags)
857 {
858     int fd;
859
860     if (flags || backing_file)
861         return -ENOTSUP;
862
863     fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
864               0644);
865     if (fd < 0)
866         return -EIO;
867     ftruncate(fd, total_size * 512);
868     close(fd);
869     return 0;
870 }
871
872 static void raw_flush(BlockDriverState *bs)
873 {
874     BDRVRawState *s = bs->opaque;
875     fsync(s->fd);
876 }
877
878 BlockDriver bdrv_raw = {
879     "raw",
880     sizeof(BDRVRawState),
881     NULL, /* no probe for protocols */
882     raw_open,
883     NULL,
884     NULL,
885     raw_close,
886     raw_create,
887     raw_flush,
888
889 #ifdef CONFIG_AIO
890     .bdrv_aio_read = raw_aio_read,
891     .bdrv_aio_write = raw_aio_write,
892     .bdrv_aio_cancel = raw_aio_cancel,
893     .aiocb_size = sizeof(RawAIOCB),
894 #endif
895     .bdrv_pread = raw_pread,
896     .bdrv_pwrite = raw_pwrite,
897     .bdrv_truncate = raw_truncate,
898     .bdrv_getlength = raw_getlength,
899 };
900
901 /***********************************************/
902 /* host device */
903
904 #ifdef CONFIG_COCOA
905 static kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator );
906 static kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize );
907
908 kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator )
909 {
910     kern_return_t       kernResult;
911     mach_port_t     masterPort;
912     CFMutableDictionaryRef  classesToMatch;
913
914     kernResult = IOMasterPort( MACH_PORT_NULL, &masterPort );
915     if ( KERN_SUCCESS != kernResult ) {
916         printf( "IOMasterPort returned %d\n", kernResult );
917     }
918
919     classesToMatch = IOServiceMatching( kIOCDMediaClass );
920     if ( classesToMatch == NULL ) {
921         printf( "IOServiceMatching returned a NULL dictionary.\n" );
922     } else {
923     CFDictionarySetValue( classesToMatch, CFSTR( kIOMediaEjectableKey ), kCFBooleanTrue );
924     }
925     kernResult = IOServiceGetMatchingServices( masterPort, classesToMatch, mediaIterator );
926     if ( KERN_SUCCESS != kernResult )
927     {
928         printf( "IOServiceGetMatchingServices returned %d\n", kernResult );
929     }
930
931     return kernResult;
932 }
933
934 kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize )
935 {
936     io_object_t     nextMedia;
937     kern_return_t   kernResult = KERN_FAILURE;
938     *bsdPath = '\0';
939     nextMedia = IOIteratorNext( mediaIterator );
940     if ( nextMedia )
941     {
942         CFTypeRef   bsdPathAsCFString;
943     bsdPathAsCFString = IORegistryEntryCreateCFProperty( nextMedia, CFSTR( kIOBSDNameKey ), kCFAllocatorDefault, 0 );
944         if ( bsdPathAsCFString ) {
945             size_t devPathLength;
946             strcpy( bsdPath, _PATH_DEV );
947             strcat( bsdPath, "r" );
948             devPathLength = strlen( bsdPath );
949             if ( CFStringGetCString( bsdPathAsCFString, bsdPath + devPathLength, maxPathSize - devPathLength, kCFStringEncodingASCII ) ) {
950                 kernResult = KERN_SUCCESS;
951             }
952             CFRelease( bsdPathAsCFString );
953         }
954         IOObjectRelease( nextMedia );
955     }
956
957     return kernResult;
958 }
959
960 #endif
961
962 static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
963 {
964     BDRVRawState *s = bs->opaque;
965     int fd, open_flags, ret, i;
966
967     posix_aio_init();
968
969 #ifdef CONFIG_COCOA
970     if (strstart(filename, "/dev/cdrom", NULL)) {
971         kern_return_t kernResult;
972         io_iterator_t mediaIterator;
973         char bsdPath[ MAXPATHLEN ];
974         int fd;
975
976         kernResult = FindEjectableCDMedia( &mediaIterator );
977         kernResult = GetBSDPath( mediaIterator, bsdPath, sizeof( bsdPath ) );
978
979         if ( bsdPath[ 0 ] != '\0' ) {
980             strcat(bsdPath,"s0");
981             /* some CDs don't have a partition 0 */
982             fd = open(bsdPath, O_RDONLY | O_BINARY | O_LARGEFILE);
983             if (fd < 0) {
984                 bsdPath[strlen(bsdPath)-1] = '1';
985             } else {
986                 close(fd);
987             }
988             filename = bsdPath;
989         }
990
991         if ( mediaIterator )
992             IOObjectRelease( mediaIterator );
993     }
994 #endif
995     open_flags = O_BINARY;
996     if ((flags & BDRV_O_ACCESS) == O_RDWR) {
997         open_flags |= O_RDWR;
998     } else {
999         open_flags |= O_RDONLY;
1000         bs->read_only = 1;
1001     }
1002     /* Use O_DSYNC for write-through caching, no flags for write-back caching,
1003      * and O_DIRECT for no caching. */
1004     if ((flags & BDRV_O_NOCACHE))
1005         open_flags |= O_DIRECT;
1006     else if (!(flags & BDRV_O_CACHE_WB))
1007         open_flags |= O_DSYNC;
1008
1009     s->type = FTYPE_FILE;
1010 #if defined(__linux__)
1011     if (strstart(filename, "/dev/cd", NULL)) {
1012         /* open will not fail even if no CD is inserted */
1013         open_flags |= O_NONBLOCK;
1014         s->type = FTYPE_CD;
1015     } else if (strstart(filename, "/dev/fd", NULL)) {
1016         s->type = FTYPE_FD;
1017         s->fd_open_flags = open_flags;
1018         /* open will not fail even if no floppy is inserted */
1019         open_flags |= O_NONBLOCK;
1020     } else if (strstart(filename, "/dev/sg", NULL)) {
1021         bs->sg = 1;
1022     }
1023 #endif
1024     fd = open(filename, open_flags, 0644);
1025     if (fd < 0) {
1026         ret = -errno;
1027         if (ret == -EROFS)
1028             ret = -EACCES;
1029         return ret;
1030     }
1031     s->fd = fd;
1032     for (i = 0; i < RAW_FD_POOL_SIZE; i++)
1033         s->fd_pool[i] = -1;
1034 #if defined(__linux__)
1035     /* close fd so that we can reopen it as needed */
1036     if (s->type == FTYPE_FD) {
1037         close(s->fd);
1038         s->fd = -1;
1039         s->fd_media_changed = 1;
1040     }
1041 #endif
1042     return 0;
1043 }
1044
1045 #if defined(__linux__)
1046 /* Note: we do not have a reliable method to detect if the floppy is
1047    present. The current method is to try to open the floppy at every
1048    I/O and to keep it opened during a few hundreds of ms. */
1049 static int fd_open(BlockDriverState *bs)
1050 {
1051     BDRVRawState *s = bs->opaque;
1052     int last_media_present;
1053
1054     if (s->type != FTYPE_FD)
1055         return 0;
1056     last_media_present = (s->fd >= 0);
1057     if (s->fd >= 0 &&
1058         (qemu_get_clock(rt_clock) - s->fd_open_time) >= FD_OPEN_TIMEOUT) {
1059         close(s->fd);
1060         s->fd = -1;
1061         raw_close_fd_pool(s);
1062 #ifdef DEBUG_FLOPPY
1063         printf("Floppy closed\n");
1064 #endif
1065     }
1066     if (s->fd < 0) {
1067         if (s->fd_got_error &&
1068             (qemu_get_clock(rt_clock) - s->fd_error_time) < FD_OPEN_TIMEOUT) {
1069 #ifdef DEBUG_FLOPPY
1070             printf("No floppy (open delayed)\n");
1071 #endif
1072             return -EIO;
1073         }
1074         s->fd = open(bs->filename, s->fd_open_flags);
1075         if (s->fd < 0) {
1076             s->fd_error_time = qemu_get_clock(rt_clock);
1077             s->fd_got_error = 1;
1078             if (last_media_present)
1079                 s->fd_media_changed = 1;
1080 #ifdef DEBUG_FLOPPY
1081             printf("No floppy\n");
1082 #endif
1083             return -EIO;
1084         }
1085 #ifdef DEBUG_FLOPPY
1086         printf("Floppy opened\n");
1087 #endif
1088     }
1089     if (!last_media_present)
1090         s->fd_media_changed = 1;
1091     s->fd_open_time = qemu_get_clock(rt_clock);
1092     s->fd_got_error = 0;
1093     return 0;
1094 }
1095
1096 static int raw_is_inserted(BlockDriverState *bs)
1097 {
1098     BDRVRawState *s = bs->opaque;
1099     int ret;
1100
1101     switch(s->type) {
1102     case FTYPE_CD:
1103         ret = ioctl(s->fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
1104         if (ret == CDS_DISC_OK)
1105             return 1;
1106         else
1107             return 0;
1108         break;
1109     case FTYPE_FD:
1110         ret = fd_open(bs);
1111         return (ret >= 0);
1112     default:
1113         return 1;
1114     }
1115 }
1116
1117 /* currently only used by fdc.c, but a CD version would be good too */
1118 static int raw_media_changed(BlockDriverState *bs)
1119 {
1120     BDRVRawState *s = bs->opaque;
1121
1122     switch(s->type) {
1123     case FTYPE_FD:
1124         {
1125             int ret;
1126             /* XXX: we do not have a true media changed indication. It
1127                does not work if the floppy is changed without trying
1128                to read it */
1129             fd_open(bs);
1130             ret = s->fd_media_changed;
1131             s->fd_media_changed = 0;
1132 #ifdef DEBUG_FLOPPY
1133             printf("Floppy changed=%d\n", ret);
1134 #endif
1135             return ret;
1136         }
1137     default:
1138         return -ENOTSUP;
1139     }
1140 }
1141
1142 static int raw_eject(BlockDriverState *bs, int eject_flag)
1143 {
1144     BDRVRawState *s = bs->opaque;
1145
1146     switch(s->type) {
1147     case FTYPE_CD:
1148         if (eject_flag) {
1149             if (ioctl (s->fd, CDROMEJECT, NULL) < 0)
1150                 perror("CDROMEJECT");
1151         } else {
1152             if (ioctl (s->fd, CDROMCLOSETRAY, NULL) < 0)
1153                 perror("CDROMEJECT");
1154         }
1155         break;
1156     case FTYPE_FD:
1157         {
1158             int fd;
1159             if (s->fd >= 0) {
1160                 close(s->fd);
1161                 s->fd = -1;
1162                 raw_close_fd_pool(s);
1163             }
1164             fd = open(bs->filename, s->fd_open_flags | O_NONBLOCK);
1165             if (fd >= 0) {
1166                 if (ioctl(fd, FDEJECT, 0) < 0)
1167                     perror("FDEJECT");
1168                 close(fd);
1169             }
1170         }
1171         break;
1172     default:
1173         return -ENOTSUP;
1174     }
1175     return 0;
1176 }
1177
1178 static int raw_set_locked(BlockDriverState *bs, int locked)
1179 {
1180     BDRVRawState *s = bs->opaque;
1181
1182     switch(s->type) {
1183     case FTYPE_CD:
1184         if (ioctl (s->fd, CDROM_LOCKDOOR, locked) < 0) {
1185             /* Note: an error can happen if the distribution automatically
1186                mounts the CD-ROM */
1187             //        perror("CDROM_LOCKDOOR");
1188         }
1189         break;
1190     default:
1191         return -ENOTSUP;
1192     }
1193     return 0;
1194 }
1195
1196 static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1197 {
1198     BDRVRawState *s = bs->opaque;
1199
1200     return ioctl(s->fd, req, buf);
1201 }
1202 #else
1203
1204 static int fd_open(BlockDriverState *bs)
1205 {
1206     return 0;
1207 }
1208
1209 static int raw_is_inserted(BlockDriverState *bs)
1210 {
1211     return 1;
1212 }
1213
1214 static int raw_media_changed(BlockDriverState *bs)
1215 {
1216     return -ENOTSUP;
1217 }
1218
1219 static int raw_eject(BlockDriverState *bs, int eject_flag)
1220 {
1221     return -ENOTSUP;
1222 }
1223
1224 static int raw_set_locked(BlockDriverState *bs, int locked)
1225 {
1226     return -ENOTSUP;
1227 }
1228
1229 static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1230 {
1231     return -ENOTSUP;
1232 }
1233 #endif /* !linux */
1234
1235 BlockDriver bdrv_host_device = {
1236     "host_device",
1237     sizeof(BDRVRawState),
1238     NULL, /* no probe for protocols */
1239     hdev_open,
1240     NULL,
1241     NULL,
1242     raw_close,
1243     NULL,
1244     raw_flush,
1245
1246 #ifdef CONFIG_AIO
1247     .bdrv_aio_read = raw_aio_read,
1248     .bdrv_aio_write = raw_aio_write,
1249     .bdrv_aio_cancel = raw_aio_cancel,
1250     .aiocb_size = sizeof(RawAIOCB),
1251 #endif
1252     .bdrv_pread = raw_pread,
1253     .bdrv_pwrite = raw_pwrite,
1254     .bdrv_getlength = raw_getlength,
1255
1256     /* removable device support */
1257     .bdrv_is_inserted = raw_is_inserted,
1258     .bdrv_media_changed = raw_media_changed,
1259     .bdrv_eject = raw_eject,
1260     .bdrv_set_locked = raw_set_locked,
1261     /* generic scsi device */
1262     .bdrv_ioctl = raw_ioctl,
1263 };