Only build compatfd when using AIO and make sure to always init AIO
[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 "qemu-common.h"
25 #ifndef QEMU_IMG
26 #include "console.h"
27 #endif
28 #include "block_int.h"
29
30 #ifdef _BSD
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <sys/ioctl.h>
34 #include <sys/queue.h>
35 #include <sys/disk.h>
36 #endif
37
38 #define SECTOR_BITS 9
39 #define SECTOR_SIZE (1 << SECTOR_BITS)
40
41 typedef struct BlockDriverAIOCBSync {
42     BlockDriverAIOCB common;
43     QEMUBH *bh;
44     int ret;
45 } BlockDriverAIOCBSync;
46
47 static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
48         int64_t sector_num, uint8_t *buf, int nb_sectors,
49         BlockDriverCompletionFunc *cb, void *opaque);
50 static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
51         int64_t sector_num, const uint8_t *buf, int nb_sectors,
52         BlockDriverCompletionFunc *cb, void *opaque);
53 static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb);
54 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
55                         uint8_t *buf, int nb_sectors);
56 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
57                          const uint8_t *buf, int nb_sectors);
58
59 static BlockDriver *first_drv;
60
61 int path_is_absolute(const char *path)
62 {
63     const char *p;
64 #ifdef _WIN32
65     /* specific case for names like: "\\.\d:" */
66     if (*path == '/' || *path == '\\')
67         return 1;
68 #endif
69     p = strchr(path, ':');
70     if (p)
71         p++;
72     else
73         p = path;
74 #ifdef _WIN32
75     return (*p == '/' || *p == '\\');
76 #else
77     return (*p == '/');
78 #endif
79 }
80
81 /* if filename is absolute, just copy it to dest. Otherwise, build a
82    path to it by considering it is relative to base_path. URL are
83    supported. */
84 void path_combine(char *dest, int dest_size,
85                   const char *base_path,
86                   const char *filename)
87 {
88     const char *p, *p1;
89     int len;
90
91     if (dest_size <= 0)
92         return;
93     if (path_is_absolute(filename)) {
94         pstrcpy(dest, dest_size, filename);
95     } else {
96         p = strchr(base_path, ':');
97         if (p)
98             p++;
99         else
100             p = base_path;
101         p1 = strrchr(base_path, '/');
102 #ifdef _WIN32
103         {
104             const char *p2;
105             p2 = strrchr(base_path, '\\');
106             if (!p1 || p2 > p1)
107                 p1 = p2;
108         }
109 #endif
110         if (p1)
111             p1++;
112         else
113             p1 = base_path;
114         if (p1 > p)
115             p = p1;
116         len = p - base_path;
117         if (len > dest_size - 1)
118             len = dest_size - 1;
119         memcpy(dest, base_path, len);
120         dest[len] = '\0';
121         pstrcat(dest, dest_size, filename);
122     }
123 }
124
125
126 static void bdrv_register(BlockDriver *bdrv)
127 {
128     if (!bdrv->bdrv_aio_read) {
129         /* add AIO emulation layer */
130         bdrv->bdrv_aio_read = bdrv_aio_read_em;
131         bdrv->bdrv_aio_write = bdrv_aio_write_em;
132         bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;
133         bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);
134     } else if (!bdrv->bdrv_read && !bdrv->bdrv_pread) {
135         /* add synchronous IO emulation layer */
136         bdrv->bdrv_read = bdrv_read_em;
137         bdrv->bdrv_write = bdrv_write_em;
138     }
139     bdrv->next = first_drv;
140     first_drv = bdrv;
141 }
142
143 /* create a new block device (by default it is empty) */
144 BlockDriverState *bdrv_new(const char *device_name)
145 {
146     BlockDriverState **pbs, *bs;
147
148     bs = qemu_mallocz(sizeof(BlockDriverState));
149     if(!bs)
150         return NULL;
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,
173                 const char *filename, int64_t size_in_sectors,
174                 const char *backing_file, int flags)
175 {
176     if (!drv->bdrv_create)
177         return -ENOTSUP;
178     return drv->bdrv_create(filename, size_in_sectors, backing_file, flags);
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     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 static 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;
229     const char *p;
230
231 #ifdef _WIN32
232     if (is_windows_drive(filename) ||
233         is_windows_drive_prefix(filename))
234         return &bdrv_raw;
235 #endif
236     p = strchr(filename, ':');
237     if (!p)
238         return &bdrv_raw;
239     len = p - filename;
240     if (len > sizeof(protocol) - 1)
241         len = sizeof(protocol) - 1;
242     memcpy(protocol, filename, len);
243     protocol[len] = '\0';
244     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
245         if (drv1->protocol_name &&
246             !strcmp(drv1->protocol_name, protocol))
247             return drv1;
248     }
249     return NULL;
250 }
251
252 /* XXX: force raw format if block or character device ? It would
253    simplify the BSD case */
254 static BlockDriver *find_image_format(const char *filename)
255 {
256     int ret, score, score_max;
257     BlockDriver *drv1, *drv;
258     uint8_t buf[2048];
259     BlockDriverState *bs;
260
261     /* detect host devices. By convention, /dev/cdrom[N] is always
262        recognized as a host CDROM */
263     if (strstart(filename, "/dev/cdrom", NULL))
264         return &bdrv_host_device;
265 #ifdef _WIN32
266     if (is_windows_drive(filename))
267         return &bdrv_host_device;
268 #else
269     {
270         struct stat st;
271         if (stat(filename, &st) >= 0 &&
272             (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {
273             return &bdrv_host_device;
274         }
275     }
276 #endif
277
278     drv = find_protocol(filename);
279     /* no need to test disk image formats for vvfat */
280     if (drv == &bdrv_vvfat)
281         return drv;
282
283     ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY);
284     if (ret < 0)
285         return NULL;
286     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
287     bdrv_delete(bs);
288     if (ret < 0) {
289         return NULL;
290     }
291
292     score_max = 0;
293     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
294         if (drv1->bdrv_probe) {
295             score = drv1->bdrv_probe(buf, ret, filename);
296             if (score > score_max) {
297                 score_max = score;
298                 drv = drv1;
299             }
300         }
301     }
302     return drv;
303 }
304
305 int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
306 {
307     BlockDriverState *bs;
308     int ret;
309
310     bs = bdrv_new("");
311     if (!bs)
312         return -ENOMEM;
313     ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
314     if (ret < 0) {
315         bdrv_delete(bs);
316         return ret;
317     }
318     *pbs = bs;
319     return 0;
320 }
321
322 int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
323 {
324     return bdrv_open2(bs, filename, flags, NULL);
325 }
326
327 int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
328                BlockDriver *drv)
329 {
330     int ret, open_flags;
331     char tmp_filename[PATH_MAX];
332     char backing_filename[PATH_MAX];
333
334     bs->read_only = 0;
335     bs->is_temporary = 0;
336     bs->encrypted = 0;
337
338     if (flags & BDRV_O_SNAPSHOT) {
339         BlockDriverState *bs1;
340         int64_t total_size;
341
342         /* if snapshot, we create a temporary backing file and open it
343            instead of opening 'filename' directly */
344
345         /* if there is a backing file, use it */
346         bs1 = bdrv_new("");
347         if (!bs1) {
348             return -ENOMEM;
349         }
350         if (bdrv_open(bs1, filename, 0) < 0) {
351             bdrv_delete(bs1);
352             return -1;
353         }
354         total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
355         bdrv_delete(bs1);
356
357         get_tmp_filename(tmp_filename, sizeof(tmp_filename));
358         realpath(filename, backing_filename);
359         if (bdrv_create(&bdrv_qcow2, tmp_filename,
360                         total_size, backing_filename, 0) < 0) {
361             return -1;
362         }
363         filename = tmp_filename;
364         bs->is_temporary = 1;
365     }
366
367     pstrcpy(bs->filename, sizeof(bs->filename), filename);
368     if (flags & BDRV_O_FILE) {
369         drv = find_protocol(filename);
370         if (!drv)
371             return -ENOENT;
372     } else {
373         if (!drv) {
374             drv = find_image_format(filename);
375             if (!drv)
376                 return -1;
377         }
378     }
379     bs->drv = drv;
380     bs->opaque = qemu_mallocz(drv->instance_size);
381     if (bs->opaque == NULL && drv->instance_size > 0)
382         return -1;
383     /* Note: for compatibility, we open disk image files as RDWR, and
384        RDONLY as fallback */
385     if (!(flags & BDRV_O_FILE))
386         open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT);
387     else
388         open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
389     ret = drv->bdrv_open(bs, filename, open_flags);
390     if (ret == -EACCES && !(flags & BDRV_O_FILE)) {
391         ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY);
392         bs->read_only = 1;
393     }
394     if (ret < 0) {
395         qemu_free(bs->opaque);
396         bs->opaque = NULL;
397         bs->drv = NULL;
398         return ret;
399     }
400     if (drv->bdrv_getlength) {
401         bs->total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
402     }
403 #ifndef _WIN32
404     if (bs->is_temporary) {
405         unlink(filename);
406     }
407 #endif
408     if (bs->backing_file[0] != '\0') {
409         /* if there is a backing file, use it */
410         bs->backing_hd = bdrv_new("");
411         if (!bs->backing_hd) {
412         fail:
413             bdrv_close(bs);
414             return -ENOMEM;
415         }
416         path_combine(backing_filename, sizeof(backing_filename),
417                      filename, bs->backing_file);
418         if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0)
419             goto fail;
420     }
421
422     /* call the change callback */
423     bs->media_changed = 1;
424     if (bs->change_cb)
425         bs->change_cb(bs->change_opaque);
426
427     return 0;
428 }
429
430 void bdrv_close(BlockDriverState *bs)
431 {
432     if (bs->drv) {
433         if (bs->backing_hd)
434             bdrv_delete(bs->backing_hd);
435         bs->drv->bdrv_close(bs);
436         qemu_free(bs->opaque);
437 #ifdef _WIN32
438         if (bs->is_temporary) {
439             unlink(bs->filename);
440         }
441 #endif
442         bs->opaque = NULL;
443         bs->drv = NULL;
444
445         /* call the change callback */
446         bs->media_changed = 1;
447         if (bs->change_cb)
448             bs->change_cb(bs->change_opaque);
449     }
450 }
451
452 void bdrv_delete(BlockDriverState *bs)
453 {
454     BlockDriverState **pbs;
455
456     pbs = &bdrv_first;
457     while (*pbs != bs && *pbs != NULL)
458         pbs = &(*pbs)->next;
459     if (*pbs == bs)
460         *pbs = bs->next;
461
462     bdrv_close(bs);
463     qemu_free(bs);
464 }
465
466 /* commit COW file into the raw image */
467 int bdrv_commit(BlockDriverState *bs)
468 {
469     BlockDriver *drv = bs->drv;
470     int64_t i, total_sectors;
471     int n, j;
472     unsigned char sector[512];
473
474     if (!drv)
475         return -ENOMEDIUM;
476
477     if (bs->read_only) {
478         return -EACCES;
479     }
480
481     if (!bs->backing_hd) {
482         return -ENOTSUP;
483     }
484
485     total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
486     for (i = 0; i < total_sectors;) {
487         if (drv->bdrv_is_allocated(bs, i, 65536, &n)) {
488             for(j = 0; j < n; j++) {
489                 if (bdrv_read(bs, i, sector, 1) != 0) {
490                     return -EIO;
491                 }
492
493                 if (bdrv_write(bs->backing_hd, i, sector, 1) != 0) {
494                     return -EIO;
495                 }
496                 i++;
497             }
498         } else {
499             i += n;
500         }
501     }
502
503     if (drv->bdrv_make_empty)
504         return drv->bdrv_make_empty(bs);
505
506     return 0;
507 }
508
509 /* return < 0 if error. See bdrv_write() for the return codes */
510 int bdrv_read(BlockDriverState *bs, int64_t sector_num,
511               uint8_t *buf, int nb_sectors)
512 {
513     BlockDriver *drv = bs->drv;
514
515     if (!drv)
516         return -ENOMEDIUM;
517
518     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
519             memcpy(buf, bs->boot_sector_data, 512);
520         sector_num++;
521         nb_sectors--;
522         buf += 512;
523         if (nb_sectors == 0)
524             return 0;
525     }
526     if (drv->bdrv_pread) {
527         int ret, len;
528         len = nb_sectors * 512;
529         ret = drv->bdrv_pread(bs, sector_num * 512, buf, len);
530         if (ret < 0)
531             return ret;
532         else if (ret != len)
533             return -EINVAL;
534         else {
535             bs->rd_bytes += (unsigned) len;
536             bs->rd_ops ++;
537             return 0;
538         }
539     } else {
540         return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
541     }
542 }
543
544 /* Return < 0 if error. Important errors are:
545   -EIO         generic I/O error (may happen for all errors)
546   -ENOMEDIUM   No media inserted.
547   -EINVAL      Invalid sector number or nb_sectors
548   -EACCES      Trying to write a read-only device
549 */
550 int bdrv_write(BlockDriverState *bs, int64_t sector_num,
551                const uint8_t *buf, int nb_sectors)
552 {
553     BlockDriver *drv = bs->drv;
554     if (!bs->drv)
555         return -ENOMEDIUM;
556     if (bs->read_only)
557         return -EACCES;
558     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
559         memcpy(bs->boot_sector_data, buf, 512);
560     }
561     if (drv->bdrv_pwrite) {
562         int ret, len;
563         len = nb_sectors * 512;
564         ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len);
565         if (ret < 0)
566             return ret;
567         else if (ret != len)
568             return -EIO;
569         else {
570             bs->wr_bytes += (unsigned) len;
571             bs->wr_ops ++;
572             return 0;
573         }
574     } else {
575         return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
576     }
577 }
578
579 static int bdrv_pread_em(BlockDriverState *bs, int64_t offset,
580                          uint8_t *buf, int count1)
581 {
582     uint8_t tmp_buf[SECTOR_SIZE];
583     int len, nb_sectors, count;
584     int64_t sector_num;
585
586     count = count1;
587     /* first read to align to sector start */
588     len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
589     if (len > count)
590         len = count;
591     sector_num = offset >> SECTOR_BITS;
592     if (len > 0) {
593         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
594             return -EIO;
595         memcpy(buf, tmp_buf + (offset & (SECTOR_SIZE - 1)), len);
596         count -= len;
597         if (count == 0)
598             return count1;
599         sector_num++;
600         buf += len;
601     }
602
603     /* read the sectors "in place" */
604     nb_sectors = count >> SECTOR_BITS;
605     if (nb_sectors > 0) {
606         if (bdrv_read(bs, sector_num, buf, nb_sectors) < 0)
607             return -EIO;
608         sector_num += nb_sectors;
609         len = nb_sectors << SECTOR_BITS;
610         buf += len;
611         count -= len;
612     }
613
614     /* add data from the last sector */
615     if (count > 0) {
616         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
617             return -EIO;
618         memcpy(buf, tmp_buf, count);
619     }
620     return count1;
621 }
622
623 static int bdrv_pwrite_em(BlockDriverState *bs, int64_t offset,
624                           const uint8_t *buf, int count1)
625 {
626     uint8_t tmp_buf[SECTOR_SIZE];
627     int len, nb_sectors, count;
628     int64_t sector_num;
629
630     count = count1;
631     /* first write to align to sector start */
632     len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
633     if (len > count)
634         len = count;
635     sector_num = offset >> SECTOR_BITS;
636     if (len > 0) {
637         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
638             return -EIO;
639         memcpy(tmp_buf + (offset & (SECTOR_SIZE - 1)), buf, len);
640         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
641             return -EIO;
642         count -= len;
643         if (count == 0)
644             return count1;
645         sector_num++;
646         buf += len;
647     }
648
649     /* write the sectors "in place" */
650     nb_sectors = count >> SECTOR_BITS;
651     if (nb_sectors > 0) {
652         if (bdrv_write(bs, sector_num, buf, nb_sectors) < 0)
653             return -EIO;
654         sector_num += nb_sectors;
655         len = nb_sectors << SECTOR_BITS;
656         buf += len;
657         count -= len;
658     }
659
660     /* add data from the last sector */
661     if (count > 0) {
662         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
663             return -EIO;
664         memcpy(tmp_buf, buf, count);
665         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
666             return -EIO;
667     }
668     return count1;
669 }
670
671 /**
672  * Read with byte offsets (needed only for file protocols)
673  */
674 int bdrv_pread(BlockDriverState *bs, int64_t offset,
675                void *buf1, int count1)
676 {
677     BlockDriver *drv = bs->drv;
678
679     if (!drv)
680         return -ENOMEDIUM;
681     if (!drv->bdrv_pread)
682         return bdrv_pread_em(bs, offset, buf1, count1);
683     return drv->bdrv_pread(bs, offset, buf1, count1);
684 }
685
686 /**
687  * Write with byte offsets (needed only for file protocols)
688  */
689 int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
690                 const void *buf1, int count1)
691 {
692     BlockDriver *drv = bs->drv;
693
694     if (!drv)
695         return -ENOMEDIUM;
696     if (!drv->bdrv_pwrite)
697         return bdrv_pwrite_em(bs, offset, buf1, count1);
698     return drv->bdrv_pwrite(bs, offset, buf1, count1);
699 }
700
701 /**
702  * Truncate file to 'offset' bytes (needed only for file protocols)
703  */
704 int bdrv_truncate(BlockDriverState *bs, int64_t offset)
705 {
706     BlockDriver *drv = bs->drv;
707     if (!drv)
708         return -ENOMEDIUM;
709     if (!drv->bdrv_truncate)
710         return -ENOTSUP;
711     return drv->bdrv_truncate(bs, offset);
712 }
713
714 /**
715  * Length of a file in bytes. Return < 0 if error or unknown.
716  */
717 int64_t bdrv_getlength(BlockDriverState *bs)
718 {
719     BlockDriver *drv = bs->drv;
720     if (!drv)
721         return -ENOMEDIUM;
722     if (!drv->bdrv_getlength) {
723         /* legacy mode */
724         return bs->total_sectors * SECTOR_SIZE;
725     }
726     return drv->bdrv_getlength(bs);
727 }
728
729 /* return 0 as number of sectors if no device present or error */
730 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
731 {
732     int64_t length;
733     length = bdrv_getlength(bs);
734     if (length < 0)
735         length = 0;
736     else
737         length = length >> SECTOR_BITS;
738     *nb_sectors_ptr = length;
739 }
740
741 /* force a given boot sector. */
742 void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size)
743 {
744     bs->boot_sector_enabled = 1;
745     if (size > 512)
746         size = 512;
747     memcpy(bs->boot_sector_data, data, size);
748     memset(bs->boot_sector_data + size, 0, 512 - size);
749 }
750
751 void bdrv_set_geometry_hint(BlockDriverState *bs,
752                             int cyls, int heads, int secs)
753 {
754     bs->cyls = cyls;
755     bs->heads = heads;
756     bs->secs = secs;
757 }
758
759 void bdrv_set_type_hint(BlockDriverState *bs, int type)
760 {
761     bs->type = type;
762     bs->removable = ((type == BDRV_TYPE_CDROM ||
763                       type == BDRV_TYPE_FLOPPY));
764 }
765
766 void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
767 {
768     bs->translation = translation;
769 }
770
771 void bdrv_get_geometry_hint(BlockDriverState *bs,
772                             int *pcyls, int *pheads, int *psecs)
773 {
774     *pcyls = bs->cyls;
775     *pheads = bs->heads;
776     *psecs = bs->secs;
777 }
778
779 int bdrv_get_type_hint(BlockDriverState *bs)
780 {
781     return bs->type;
782 }
783
784 int bdrv_get_translation_hint(BlockDriverState *bs)
785 {
786     return bs->translation;
787 }
788
789 int bdrv_is_removable(BlockDriverState *bs)
790 {
791     return bs->removable;
792 }
793
794 int bdrv_is_read_only(BlockDriverState *bs)
795 {
796     return bs->read_only;
797 }
798
799 int bdrv_is_sg(BlockDriverState *bs)
800 {
801     return bs->sg;
802 }
803
804 /* XXX: no longer used */
805 void bdrv_set_change_cb(BlockDriverState *bs,
806                         void (*change_cb)(void *opaque), void *opaque)
807 {
808     bs->change_cb = change_cb;
809     bs->change_opaque = opaque;
810 }
811
812 int bdrv_is_encrypted(BlockDriverState *bs)
813 {
814     if (bs->backing_hd && bs->backing_hd->encrypted)
815         return 1;
816     return bs->encrypted;
817 }
818
819 int bdrv_set_key(BlockDriverState *bs, const char *key)
820 {
821     int ret;
822     if (bs->backing_hd && bs->backing_hd->encrypted) {
823         ret = bdrv_set_key(bs->backing_hd, key);
824         if (ret < 0)
825             return ret;
826         if (!bs->encrypted)
827             return 0;
828     }
829     if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
830         return -1;
831     return bs->drv->bdrv_set_key(bs, key);
832 }
833
834 void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
835 {
836     if (!bs->drv) {
837         buf[0] = '\0';
838     } else {
839         pstrcpy(buf, buf_size, bs->drv->format_name);
840     }
841 }
842
843 void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
844                          void *opaque)
845 {
846     BlockDriver *drv;
847
848     for (drv = first_drv; drv != NULL; drv = drv->next) {
849         it(opaque, drv->format_name);
850     }
851 }
852
853 BlockDriverState *bdrv_find(const char *name)
854 {
855     BlockDriverState *bs;
856
857     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
858         if (!strcmp(name, bs->device_name))
859             return bs;
860     }
861     return NULL;
862 }
863
864 void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque)
865 {
866     BlockDriverState *bs;
867
868     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
869         it(opaque, bs->device_name);
870     }
871 }
872
873 const char *bdrv_get_device_name(BlockDriverState *bs)
874 {
875     return bs->device_name;
876 }
877
878 void bdrv_flush(BlockDriverState *bs)
879 {
880     if (bs->drv->bdrv_flush)
881         bs->drv->bdrv_flush(bs);
882     if (bs->backing_hd)
883         bdrv_flush(bs->backing_hd);
884 }
885
886 /*
887  * Returns true iff the specified sector is present in the disk image. Drivers
888  * not implementing the functionality are assumed to not support backing files,
889  * hence all their sectors are reported as allocated.
890  *
891  * 'pnum' is set to the number of sectors (including and immediately following
892  * the specified sector) that are known to be in the same
893  * allocated/unallocated state.
894  *
895  * 'nb_sectors' is the max value 'pnum' should be set to.
896  */
897 int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
898         int *pnum)
899 {
900     int64_t n;
901     if (!bs->drv->bdrv_is_allocated) {
902         if (sector_num >= bs->total_sectors) {
903             *pnum = 0;
904             return 0;
905         }
906         n = bs->total_sectors - sector_num;
907         *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
908         return 1;
909     }
910     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
911 }
912
913 #ifndef QEMU_IMG
914 void bdrv_info(void)
915 {
916     BlockDriverState *bs;
917
918     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
919         term_printf("%s:", bs->device_name);
920         term_printf(" type=");
921         switch(bs->type) {
922         case BDRV_TYPE_HD:
923             term_printf("hd");
924             break;
925         case BDRV_TYPE_CDROM:
926             term_printf("cdrom");
927             break;
928         case BDRV_TYPE_FLOPPY:
929             term_printf("floppy");
930             break;
931         }
932         term_printf(" removable=%d", bs->removable);
933         if (bs->removable) {
934             term_printf(" locked=%d", bs->locked);
935         }
936         if (bs->drv) {
937             term_printf(" file=");
938             term_print_filename(bs->filename);
939             if (bs->backing_file[0] != '\0') {
940                 term_printf(" backing_file=");
941                 term_print_filename(bs->backing_file);
942             }
943             term_printf(" ro=%d", bs->read_only);
944             term_printf(" drv=%s", bs->drv->format_name);
945             if (bs->encrypted)
946                 term_printf(" encrypted");
947         } else {
948             term_printf(" [not inserted]");
949         }
950         term_printf("\n");
951     }
952 }
953
954 /* The "info blockstats" command. */
955 void bdrv_info_stats (void)
956 {
957     BlockDriverState *bs;
958
959     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
960         term_printf ("%s:"
961                      " rd_bytes=%" PRIu64
962                      " wr_bytes=%" PRIu64
963                      " rd_operations=%" PRIu64
964                      " wr_operations=%" PRIu64
965                      "\n",
966                      bs->device_name,
967                      bs->rd_bytes, bs->wr_bytes,
968                      bs->rd_ops, bs->wr_ops);
969     }
970 }
971 #endif
972
973 void bdrv_get_backing_filename(BlockDriverState *bs,
974                                char *filename, int filename_size)
975 {
976     if (!bs->backing_hd) {
977         pstrcpy(filename, filename_size, "");
978     } else {
979         pstrcpy(filename, filename_size, bs->backing_file);
980     }
981 }
982
983 int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
984                           const uint8_t *buf, int nb_sectors)
985 {
986     BlockDriver *drv = bs->drv;
987     if (!drv)
988         return -ENOMEDIUM;
989     if (!drv->bdrv_write_compressed)
990         return -ENOTSUP;
991     return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
992 }
993
994 int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
995 {
996     BlockDriver *drv = bs->drv;
997     if (!drv)
998         return -ENOMEDIUM;
999     if (!drv->bdrv_get_info)
1000         return -ENOTSUP;
1001     memset(bdi, 0, sizeof(*bdi));
1002     return drv->bdrv_get_info(bs, bdi);
1003 }
1004
1005 /**************************************************************/
1006 /* handling of snapshots */
1007
1008 int bdrv_snapshot_create(BlockDriverState *bs,
1009                          QEMUSnapshotInfo *sn_info)
1010 {
1011     BlockDriver *drv = bs->drv;
1012     if (!drv)
1013         return -ENOMEDIUM;
1014     if (!drv->bdrv_snapshot_create)
1015         return -ENOTSUP;
1016     return drv->bdrv_snapshot_create(bs, sn_info);
1017 }
1018
1019 int bdrv_snapshot_goto(BlockDriverState *bs,
1020                        const char *snapshot_id)
1021 {
1022     BlockDriver *drv = bs->drv;
1023     if (!drv)
1024         return -ENOMEDIUM;
1025     if (!drv->bdrv_snapshot_goto)
1026         return -ENOTSUP;
1027     return drv->bdrv_snapshot_goto(bs, snapshot_id);
1028 }
1029
1030 int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
1031 {
1032     BlockDriver *drv = bs->drv;
1033     if (!drv)
1034         return -ENOMEDIUM;
1035     if (!drv->bdrv_snapshot_delete)
1036         return -ENOTSUP;
1037     return drv->bdrv_snapshot_delete(bs, snapshot_id);
1038 }
1039
1040 int bdrv_snapshot_list(BlockDriverState *bs,
1041                        QEMUSnapshotInfo **psn_info)
1042 {
1043     BlockDriver *drv = bs->drv;
1044     if (!drv)
1045         return -ENOMEDIUM;
1046     if (!drv->bdrv_snapshot_list)
1047         return -ENOTSUP;
1048     return drv->bdrv_snapshot_list(bs, psn_info);
1049 }
1050
1051 #define NB_SUFFIXES 4
1052
1053 char *get_human_readable_size(char *buf, int buf_size, int64_t size)
1054 {
1055     static const char suffixes[NB_SUFFIXES] = "KMGT";
1056     int64_t base;
1057     int i;
1058
1059     if (size <= 999) {
1060         snprintf(buf, buf_size, "%" PRId64, size);
1061     } else {
1062         base = 1024;
1063         for(i = 0; i < NB_SUFFIXES; i++) {
1064             if (size < (10 * base)) {
1065                 snprintf(buf, buf_size, "%0.1f%c",
1066                          (double)size / base,
1067                          suffixes[i]);
1068                 break;
1069             } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
1070                 snprintf(buf, buf_size, "%" PRId64 "%c",
1071                          ((size + (base >> 1)) / base),
1072                          suffixes[i]);
1073                 break;
1074             }
1075             base = base * 1024;
1076         }
1077     }
1078     return buf;
1079 }
1080
1081 char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
1082 {
1083     char buf1[128], date_buf[128], clock_buf[128];
1084 #ifdef _WIN32
1085     struct tm *ptm;
1086 #else
1087     struct tm tm;
1088 #endif
1089     time_t ti;
1090     int64_t secs;
1091
1092     if (!sn) {
1093         snprintf(buf, buf_size,
1094                  "%-10s%-20s%7s%20s%15s",
1095                  "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
1096     } else {
1097         ti = sn->date_sec;
1098 #ifdef _WIN32
1099         ptm = localtime(&ti);
1100         strftime(date_buf, sizeof(date_buf),
1101                  "%Y-%m-%d %H:%M:%S", ptm);
1102 #else
1103         localtime_r(&ti, &tm);
1104         strftime(date_buf, sizeof(date_buf),
1105                  "%Y-%m-%d %H:%M:%S", &tm);
1106 #endif
1107         secs = sn->vm_clock_nsec / 1000000000;
1108         snprintf(clock_buf, sizeof(clock_buf),
1109                  "%02d:%02d:%02d.%03d",
1110                  (int)(secs / 3600),
1111                  (int)((secs / 60) % 60),
1112                  (int)(secs % 60),
1113                  (int)((sn->vm_clock_nsec / 1000000) % 1000));
1114         snprintf(buf, buf_size,
1115                  "%-10s%-20s%7s%20s%15s",
1116                  sn->id_str, sn->name,
1117                  get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
1118                  date_buf,
1119                  clock_buf);
1120     }
1121     return buf;
1122 }
1123
1124
1125 /**************************************************************/
1126 /* async I/Os */
1127
1128 BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num,
1129                                 uint8_t *buf, int nb_sectors,
1130                                 BlockDriverCompletionFunc *cb, void *opaque)
1131 {
1132     BlockDriver *drv = bs->drv;
1133     BlockDriverAIOCB *ret;
1134
1135     if (!drv)
1136         return NULL;
1137
1138     /* XXX: we assume that nb_sectors == 0 is suppored by the async read */
1139     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
1140         memcpy(buf, bs->boot_sector_data, 512);
1141         sector_num++;
1142         nb_sectors--;
1143         buf += 512;
1144     }
1145
1146     ret = drv->bdrv_aio_read(bs, sector_num, buf, nb_sectors, cb, opaque);
1147
1148     if (ret) {
1149         /* Update stats even though technically transfer has not happened. */
1150         bs->rd_bytes += (unsigned) nb_sectors * SECTOR_SIZE;
1151         bs->rd_ops ++;
1152     }
1153
1154     return ret;
1155 }
1156
1157 BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
1158                                  const uint8_t *buf, int nb_sectors,
1159                                  BlockDriverCompletionFunc *cb, void *opaque)
1160 {
1161     BlockDriver *drv = bs->drv;
1162     BlockDriverAIOCB *ret;
1163
1164     if (!drv)
1165         return NULL;
1166     if (bs->read_only)
1167         return NULL;
1168     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
1169         memcpy(bs->boot_sector_data, buf, 512);
1170     }
1171
1172     ret = drv->bdrv_aio_write(bs, sector_num, buf, nb_sectors, cb, opaque);
1173
1174     if (ret) {
1175         /* Update stats even though technically transfer has not happened. */
1176         bs->wr_bytes += (unsigned) nb_sectors * SECTOR_SIZE;
1177         bs->wr_ops ++;
1178     }
1179
1180     return ret;
1181 }
1182
1183 void bdrv_aio_cancel(BlockDriverAIOCB *acb)
1184 {
1185     BlockDriver *drv = acb->bs->drv;
1186
1187     drv->bdrv_aio_cancel(acb);
1188 }
1189
1190
1191 /**************************************************************/
1192 /* async block device emulation */
1193
1194 #ifdef QEMU_IMG
1195 static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
1196         int64_t sector_num, uint8_t *buf, int nb_sectors,
1197         BlockDriverCompletionFunc *cb, void *opaque)
1198 {
1199     int ret;
1200     ret = bdrv_read(bs, sector_num, buf, nb_sectors);
1201     cb(opaque, ret);
1202     return NULL;
1203 }
1204
1205 static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
1206         int64_t sector_num, const uint8_t *buf, int nb_sectors,
1207         BlockDriverCompletionFunc *cb, void *opaque)
1208 {
1209     int ret;
1210     ret = bdrv_write(bs, sector_num, buf, nb_sectors);
1211     cb(opaque, ret);
1212     return NULL;
1213 }
1214
1215 static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb)
1216 {
1217 }
1218 #else
1219 static void bdrv_aio_bh_cb(void *opaque)
1220 {
1221     BlockDriverAIOCBSync *acb = opaque;
1222     acb->common.cb(acb->common.opaque, acb->ret);
1223     qemu_aio_release(acb);
1224 }
1225
1226 static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
1227         int64_t sector_num, uint8_t *buf, int nb_sectors,
1228         BlockDriverCompletionFunc *cb, void *opaque)
1229 {
1230     BlockDriverAIOCBSync *acb;
1231     int ret;
1232
1233     acb = qemu_aio_get(bs, cb, opaque);
1234     if (!acb->bh)
1235         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1236     ret = bdrv_read(bs, sector_num, buf, nb_sectors);
1237     acb->ret = ret;
1238     qemu_bh_schedule(acb->bh);
1239     return &acb->common;
1240 }
1241
1242 static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
1243         int64_t sector_num, const uint8_t *buf, int nb_sectors,
1244         BlockDriverCompletionFunc *cb, void *opaque)
1245 {
1246     BlockDriverAIOCBSync *acb;
1247     int ret;
1248
1249     acb = qemu_aio_get(bs, cb, opaque);
1250     if (!acb->bh)
1251         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1252     ret = bdrv_write(bs, sector_num, buf, nb_sectors);
1253     acb->ret = ret;
1254     qemu_bh_schedule(acb->bh);
1255     return &acb->common;
1256 }
1257
1258 static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
1259 {
1260     BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
1261     qemu_bh_cancel(acb->bh);
1262     qemu_aio_release(acb);
1263 }
1264 #endif /* !QEMU_IMG */
1265
1266 /**************************************************************/
1267 /* sync block device emulation */
1268
1269 static void bdrv_rw_em_cb(void *opaque, int ret)
1270 {
1271     *(int *)opaque = ret;
1272 }
1273
1274 #define NOT_DONE 0x7fffffff
1275
1276 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
1277                         uint8_t *buf, int nb_sectors)
1278 {
1279     int async_ret;
1280     BlockDriverAIOCB *acb;
1281
1282     async_ret = NOT_DONE;
1283     acb = bdrv_aio_read(bs, sector_num, buf, nb_sectors,
1284                         bdrv_rw_em_cb, &async_ret);
1285     if (acb == NULL)
1286         return -1;
1287
1288     while (async_ret == NOT_DONE) {
1289         qemu_aio_wait();
1290     }
1291
1292     return async_ret;
1293 }
1294
1295 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
1296                          const uint8_t *buf, int nb_sectors)
1297 {
1298     int async_ret;
1299     BlockDriverAIOCB *acb;
1300
1301     async_ret = NOT_DONE;
1302     acb = bdrv_aio_write(bs, sector_num, buf, nb_sectors,
1303                          bdrv_rw_em_cb, &async_ret);
1304     if (acb == NULL)
1305         return -1;
1306     while (async_ret == NOT_DONE) {
1307         qemu_aio_wait();
1308     }
1309     return async_ret;
1310 }
1311
1312 void bdrv_init(void)
1313 {
1314     bdrv_register(&bdrv_raw);
1315     bdrv_register(&bdrv_host_device);
1316 #ifndef _WIN32
1317     bdrv_register(&bdrv_cow);
1318 #endif
1319     bdrv_register(&bdrv_qcow);
1320     bdrv_register(&bdrv_vmdk);
1321     bdrv_register(&bdrv_cloop);
1322     bdrv_register(&bdrv_dmg);
1323     bdrv_register(&bdrv_bochs);
1324     bdrv_register(&bdrv_vpc);
1325     bdrv_register(&bdrv_vvfat);
1326     bdrv_register(&bdrv_qcow2);
1327     bdrv_register(&bdrv_parallels);
1328 #ifndef _WIN32
1329     bdrv_register(&bdrv_nbd);
1330 #endif
1331
1332     qemu_aio_init();
1333 }
1334
1335 void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
1336                    void *opaque)
1337 {
1338     BlockDriver *drv;
1339     BlockDriverAIOCB *acb;
1340
1341     drv = bs->drv;
1342     if (drv->free_aiocb) {
1343         acb = drv->free_aiocb;
1344         drv->free_aiocb = acb->next;
1345     } else {
1346         acb = qemu_mallocz(drv->aiocb_size);
1347         if (!acb)
1348             return NULL;
1349     }
1350     acb->bs = bs;
1351     acb->cb = cb;
1352     acb->opaque = opaque;
1353     return acb;
1354 }
1355
1356 void qemu_aio_release(void *p)
1357 {
1358     BlockDriverAIOCB *acb = p;
1359     BlockDriver *drv = acb->bs->drv;
1360     acb->next = drv->free_aiocb;
1361     drv->free_aiocb = acb;
1362 }
1363
1364 /**************************************************************/
1365 /* removable device support */
1366
1367 /**
1368  * Return TRUE if the media is present
1369  */
1370 int bdrv_is_inserted(BlockDriverState *bs)
1371 {
1372     BlockDriver *drv = bs->drv;
1373     int ret;
1374     if (!drv)
1375         return 0;
1376     if (!drv->bdrv_is_inserted)
1377         return 1;
1378     ret = drv->bdrv_is_inserted(bs);
1379     return ret;
1380 }
1381
1382 /**
1383  * Return TRUE if the media changed since the last call to this
1384  * function. It is currently only used for floppy disks
1385  */
1386 int bdrv_media_changed(BlockDriverState *bs)
1387 {
1388     BlockDriver *drv = bs->drv;
1389     int ret;
1390
1391     if (!drv || !drv->bdrv_media_changed)
1392         ret = -ENOTSUP;
1393     else
1394         ret = drv->bdrv_media_changed(bs);
1395     if (ret == -ENOTSUP)
1396         ret = bs->media_changed;
1397     bs->media_changed = 0;
1398     return ret;
1399 }
1400
1401 /**
1402  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
1403  */
1404 void bdrv_eject(BlockDriverState *bs, int eject_flag)
1405 {
1406     BlockDriver *drv = bs->drv;
1407     int ret;
1408
1409     if (!drv || !drv->bdrv_eject) {
1410         ret = -ENOTSUP;
1411     } else {
1412         ret = drv->bdrv_eject(bs, eject_flag);
1413     }
1414     if (ret == -ENOTSUP) {
1415         if (eject_flag)
1416             bdrv_close(bs);
1417     }
1418 }
1419
1420 int bdrv_is_locked(BlockDriverState *bs)
1421 {
1422     return bs->locked;
1423 }
1424
1425 /**
1426  * Lock or unlock the media (if it is locked, the user won't be able
1427  * to eject it manually).
1428  */
1429 void bdrv_set_locked(BlockDriverState *bs, int locked)
1430 {
1431     BlockDriver *drv = bs->drv;
1432
1433     bs->locked = locked;
1434     if (drv && drv->bdrv_set_locked) {
1435         drv->bdrv_set_locked(bs, locked);
1436     }
1437 }
1438
1439 /* needed for generic scsi interface */
1440
1441 int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1442 {
1443     BlockDriver *drv = bs->drv;
1444
1445     if (drv && drv->bdrv_ioctl)
1446         return drv->bdrv_ioctl(bs, req, buf);
1447     return -ENOTSUP;
1448 }