Fix missing strnlen problems
[qemu] / block.c
1 /*
2  * QEMU System Emulator block driver
3  *
4  * Copyright (c) 2003 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 "config-host.h"
25 #ifdef HOST_BSD
26 /* include native header before sys-queue.h */
27 #include <sys/queue.h>
28 #endif
29
30 #include "qemu-common.h"
31 #include "monitor.h"
32 #include "block_int.h"
33 #include "module.h"
34
35 #ifdef HOST_BSD
36 #include <sys/types.h>
37 #include <sys/stat.h>
38 #include <sys/ioctl.h>
39 #ifndef __DragonFly__
40 #include <sys/disk.h>
41 #endif
42 #endif
43
44 #ifdef _WIN32
45 #include <windows.h>
46 #endif
47
48 #define SECTOR_BITS 9
49 #define SECTOR_SIZE (1 << SECTOR_BITS)
50
51 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
52         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
53         BlockDriverCompletionFunc *cb, void *opaque);
54 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
55         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
56         BlockDriverCompletionFunc *cb, void *opaque);
57 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
58                         uint8_t *buf, int nb_sectors);
59 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
60                          const uint8_t *buf, int nb_sectors);
61
62 BlockDriverState *bdrv_first;
63
64 static BlockDriver *first_drv;
65
66 int path_is_absolute(const char *path)
67 {
68     const char *p;
69 #ifdef _WIN32
70     /* specific case for names like: "\\.\d:" */
71     if (*path == '/' || *path == '\\')
72         return 1;
73 #endif
74     p = strchr(path, ':');
75     if (p)
76         p++;
77     else
78         p = path;
79 #ifdef _WIN32
80     return (*p == '/' || *p == '\\');
81 #else
82     return (*p == '/');
83 #endif
84 }
85
86 /* if filename is absolute, just copy it to dest. Otherwise, build a
87    path to it by considering it is relative to base_path. URL are
88    supported. */
89 void path_combine(char *dest, int dest_size,
90                   const char *base_path,
91                   const char *filename)
92 {
93     const char *p, *p1;
94     int len;
95
96     if (dest_size <= 0)
97         return;
98     if (path_is_absolute(filename)) {
99         pstrcpy(dest, dest_size, filename);
100     } else {
101         p = strchr(base_path, ':');
102         if (p)
103             p++;
104         else
105             p = base_path;
106         p1 = strrchr(base_path, '/');
107 #ifdef _WIN32
108         {
109             const char *p2;
110             p2 = strrchr(base_path, '\\');
111             if (!p1 || p2 > p1)
112                 p1 = p2;
113         }
114 #endif
115         if (p1)
116             p1++;
117         else
118             p1 = base_path;
119         if (p1 > p)
120             p = p1;
121         len = p - base_path;
122         if (len > dest_size - 1)
123             len = dest_size - 1;
124         memcpy(dest, base_path, len);
125         dest[len] = '\0';
126         pstrcat(dest, dest_size, filename);
127     }
128 }
129
130 void bdrv_register(BlockDriver *bdrv)
131 {
132     if (!bdrv->bdrv_aio_readv) {
133         /* add AIO emulation layer */
134         bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
135         bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
136     } else if (!bdrv->bdrv_read) {
137         /* add synchronous IO emulation layer */
138         bdrv->bdrv_read = bdrv_read_em;
139         bdrv->bdrv_write = bdrv_write_em;
140     }
141     bdrv->next = first_drv;
142     first_drv = bdrv;
143 }
144
145 /* create a new block device (by default it is empty) */
146 BlockDriverState *bdrv_new(const char *device_name)
147 {
148     BlockDriverState **pbs, *bs;
149
150     bs = qemu_mallocz(sizeof(BlockDriverState));
151     pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
152     if (device_name[0] != '\0') {
153         /* insert at the end */
154         pbs = &bdrv_first;
155         while (*pbs != NULL)
156             pbs = &(*pbs)->next;
157         *pbs = bs;
158     }
159     return bs;
160 }
161
162 BlockDriver *bdrv_find_format(const char *format_name)
163 {
164     BlockDriver *drv1;
165     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
166         if (!strcmp(drv1->format_name, format_name))
167             return drv1;
168     }
169     return NULL;
170 }
171
172 int bdrv_create(BlockDriver *drv, const char* filename,
173     QEMUOptionParameter *options)
174 {
175     if (!drv->bdrv_create)
176         return -ENOTSUP;
177
178     return drv->bdrv_create(filename, options);
179 }
180
181 #ifdef _WIN32
182 void get_tmp_filename(char *filename, int size)
183 {
184     char temp_dir[MAX_PATH];
185
186     GetTempPath(MAX_PATH, temp_dir);
187     GetTempFileName(temp_dir, "qem", 0, filename);
188 }
189 #else
190 void get_tmp_filename(char *filename, int size)
191 {
192     int fd;
193     const char *tmpdir;
194     /* XXX: race condition possible */
195     tmpdir = getenv("TMPDIR");
196     if (!tmpdir)
197         tmpdir = "/tmp";
198     snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
199     fd = mkstemp(filename);
200     close(fd);
201 }
202 #endif
203
204 #ifdef _WIN32
205 static int is_windows_drive_prefix(const char *filename)
206 {
207     return (((filename[0] >= 'a' && filename[0] <= 'z') ||
208              (filename[0] >= 'A' && filename[0] <= 'Z')) &&
209             filename[1] == ':');
210 }
211
212 int is_windows_drive(const char *filename)
213 {
214     if (is_windows_drive_prefix(filename) &&
215         filename[2] == '\0')
216         return 1;
217     if (strstart(filename, "\\\\.\\", NULL) ||
218         strstart(filename, "//./", NULL))
219         return 1;
220     return 0;
221 }
222 #endif
223
224 static BlockDriver *find_protocol(const char *filename)
225 {
226     BlockDriver *drv1;
227     char protocol[128];
228     int len = qemu_strnlen(filename, 127) + 1;
229     const char *p;
230
231 #ifdef _WIN32
232     if (is_windows_drive(filename) ||
233         is_windows_drive_prefix(filename))
234         return bdrv_find_format("raw");
235 #endif
236     p = fill_token(protocol, len, filename, ':');
237     if (*p != ':')
238         return bdrv_find_format("raw");
239     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
240         if (drv1->protocol_name &&
241             !strcmp(drv1->protocol_name, protocol))
242             return drv1;
243     }
244     return NULL;
245 }
246
247 /*
248  * Detect host devices. By convention, /dev/cdrom[N] is always
249  * recognized as a host CDROM.
250  */
251 static BlockDriver *find_hdev_driver(const char *filename)
252 {
253     int score_max = 0, score;
254     BlockDriver *drv = NULL, *d;
255
256     for (d = first_drv; d; d = d->next) {
257         if (d->bdrv_probe_device) {
258             score = d->bdrv_probe_device(filename);
259             if (score > score_max) {
260                 score_max = score;
261                 drv = d;
262             }
263         }
264     }
265
266     return drv;
267 }
268
269 static BlockDriver *find_image_format(const char *filename)
270 {
271     int ret, score, score_max;
272     BlockDriver *drv1, *drv;
273     uint8_t buf[2048];
274     BlockDriverState *bs;
275
276     drv = find_protocol(filename);
277     /* no need to test disk image formats for vvfat */
278     if (drv && strcmp(drv->format_name, "vvfat") == 0)
279         return drv;
280
281     ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY);
282     if (ret < 0)
283         return NULL;
284     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
285     bdrv_delete(bs);
286     if (ret < 0) {
287         return NULL;
288     }
289
290     score_max = 0;
291     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
292         if (drv1->bdrv_probe) {
293             score = drv1->bdrv_probe(buf, ret, filename);
294             if (score > score_max) {
295                 score_max = score;
296                 drv = drv1;
297             }
298         }
299     }
300     return drv;
301 }
302
303 int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
304 {
305     BlockDriverState *bs;
306     int ret;
307
308     bs = bdrv_new("");
309     ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
310     if (ret < 0) {
311         bdrv_delete(bs);
312         return ret;
313     }
314     bs->growable = 1;
315     *pbs = bs;
316     return 0;
317 }
318
319 int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
320 {
321     return bdrv_open2(bs, filename, flags, NULL);
322 }
323
324 int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
325                BlockDriver *drv)
326 {
327     int ret, open_flags;
328     char tmp_filename[PATH_MAX];
329     char backing_filename[PATH_MAX];
330
331     bs->read_only = 0;
332     bs->is_temporary = 0;
333     bs->encrypted = 0;
334     bs->valid_key = 0;
335     /* buffer_alignment defaulted to 512, drivers can change this value */
336     bs->buffer_alignment = 512;
337
338     if (flags & BDRV_O_SNAPSHOT) {
339         BlockDriverState *bs1;
340         int64_t total_size;
341         int is_protocol = 0;
342         BlockDriver *bdrv_qcow2;
343         QEMUOptionParameter *options;
344
345         /* if snapshot, we create a temporary backing file and open it
346            instead of opening 'filename' directly */
347
348         /* if there is a backing file, use it */
349         bs1 = bdrv_new("");
350         ret = bdrv_open2(bs1, filename, 0, drv);
351         if (ret < 0) {
352             bdrv_delete(bs1);
353             return ret;
354         }
355         total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
356
357         if (bs1->drv && bs1->drv->protocol_name)
358             is_protocol = 1;
359
360         bdrv_delete(bs1);
361
362         get_tmp_filename(tmp_filename, sizeof(tmp_filename));
363
364         /* Real path is meaningless for protocols */
365         if (is_protocol)
366             snprintf(backing_filename, sizeof(backing_filename),
367                      "%s", filename);
368         else
369             realpath(filename, backing_filename);
370
371         bdrv_qcow2 = bdrv_find_format("qcow2");
372         options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
373
374         set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size * 512);
375         set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
376         if (drv) {
377             set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
378                 drv->format_name);
379         }
380
381         ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
382         if (ret < 0) {
383             return ret;
384         }
385
386         filename = tmp_filename;
387         drv = bdrv_qcow2;
388         bs->is_temporary = 1;
389     }
390
391     pstrcpy(bs->filename, sizeof(bs->filename), filename);
392     if (flags & BDRV_O_FILE) {
393         drv = find_protocol(filename);
394     } else if (!drv) {
395         drv = find_hdev_driver(filename);
396         if (!drv) {
397             drv = find_image_format(filename);
398         }
399     }
400     if (!drv) {
401         ret = -ENOENT;
402         goto unlink_and_fail;
403     }
404     bs->drv = drv;
405     bs->opaque = qemu_mallocz(drv->instance_size);
406     /* Note: for compatibility, we open disk image files as RDWR, and
407        RDONLY as fallback */
408     if (!(flags & BDRV_O_FILE))
409         open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK);
410     else
411         open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
412     ret = bdrv_open3(bs, filename, open_flags, drv);
413     if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
414         ret = bdrv_open3(bs, filename, open_flags & ~BDRV_O_RDWR, drv);
415         bs->read_only = 1;
416     }
417     if (ret < 0) {
418         qemu_free(bs->opaque);
419         bs->opaque = NULL;
420         bs->drv = NULL;
421     unlink_and_fail:
422         if (bs->is_temporary)
423             unlink(filename);
424         return ret;
425     }
426     if (drv->bdrv_getlength) {
427         bs->total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
428     }
429 #ifndef _WIN32
430     if (bs->is_temporary) {
431         unlink(filename);
432     }
433 #endif
434     if (bs->backing_file[0] != '\0') {
435         /* if there is a backing file, use it */
436         BlockDriver *back_drv = NULL;
437         bs->backing_hd = bdrv_new("");
438         path_combine(backing_filename, sizeof(backing_filename),
439                      filename, bs->backing_file);
440         if (bs->backing_format[0] != '\0')
441             back_drv = bdrv_find_format(bs->backing_format);
442         ret = bdrv_open2(bs->backing_hd, backing_filename, open_flags,
443                          back_drv);
444         if (ret < 0) {
445             bdrv_close(bs);
446             return ret;
447         }
448     }
449
450     if (!bdrv_key_required(bs)) {
451         /* call the change callback */
452         bs->media_changed = 1;
453         if (bs->change_cb)
454             bs->change_cb(bs->change_opaque);
455     }
456     return 0;
457 }
458
459 int bdrv_open3(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv)
460 {
461     char myfile[PATH_MAX];
462     const char *f;
463
464     if (!strstart(filename, "file:", &f)) {
465         fill_token(myfile, PATH_MAX, filename, '\0');
466         return drv->bdrv_open(bs,myfile,flags);
467     }
468     return drv->bdrv_open(bs,f,flags);
469 }
470
471 void bdrv_close(BlockDriverState *bs)
472 {
473     if (bs->drv) {
474         if (bs->backing_hd)
475             bdrv_delete(bs->backing_hd);
476         bs->drv->bdrv_close(bs);
477         qemu_free(bs->opaque);
478 #ifdef _WIN32
479         if (bs->is_temporary) {
480             unlink(bs->filename);
481         }
482 #endif
483         bs->opaque = NULL;
484         bs->drv = NULL;
485
486         /* call the change callback */
487         bs->media_changed = 1;
488         if (bs->change_cb)
489             bs->change_cb(bs->change_opaque);
490     }
491 }
492
493 void bdrv_delete(BlockDriverState *bs)
494 {
495     BlockDriverState **pbs;
496
497     pbs = &bdrv_first;
498     while (*pbs != bs && *pbs != NULL)
499         pbs = &(*pbs)->next;
500     if (*pbs == bs)
501         *pbs = bs->next;
502
503     bdrv_close(bs);
504     qemu_free(bs);
505 }
506
507 /*
508  * Run consistency checks on an image
509  *
510  * Returns the number of errors or -errno when an internal error occurs
511  */
512 int bdrv_check(BlockDriverState *bs)
513 {
514     if (bs->drv->bdrv_check == NULL) {
515         return -ENOTSUP;
516     }
517
518     return bs->drv->bdrv_check(bs);
519 }
520
521 /* commit COW file into the raw image */
522 int bdrv_commit(BlockDriverState *bs)
523 {
524     BlockDriver *drv = bs->drv;
525     int64_t i, total_sectors;
526     int n, j;
527     unsigned char sector[512];
528
529     if (!drv)
530         return -ENOMEDIUM;
531
532     if (bs->read_only) {
533         return -EACCES;
534     }
535
536     if (!bs->backing_hd) {
537         return -ENOTSUP;
538     }
539
540     total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
541     for (i = 0; i < total_sectors;) {
542         if (drv->bdrv_is_allocated(bs, i, 65536, &n)) {
543             for(j = 0; j < n; j++) {
544                 if (bdrv_read(bs, i, sector, 1) != 0) {
545                     return -EIO;
546                 }
547
548                 if (bdrv_write(bs->backing_hd, i, sector, 1) != 0) {
549                     return -EIO;
550                 }
551                 i++;
552             }
553         } else {
554             i += n;
555         }
556     }
557
558     if (drv->bdrv_make_empty)
559         return drv->bdrv_make_empty(bs);
560
561     return 0;
562 }
563
564 static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
565                                    size_t size)
566 {
567     int64_t len;
568
569     if (!bdrv_is_inserted(bs))
570         return -ENOMEDIUM;
571
572     if (bs->growable)
573         return 0;
574
575     len = bdrv_getlength(bs);
576
577     if (offset < 0)
578         return -EIO;
579
580     if ((offset > len) || (len - offset < size))
581         return -EIO;
582
583     return 0;
584 }
585
586 static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
587                               int nb_sectors)
588 {
589     return bdrv_check_byte_request(bs, sector_num * 512, nb_sectors * 512);
590 }
591
592 /* return < 0 if error. See bdrv_write() for the return codes */
593 int bdrv_read(BlockDriverState *bs, int64_t sector_num,
594               uint8_t *buf, int nb_sectors)
595 {
596     BlockDriver *drv = bs->drv;
597
598     if (!drv)
599         return -ENOMEDIUM;
600     if (bdrv_check_request(bs, sector_num, nb_sectors))
601         return -EIO;
602
603     return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
604 }
605
606 /* Return < 0 if error. Important errors are:
607   -EIO         generic I/O error (may happen for all errors)
608   -ENOMEDIUM   No media inserted.
609   -EINVAL      Invalid sector number or nb_sectors
610   -EACCES      Trying to write a read-only device
611 */
612 int bdrv_write(BlockDriverState *bs, int64_t sector_num,
613                const uint8_t *buf, int nb_sectors)
614 {
615     BlockDriver *drv = bs->drv;
616     if (!bs->drv)
617         return -ENOMEDIUM;
618     if (bs->read_only)
619         return -EACCES;
620     if (bdrv_check_request(bs, sector_num, nb_sectors))
621         return -EIO;
622
623     return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
624 }
625
626 int bdrv_pread(BlockDriverState *bs, int64_t offset,
627                void *buf, int count1)
628 {
629     uint8_t tmp_buf[SECTOR_SIZE];
630     int len, nb_sectors, count;
631     int64_t sector_num;
632
633     count = count1;
634     /* first read to align to sector start */
635     len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
636     if (len > count)
637         len = count;
638     sector_num = offset >> SECTOR_BITS;
639     if (len > 0) {
640         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
641             return -EIO;
642         memcpy(buf, tmp_buf + (offset & (SECTOR_SIZE - 1)), len);
643         count -= len;
644         if (count == 0)
645             return count1;
646         sector_num++;
647         buf += len;
648     }
649
650     /* read the sectors "in place" */
651     nb_sectors = count >> SECTOR_BITS;
652     if (nb_sectors > 0) {
653         if (bdrv_read(bs, sector_num, buf, nb_sectors) < 0)
654             return -EIO;
655         sector_num += nb_sectors;
656         len = nb_sectors << SECTOR_BITS;
657         buf += len;
658         count -= len;
659     }
660
661     /* add data from the last sector */
662     if (count > 0) {
663         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
664             return -EIO;
665         memcpy(buf, tmp_buf, count);
666     }
667     return count1;
668 }
669
670 int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
671                 const void *buf, int count1)
672 {
673     uint8_t tmp_buf[SECTOR_SIZE];
674     int len, nb_sectors, count;
675     int64_t sector_num;
676
677     count = count1;
678     /* first write to align to sector start */
679     len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
680     if (len > count)
681         len = count;
682     sector_num = offset >> SECTOR_BITS;
683     if (len > 0) {
684         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
685             return -EIO;
686         memcpy(tmp_buf + (offset & (SECTOR_SIZE - 1)), buf, len);
687         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
688             return -EIO;
689         count -= len;
690         if (count == 0)
691             return count1;
692         sector_num++;
693         buf += len;
694     }
695
696     /* write the sectors "in place" */
697     nb_sectors = count >> SECTOR_BITS;
698     if (nb_sectors > 0) {
699         if (bdrv_write(bs, sector_num, buf, nb_sectors) < 0)
700             return -EIO;
701         sector_num += nb_sectors;
702         len = nb_sectors << SECTOR_BITS;
703         buf += len;
704         count -= len;
705     }
706
707     /* add data from the last sector */
708     if (count > 0) {
709         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
710             return -EIO;
711         memcpy(tmp_buf, buf, count);
712         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
713             return -EIO;
714     }
715     return count1;
716 }
717
718 /**
719  * Truncate file to 'offset' bytes (needed only for file protocols)
720  */
721 int bdrv_truncate(BlockDriverState *bs, int64_t offset)
722 {
723     BlockDriver *drv = bs->drv;
724     if (!drv)
725         return -ENOMEDIUM;
726     if (!drv->bdrv_truncate)
727         return -ENOTSUP;
728     return drv->bdrv_truncate(bs, offset);
729 }
730
731 /**
732  * Length of a file in bytes. Return < 0 if error or unknown.
733  */
734 int64_t bdrv_getlength(BlockDriverState *bs)
735 {
736     BlockDriver *drv = bs->drv;
737     if (!drv)
738         return -ENOMEDIUM;
739     if (!drv->bdrv_getlength) {
740         /* legacy mode */
741         return bs->total_sectors * SECTOR_SIZE;
742     }
743     return drv->bdrv_getlength(bs);
744 }
745
746 /* return 0 as number of sectors if no device present or error */
747 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
748 {
749     int64_t length;
750     length = bdrv_getlength(bs);
751     if (length < 0)
752         length = 0;
753     else
754         length = length >> SECTOR_BITS;
755     *nb_sectors_ptr = length;
756 }
757
758 struct partition {
759         uint8_t boot_ind;           /* 0x80 - active */
760         uint8_t head;               /* starting head */
761         uint8_t sector;             /* starting sector */
762         uint8_t cyl;                /* starting cylinder */
763         uint8_t sys_ind;            /* What partition type */
764         uint8_t end_head;           /* end head */
765         uint8_t end_sector;         /* end sector */
766         uint8_t end_cyl;            /* end cylinder */
767         uint32_t start_sect;        /* starting sector counting from 0 */
768         uint32_t nr_sects;          /* nr of sectors in partition */
769 } __attribute__((packed));
770
771 /* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
772 static int guess_disk_lchs(BlockDriverState *bs,
773                            int *pcylinders, int *pheads, int *psectors)
774 {
775     uint8_t buf[512];
776     int ret, i, heads, sectors, cylinders;
777     struct partition *p;
778     uint32_t nr_sects;
779     uint64_t nb_sectors;
780
781     bdrv_get_geometry(bs, &nb_sectors);
782
783     ret = bdrv_read(bs, 0, buf, 1);
784     if (ret < 0)
785         return -1;
786     /* test msdos magic */
787     if (buf[510] != 0x55 || buf[511] != 0xaa)
788         return -1;
789     for(i = 0; i < 4; i++) {
790         p = ((struct partition *)(buf + 0x1be)) + i;
791         nr_sects = le32_to_cpu(p->nr_sects);
792         if (nr_sects && p->end_head) {
793             /* We make the assumption that the partition terminates on
794                a cylinder boundary */
795             heads = p->end_head + 1;
796             sectors = p->end_sector & 63;
797             if (sectors == 0)
798                 continue;
799             cylinders = nb_sectors / (heads * sectors);
800             if (cylinders < 1 || cylinders > 16383)
801                 continue;
802             *pheads = heads;
803             *psectors = sectors;
804             *pcylinders = cylinders;
805 #if 0
806             printf("guessed geometry: LCHS=%d %d %d\n",
807                    cylinders, heads, sectors);
808 #endif
809             return 0;
810         }
811     }
812     return -1;
813 }
814
815 void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
816 {
817     int translation, lba_detected = 0;
818     int cylinders, heads, secs;
819     uint64_t nb_sectors;
820
821     /* if a geometry hint is available, use it */
822     bdrv_get_geometry(bs, &nb_sectors);
823     bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
824     translation = bdrv_get_translation_hint(bs);
825     if (cylinders != 0) {
826         *pcyls = cylinders;
827         *pheads = heads;
828         *psecs = secs;
829     } else {
830         if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
831             if (heads > 16) {
832                 /* if heads > 16, it means that a BIOS LBA
833                    translation was active, so the default
834                    hardware geometry is OK */
835                 lba_detected = 1;
836                 goto default_geometry;
837             } else {
838                 *pcyls = cylinders;
839                 *pheads = heads;
840                 *psecs = secs;
841                 /* disable any translation to be in sync with
842                    the logical geometry */
843                 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
844                     bdrv_set_translation_hint(bs,
845                                               BIOS_ATA_TRANSLATION_NONE);
846                 }
847             }
848         } else {
849         default_geometry:
850             /* if no geometry, use a standard physical disk geometry */
851             cylinders = nb_sectors / (16 * 63);
852
853             if (cylinders > 16383)
854                 cylinders = 16383;
855             else if (cylinders < 2)
856                 cylinders = 2;
857             *pcyls = cylinders;
858             *pheads = 16;
859             *psecs = 63;
860             if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
861                 if ((*pcyls * *pheads) <= 131072) {
862                     bdrv_set_translation_hint(bs,
863                                               BIOS_ATA_TRANSLATION_LARGE);
864                 } else {
865                     bdrv_set_translation_hint(bs,
866                                               BIOS_ATA_TRANSLATION_LBA);
867                 }
868             }
869         }
870         bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
871     }
872 }
873
874 void bdrv_set_geometry_hint(BlockDriverState *bs,
875                             int cyls, int heads, int secs)
876 {
877     bs->cyls = cyls;
878     bs->heads = heads;
879     bs->secs = secs;
880 }
881
882 void bdrv_set_type_hint(BlockDriverState *bs, int type)
883 {
884     bs->type = type;
885     bs->removable = ((type == BDRV_TYPE_CDROM ||
886                       type == BDRV_TYPE_FLOPPY));
887 }
888
889 void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
890 {
891     bs->translation = translation;
892 }
893
894 void bdrv_get_geometry_hint(BlockDriverState *bs,
895                             int *pcyls, int *pheads, int *psecs)
896 {
897     *pcyls = bs->cyls;
898     *pheads = bs->heads;
899     *psecs = bs->secs;
900 }
901
902 int bdrv_get_type_hint(BlockDriverState *bs)
903 {
904     return bs->type;
905 }
906
907 int bdrv_get_translation_hint(BlockDriverState *bs)
908 {
909     return bs->translation;
910 }
911
912 int bdrv_is_removable(BlockDriverState *bs)
913 {
914     return bs->removable;
915 }
916
917 int bdrv_is_read_only(BlockDriverState *bs)
918 {
919     return bs->read_only;
920 }
921
922 int bdrv_is_sg(BlockDriverState *bs)
923 {
924     return bs->sg;
925 }
926
927 /* XXX: no longer used */
928 void bdrv_set_change_cb(BlockDriverState *bs,
929                         void (*change_cb)(void *opaque), void *opaque)
930 {
931     bs->change_cb = change_cb;
932     bs->change_opaque = opaque;
933 }
934
935 int bdrv_is_encrypted(BlockDriverState *bs)
936 {
937     if (bs->backing_hd && bs->backing_hd->encrypted)
938         return 1;
939     return bs->encrypted;
940 }
941
942 int bdrv_key_required(BlockDriverState *bs)
943 {
944     BlockDriverState *backing_hd = bs->backing_hd;
945
946     if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
947         return 1;
948     return (bs->encrypted && !bs->valid_key);
949 }
950
951 int bdrv_set_key(BlockDriverState *bs, const char *key)
952 {
953     int ret;
954     if (bs->backing_hd && bs->backing_hd->encrypted) {
955         ret = bdrv_set_key(bs->backing_hd, key);
956         if (ret < 0)
957             return ret;
958         if (!bs->encrypted)
959             return 0;
960     }
961     if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
962         return -1;
963     ret = bs->drv->bdrv_set_key(bs, key);
964     if (ret < 0) {
965         bs->valid_key = 0;
966     } else if (!bs->valid_key) {
967         bs->valid_key = 1;
968         /* call the change callback now, we skipped it on open */
969         bs->media_changed = 1;
970         if (bs->change_cb)
971             bs->change_cb(bs->change_opaque);
972     }
973     return ret;
974 }
975
976 void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
977 {
978     if (!bs->drv) {
979         buf[0] = '\0';
980     } else {
981         pstrcpy(buf, buf_size, bs->drv->format_name);
982     }
983 }
984
985 void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
986                          void *opaque)
987 {
988     BlockDriver *drv;
989
990     for (drv = first_drv; drv != NULL; drv = drv->next) {
991         it(opaque, drv->format_name);
992     }
993 }
994
995 BlockDriverState *bdrv_find(const char *name)
996 {
997     BlockDriverState *bs;
998
999     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1000         if (!strcmp(name, bs->device_name))
1001             return bs;
1002     }
1003     return NULL;
1004 }
1005
1006 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
1007 {
1008     BlockDriverState *bs;
1009
1010     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1011         it(opaque, bs);
1012     }
1013 }
1014
1015 const char *bdrv_get_device_name(BlockDriverState *bs)
1016 {
1017     return bs->device_name;
1018 }
1019
1020 void bdrv_flush(BlockDriverState *bs)
1021 {
1022     if (!bs->drv)
1023         return;
1024     if (bs->drv->bdrv_flush)
1025         bs->drv->bdrv_flush(bs);
1026     if (bs->backing_hd)
1027         bdrv_flush(bs->backing_hd);
1028 }
1029
1030 void bdrv_flush_all(void)
1031 {
1032     BlockDriverState *bs;
1033
1034     for (bs = bdrv_first; bs != NULL; bs = bs->next)
1035         if (bs->drv && !bdrv_is_read_only(bs) && 
1036             (!bdrv_is_removable(bs) || bdrv_is_inserted(bs)))
1037             bdrv_flush(bs);
1038 }
1039
1040 /*
1041  * Returns true iff the specified sector is present in the disk image. Drivers
1042  * not implementing the functionality are assumed to not support backing files,
1043  * hence all their sectors are reported as allocated.
1044  *
1045  * 'pnum' is set to the number of sectors (including and immediately following
1046  * the specified sector) that are known to be in the same
1047  * allocated/unallocated state.
1048  *
1049  * 'nb_sectors' is the max value 'pnum' should be set to.
1050  */
1051 int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
1052         int *pnum)
1053 {
1054     int64_t n;
1055     if (!bs->drv->bdrv_is_allocated) {
1056         if (sector_num >= bs->total_sectors) {
1057             *pnum = 0;
1058             return 0;
1059         }
1060         n = bs->total_sectors - sector_num;
1061         *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
1062         return 1;
1063     }
1064     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
1065 }
1066
1067 void bdrv_info(Monitor *mon)
1068 {
1069     BlockDriverState *bs;
1070
1071     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1072         monitor_printf(mon, "%s:", bs->device_name);
1073         monitor_printf(mon, " type=");
1074         switch(bs->type) {
1075         case BDRV_TYPE_HD:
1076             monitor_printf(mon, "hd");
1077             break;
1078         case BDRV_TYPE_CDROM:
1079             monitor_printf(mon, "cdrom");
1080             break;
1081         case BDRV_TYPE_FLOPPY:
1082             monitor_printf(mon, "floppy");
1083             break;
1084         }
1085         monitor_printf(mon, " removable=%d", bs->removable);
1086         if (bs->removable) {
1087             monitor_printf(mon, " locked=%d", bs->locked);
1088         }
1089         if (bs->drv) {
1090             monitor_printf(mon, " file=");
1091             monitor_print_filename(mon, bs->filename);
1092             if (bs->backing_file[0] != '\0') {
1093                 monitor_printf(mon, " backing_file=");
1094                 monitor_print_filename(mon, bs->backing_file);
1095             }
1096             monitor_printf(mon, " ro=%d", bs->read_only);
1097             monitor_printf(mon, " drv=%s", bs->drv->format_name);
1098             monitor_printf(mon, " encrypted=%d", bdrv_is_encrypted(bs));
1099         } else {
1100             monitor_printf(mon, " [not inserted]");
1101         }
1102         monitor_printf(mon, "\n");
1103     }
1104 }
1105
1106 /* The "info blockstats" command. */
1107 void bdrv_info_stats(Monitor *mon)
1108 {
1109     BlockDriverState *bs;
1110
1111     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1112         monitor_printf(mon, "%s:"
1113                        " rd_bytes=%" PRIu64
1114                        " wr_bytes=%" PRIu64
1115                        " rd_operations=%" PRIu64
1116                        " wr_operations=%" PRIu64
1117                        "\n",
1118                        bs->device_name,
1119                        bs->rd_bytes, bs->wr_bytes,
1120                        bs->rd_ops, bs->wr_ops);
1121     }
1122 }
1123
1124 const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
1125 {
1126     if (bs->backing_hd && bs->backing_hd->encrypted)
1127         return bs->backing_file;
1128     else if (bs->encrypted)
1129         return bs->filename;
1130     else
1131         return NULL;
1132 }
1133
1134 void bdrv_get_backing_filename(BlockDriverState *bs,
1135                                char *filename, int filename_size)
1136 {
1137     if (!bs->backing_hd) {
1138         pstrcpy(filename, filename_size, "");
1139     } else {
1140         pstrcpy(filename, filename_size, bs->backing_file);
1141     }
1142 }
1143
1144 int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
1145                           const uint8_t *buf, int nb_sectors)
1146 {
1147     BlockDriver *drv = bs->drv;
1148     if (!drv)
1149         return -ENOMEDIUM;
1150     if (!drv->bdrv_write_compressed)
1151         return -ENOTSUP;
1152     if (bdrv_check_request(bs, sector_num, nb_sectors))
1153         return -EIO;
1154     return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
1155 }
1156
1157 int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
1158 {
1159     BlockDriver *drv = bs->drv;
1160     if (!drv)
1161         return -ENOMEDIUM;
1162     if (!drv->bdrv_get_info)
1163         return -ENOTSUP;
1164     memset(bdi, 0, sizeof(*bdi));
1165     return drv->bdrv_get_info(bs, bdi);
1166 }
1167
1168 int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf, int64_t pos, int size)
1169 {
1170     BlockDriver *drv = bs->drv;
1171     if (!drv)
1172         return -ENOMEDIUM;
1173     if (!drv->bdrv_put_buffer)
1174         return -ENOTSUP;
1175     return drv->bdrv_put_buffer(bs, buf, pos, size);
1176 }
1177
1178 int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size)
1179 {
1180     BlockDriver *drv = bs->drv;
1181     if (!drv)
1182         return -ENOMEDIUM;
1183     if (!drv->bdrv_get_buffer)
1184         return -ENOTSUP;
1185     return drv->bdrv_get_buffer(bs, buf, pos, size);
1186 }
1187
1188 /**************************************************************/
1189 /* handling of snapshots */
1190
1191 int bdrv_snapshot_create(BlockDriverState *bs,
1192                          QEMUSnapshotInfo *sn_info)
1193 {
1194     BlockDriver *drv = bs->drv;
1195     if (!drv)
1196         return -ENOMEDIUM;
1197     if (!drv->bdrv_snapshot_create)
1198         return -ENOTSUP;
1199     return drv->bdrv_snapshot_create(bs, sn_info);
1200 }
1201
1202 int bdrv_snapshot_goto(BlockDriverState *bs,
1203                        const char *snapshot_id)
1204 {
1205     BlockDriver *drv = bs->drv;
1206     if (!drv)
1207         return -ENOMEDIUM;
1208     if (!drv->bdrv_snapshot_goto)
1209         return -ENOTSUP;
1210     return drv->bdrv_snapshot_goto(bs, snapshot_id);
1211 }
1212
1213 int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
1214 {
1215     BlockDriver *drv = bs->drv;
1216     if (!drv)
1217         return -ENOMEDIUM;
1218     if (!drv->bdrv_snapshot_delete)
1219         return -ENOTSUP;
1220     return drv->bdrv_snapshot_delete(bs, snapshot_id);
1221 }
1222
1223 int bdrv_snapshot_list(BlockDriverState *bs,
1224                        QEMUSnapshotInfo **psn_info)
1225 {
1226     BlockDriver *drv = bs->drv;
1227     if (!drv)
1228         return -ENOMEDIUM;
1229     if (!drv->bdrv_snapshot_list)
1230         return -ENOTSUP;
1231     return drv->bdrv_snapshot_list(bs, psn_info);
1232 }
1233
1234 #define NB_SUFFIXES 4
1235
1236 char *get_human_readable_size(char *buf, int buf_size, int64_t size)
1237 {
1238     static const char suffixes[NB_SUFFIXES] = "KMGT";
1239     int64_t base;
1240     int i;
1241
1242     if (size <= 999) {
1243         snprintf(buf, buf_size, "%" PRId64, size);
1244     } else {
1245         base = 1024;
1246         for(i = 0; i < NB_SUFFIXES; i++) {
1247             if (size < (10 * base)) {
1248                 snprintf(buf, buf_size, "%0.1f%c",
1249                          (double)size / base,
1250                          suffixes[i]);
1251                 break;
1252             } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
1253                 snprintf(buf, buf_size, "%" PRId64 "%c",
1254                          ((size + (base >> 1)) / base),
1255                          suffixes[i]);
1256                 break;
1257             }
1258             base = base * 1024;
1259         }
1260     }
1261     return buf;
1262 }
1263
1264 char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
1265 {
1266     char buf1[128], date_buf[128], clock_buf[128];
1267 #ifdef _WIN32
1268     struct tm *ptm;
1269 #else
1270     struct tm tm;
1271 #endif
1272     time_t ti;
1273     int64_t secs;
1274
1275     if (!sn) {
1276         snprintf(buf, buf_size,
1277                  "%-10s%-20s%7s%20s%15s",
1278                  "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
1279     } else {
1280         ti = sn->date_sec;
1281 #ifdef _WIN32
1282         ptm = localtime(&ti);
1283         strftime(date_buf, sizeof(date_buf),
1284                  "%Y-%m-%d %H:%M:%S", ptm);
1285 #else
1286         localtime_r(&ti, &tm);
1287         strftime(date_buf, sizeof(date_buf),
1288                  "%Y-%m-%d %H:%M:%S", &tm);
1289 #endif
1290         secs = sn->vm_clock_nsec / 1000000000;
1291         snprintf(clock_buf, sizeof(clock_buf),
1292                  "%02d:%02d:%02d.%03d",
1293                  (int)(secs / 3600),
1294                  (int)((secs / 60) % 60),
1295                  (int)(secs % 60),
1296                  (int)((sn->vm_clock_nsec / 1000000) % 1000));
1297         snprintf(buf, buf_size,
1298                  "%-10s%-20s%7s%20s%15s",
1299                  sn->id_str, sn->name,
1300                  get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
1301                  date_buf,
1302                  clock_buf);
1303     }
1304     return buf;
1305 }
1306
1307
1308 /**************************************************************/
1309 /* async I/Os */
1310
1311 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
1312                                  QEMUIOVector *qiov, int nb_sectors,
1313                                  BlockDriverCompletionFunc *cb, void *opaque)
1314 {
1315     BlockDriver *drv = bs->drv;
1316     BlockDriverAIOCB *ret;
1317
1318     if (!drv)
1319         return NULL;
1320     if (bdrv_check_request(bs, sector_num, nb_sectors))
1321         return NULL;
1322
1323     ret = drv->bdrv_aio_readv(bs, sector_num, qiov, nb_sectors,
1324                               cb, opaque);
1325
1326     if (ret) {
1327         /* Update stats even though technically transfer has not happened. */
1328         bs->rd_bytes += (unsigned) nb_sectors * SECTOR_SIZE;
1329         bs->rd_ops ++;
1330     }
1331
1332     return ret;
1333 }
1334
1335 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
1336                                   QEMUIOVector *qiov, int nb_sectors,
1337                                   BlockDriverCompletionFunc *cb, void *opaque)
1338 {
1339     BlockDriver *drv = bs->drv;
1340     BlockDriverAIOCB *ret;
1341
1342     if (!drv)
1343         return NULL;
1344     if (bs->read_only)
1345         return NULL;
1346     if (bdrv_check_request(bs, sector_num, nb_sectors))
1347         return NULL;
1348
1349     ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
1350                                cb, opaque);
1351
1352     if (ret) {
1353         /* Update stats even though technically transfer has not happened. */
1354         bs->wr_bytes += (unsigned) nb_sectors * SECTOR_SIZE;
1355         bs->wr_ops ++;
1356     }
1357
1358     return ret;
1359 }
1360
1361 void bdrv_aio_cancel(BlockDriverAIOCB *acb)
1362 {
1363     acb->pool->cancel(acb);
1364 }
1365
1366
1367 /**************************************************************/
1368 /* async block device emulation */
1369
1370 typedef struct BlockDriverAIOCBSync {
1371     BlockDriverAIOCB common;
1372     QEMUBH *bh;
1373     int ret;
1374     /* vector translation state */
1375     QEMUIOVector *qiov;
1376     uint8_t *bounce;
1377     int is_write;
1378 } BlockDriverAIOCBSync;
1379
1380 static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
1381 {
1382     BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
1383     qemu_bh_delete(acb->bh);
1384     qemu_aio_release(acb);
1385 }
1386
1387 static AIOPool bdrv_em_aio_pool = {
1388     .aiocb_size         = sizeof(BlockDriverAIOCBSync),
1389     .cancel             = bdrv_aio_cancel_em,
1390 };
1391
1392 static void bdrv_aio_bh_cb(void *opaque)
1393 {
1394     BlockDriverAIOCBSync *acb = opaque;
1395
1396     if (!acb->is_write)
1397         qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
1398     qemu_vfree(acb->bounce);
1399     acb->common.cb(acb->common.opaque, acb->ret);
1400     qemu_bh_delete(acb->bh);
1401     qemu_aio_release(acb);
1402 }
1403
1404 static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
1405                                             int64_t sector_num,
1406                                             QEMUIOVector *qiov,
1407                                             int nb_sectors,
1408                                             BlockDriverCompletionFunc *cb,
1409                                             void *opaque,
1410                                             int is_write)
1411
1412 {
1413     BlockDriverAIOCBSync *acb;
1414
1415     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
1416     acb->is_write = is_write;
1417     acb->qiov = qiov;
1418     acb->bounce = qemu_blockalign(bs, qiov->size);
1419
1420     if (!acb->bh)
1421         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1422
1423     if (is_write) {
1424         qemu_iovec_to_buffer(acb->qiov, acb->bounce);
1425         acb->ret = bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
1426     } else {
1427         acb->ret = bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
1428     }
1429
1430     qemu_bh_schedule(acb->bh);
1431
1432     return &acb->common;
1433 }
1434
1435 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
1436         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
1437         BlockDriverCompletionFunc *cb, void *opaque)
1438 {
1439     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
1440 }
1441
1442 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
1443         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
1444         BlockDriverCompletionFunc *cb, void *opaque)
1445 {
1446     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
1447 }
1448
1449 /**************************************************************/
1450 /* sync block device emulation */
1451
1452 static void bdrv_rw_em_cb(void *opaque, int ret)
1453 {
1454     *(int *)opaque = ret;
1455 }
1456
1457 #define NOT_DONE 0x7fffffff
1458
1459 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
1460                         uint8_t *buf, int nb_sectors)
1461 {
1462     int async_ret;
1463     BlockDriverAIOCB *acb;
1464     struct iovec iov;
1465     QEMUIOVector qiov;
1466
1467     async_ret = NOT_DONE;
1468     iov.iov_base = (void *)buf;
1469     iov.iov_len = nb_sectors * 512;
1470     qemu_iovec_init_external(&qiov, &iov, 1);
1471     acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
1472         bdrv_rw_em_cb, &async_ret);
1473     if (acb == NULL)
1474         return -1;
1475
1476     while (async_ret == NOT_DONE) {
1477         qemu_aio_wait();
1478     }
1479
1480     return async_ret;
1481 }
1482
1483 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
1484                          const uint8_t *buf, int nb_sectors)
1485 {
1486     int async_ret;
1487     BlockDriverAIOCB *acb;
1488     struct iovec iov;
1489     QEMUIOVector qiov;
1490
1491     async_ret = NOT_DONE;
1492     iov.iov_base = (void *)buf;
1493     iov.iov_len = nb_sectors * 512;
1494     qemu_iovec_init_external(&qiov, &iov, 1);
1495     acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
1496         bdrv_rw_em_cb, &async_ret);
1497     if (acb == NULL)
1498         return -1;
1499     while (async_ret == NOT_DONE) {
1500         qemu_aio_wait();
1501     }
1502     return async_ret;
1503 }
1504
1505 void bdrv_init(void)
1506 {
1507     module_call_init(MODULE_INIT_BLOCK);
1508 }
1509
1510 void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
1511                    BlockDriverCompletionFunc *cb, void *opaque)
1512 {
1513     BlockDriverAIOCB *acb;
1514
1515     if (pool->free_aiocb) {
1516         acb = pool->free_aiocb;
1517         pool->free_aiocb = acb->next;
1518     } else {
1519         acb = qemu_mallocz(pool->aiocb_size);
1520         acb->pool = pool;
1521     }
1522     acb->bs = bs;
1523     acb->cb = cb;
1524     acb->opaque = opaque;
1525     return acb;
1526 }
1527
1528 void qemu_aio_release(void *p)
1529 {
1530     BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
1531     AIOPool *pool = acb->pool;
1532     acb->next = pool->free_aiocb;
1533     pool->free_aiocb = acb;
1534 }
1535
1536 /**************************************************************/
1537 /* removable device support */
1538
1539 /**
1540  * Return TRUE if the media is present
1541  */
1542 int bdrv_is_inserted(BlockDriverState *bs)
1543 {
1544     BlockDriver *drv = bs->drv;
1545     int ret;
1546     if (!drv)
1547         return 0;
1548     if (!drv->bdrv_is_inserted)
1549         return 1;
1550     ret = drv->bdrv_is_inserted(bs);
1551     return ret;
1552 }
1553
1554 /**
1555  * Return TRUE if the media changed since the last call to this
1556  * function. It is currently only used for floppy disks
1557  */
1558 int bdrv_media_changed(BlockDriverState *bs)
1559 {
1560     BlockDriver *drv = bs->drv;
1561     int ret;
1562
1563     if (!drv || !drv->bdrv_media_changed)
1564         ret = -ENOTSUP;
1565     else
1566         ret = drv->bdrv_media_changed(bs);
1567     if (ret == -ENOTSUP)
1568         ret = bs->media_changed;
1569     bs->media_changed = 0;
1570     return ret;
1571 }
1572
1573 /**
1574  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
1575  */
1576 int bdrv_eject(BlockDriverState *bs, int eject_flag)
1577 {
1578     BlockDriver *drv = bs->drv;
1579     int ret;
1580
1581     if (bs->locked) {
1582         return -EBUSY;
1583     }
1584
1585     if (!drv || !drv->bdrv_eject) {
1586         ret = -ENOTSUP;
1587     } else {
1588         ret = drv->bdrv_eject(bs, eject_flag);
1589     }
1590     if (ret == -ENOTSUP) {
1591         if (eject_flag)
1592             bdrv_close(bs);
1593         ret = 0;
1594     }
1595
1596     return ret;
1597 }
1598
1599 int bdrv_is_locked(BlockDriverState *bs)
1600 {
1601     return bs->locked;
1602 }
1603
1604 /**
1605  * Lock or unlock the media (if it is locked, the user won't be able
1606  * to eject it manually).
1607  */
1608 void bdrv_set_locked(BlockDriverState *bs, int locked)
1609 {
1610     BlockDriver *drv = bs->drv;
1611
1612     bs->locked = locked;
1613     if (drv && drv->bdrv_set_locked) {
1614         drv->bdrv_set_locked(bs, locked);
1615     }
1616 }
1617
1618 /* needed for generic scsi interface */
1619
1620 int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1621 {
1622     BlockDriver *drv = bs->drv;
1623
1624     if (drv && drv->bdrv_ioctl)
1625         return drv->bdrv_ioctl(bs, req, buf);
1626     return -ENOTSUP;
1627 }
1628
1629 BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
1630         unsigned long int req, void *buf,
1631         BlockDriverCompletionFunc *cb, void *opaque)
1632 {
1633     BlockDriver *drv = bs->drv;
1634
1635     if (drv && drv->bdrv_aio_ioctl)
1636         return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
1637     return NULL;
1638 }
1639
1640 void *qemu_blockalign(BlockDriverState *bs, size_t size)
1641 {
1642     return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
1643 }