]> Git Repo - qemu.git/blob - block.c
QMP: Fix asynchronous events delivery
[qemu.git] / 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 #include "qemu-common.h"
26 #include "monitor.h"
27 #include "block_int.h"
28 #include "module.h"
29 #include "qemu-objects.h"
30
31 #ifdef CONFIG_BSD
32 #include <sys/types.h>
33 #include <sys/stat.h>
34 #include <sys/ioctl.h>
35 #include <sys/queue.h>
36 #ifndef __DragonFly__
37 #include <sys/disk.h>
38 #endif
39 #endif
40
41 #ifdef _WIN32
42 #include <windows.h>
43 #endif
44
45 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
46         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
47         BlockDriverCompletionFunc *cb, void *opaque);
48 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
49         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
50         BlockDriverCompletionFunc *cb, void *opaque);
51 static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
52         BlockDriverCompletionFunc *cb, void *opaque);
53 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
54                         uint8_t *buf, int nb_sectors);
55 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
56                          const uint8_t *buf, int nb_sectors);
57
58 BlockDriverState *bdrv_first;
59
60 static BlockDriver *first_drv;
61
62 /* If non-zero, use only whitelisted block drivers */
63 static int use_bdrv_whitelist;
64
65 int path_is_absolute(const char *path)
66 {
67     const char *p;
68 #ifdef _WIN32
69     /* specific case for names like: "\\.\d:" */
70     if (*path == '/' || *path == '\\')
71         return 1;
72 #endif
73     p = strchr(path, ':');
74     if (p)
75         p++;
76     else
77         p = path;
78 #ifdef _WIN32
79     return (*p == '/' || *p == '\\');
80 #else
81     return (*p == '/');
82 #endif
83 }
84
85 /* if filename is absolute, just copy it to dest. Otherwise, build a
86    path to it by considering it is relative to base_path. URL are
87    supported. */
88 void path_combine(char *dest, int dest_size,
89                   const char *base_path,
90                   const char *filename)
91 {
92     const char *p, *p1;
93     int len;
94
95     if (dest_size <= 0)
96         return;
97     if (path_is_absolute(filename)) {
98         pstrcpy(dest, dest_size, filename);
99     } else {
100         p = strchr(base_path, ':');
101         if (p)
102             p++;
103         else
104             p = base_path;
105         p1 = strrchr(base_path, '/');
106 #ifdef _WIN32
107         {
108             const char *p2;
109             p2 = strrchr(base_path, '\\');
110             if (!p1 || p2 > p1)
111                 p1 = p2;
112         }
113 #endif
114         if (p1)
115             p1++;
116         else
117             p1 = base_path;
118         if (p1 > p)
119             p = p1;
120         len = p - base_path;
121         if (len > dest_size - 1)
122             len = dest_size - 1;
123         memcpy(dest, base_path, len);
124         dest[len] = '\0';
125         pstrcat(dest, dest_size, filename);
126     }
127 }
128
129 void bdrv_register(BlockDriver *bdrv)
130 {
131     if (!bdrv->bdrv_aio_readv) {
132         /* add AIO emulation layer */
133         bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
134         bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
135     } else if (!bdrv->bdrv_read) {
136         /* add synchronous IO emulation layer */
137         bdrv->bdrv_read = bdrv_read_em;
138         bdrv->bdrv_write = bdrv_write_em;
139     }
140
141     if (!bdrv->bdrv_aio_flush)
142         bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
143
144     bdrv->next = first_drv;
145     first_drv = bdrv;
146 }
147
148 /* create a new block device (by default it is empty) */
149 BlockDriverState *bdrv_new(const char *device_name)
150 {
151     BlockDriverState **pbs, *bs;
152
153     bs = qemu_mallocz(sizeof(BlockDriverState));
154     pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
155     if (device_name[0] != '\0') {
156         /* insert at the end */
157         pbs = &bdrv_first;
158         while (*pbs != NULL)
159             pbs = &(*pbs)->next;
160         *pbs = bs;
161     }
162     return bs;
163 }
164
165 BlockDriver *bdrv_find_format(const char *format_name)
166 {
167     BlockDriver *drv1;
168     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
169         if (!strcmp(drv1->format_name, format_name))
170             return drv1;
171     }
172     return NULL;
173 }
174
175 static int bdrv_is_whitelisted(BlockDriver *drv)
176 {
177     static const char *whitelist[] = {
178         CONFIG_BDRV_WHITELIST
179     };
180     const char **p;
181
182     if (!whitelist[0])
183         return 1;               /* no whitelist, anything goes */
184
185     for (p = whitelist; *p; p++) {
186         if (!strcmp(drv->format_name, *p)) {
187             return 1;
188         }
189     }
190     return 0;
191 }
192
193 BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
194 {
195     BlockDriver *drv = bdrv_find_format(format_name);
196     return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
197 }
198
199 int bdrv_create(BlockDriver *drv, const char* filename,
200     QEMUOptionParameter *options)
201 {
202     if (!drv->bdrv_create)
203         return -ENOTSUP;
204
205     return drv->bdrv_create(filename, options);
206 }
207
208 #ifdef _WIN32
209 void get_tmp_filename(char *filename, int size)
210 {
211     char temp_dir[MAX_PATH];
212
213     GetTempPath(MAX_PATH, temp_dir);
214     GetTempFileName(temp_dir, "qem", 0, filename);
215 }
216 #else
217 void get_tmp_filename(char *filename, int size)
218 {
219     int fd;
220     const char *tmpdir;
221     /* XXX: race condition possible */
222     tmpdir = getenv("TMPDIR");
223     if (!tmpdir)
224         tmpdir = "/tmp";
225     snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
226     fd = mkstemp(filename);
227     close(fd);
228 }
229 #endif
230
231 #ifdef _WIN32
232 static int is_windows_drive_prefix(const char *filename)
233 {
234     return (((filename[0] >= 'a' && filename[0] <= 'z') ||
235              (filename[0] >= 'A' && filename[0] <= 'Z')) &&
236             filename[1] == ':');
237 }
238
239 int is_windows_drive(const char *filename)
240 {
241     if (is_windows_drive_prefix(filename) &&
242         filename[2] == '\0')
243         return 1;
244     if (strstart(filename, "\\\\.\\", NULL) ||
245         strstart(filename, "//./", NULL))
246         return 1;
247     return 0;
248 }
249 #endif
250
251 static BlockDriver *find_protocol(const char *filename)
252 {
253     BlockDriver *drv1;
254     char protocol[128];
255     int len;
256     const char *p;
257
258 #ifdef _WIN32
259     if (is_windows_drive(filename) ||
260         is_windows_drive_prefix(filename))
261         return bdrv_find_format("raw");
262 #endif
263     p = strchr(filename, ':');
264     if (!p)
265         return bdrv_find_format("raw");
266     len = p - filename;
267     if (len > sizeof(protocol) - 1)
268         len = sizeof(protocol) - 1;
269     memcpy(protocol, filename, len);
270     protocol[len] = '\0';
271     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
272         if (drv1->protocol_name &&
273             !strcmp(drv1->protocol_name, protocol))
274             return drv1;
275     }
276     return NULL;
277 }
278
279 /*
280  * Detect host devices. By convention, /dev/cdrom[N] is always
281  * recognized as a host CDROM.
282  */
283 static BlockDriver *find_hdev_driver(const char *filename)
284 {
285     int score_max = 0, score;
286     BlockDriver *drv = NULL, *d;
287
288     for (d = first_drv; d; d = d->next) {
289         if (d->bdrv_probe_device) {
290             score = d->bdrv_probe_device(filename);
291             if (score > score_max) {
292                 score_max = score;
293                 drv = d;
294             }
295         }
296     }
297
298     return drv;
299 }
300
301 static BlockDriver *find_image_format(const char *filename)
302 {
303     int ret, score, score_max;
304     BlockDriver *drv1, *drv;
305     uint8_t buf[2048];
306     BlockDriverState *bs;
307
308     drv = find_protocol(filename);
309     /* no need to test disk image formats for vvfat */
310     if (drv && strcmp(drv->format_name, "vvfat") == 0)
311         return drv;
312
313     ret = bdrv_file_open(&bs, filename, 0);
314     if (ret < 0)
315         return NULL;
316     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
317     bdrv_delete(bs);
318     if (ret < 0) {
319         return NULL;
320     }
321
322     score_max = 0;
323     for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
324         if (drv1->bdrv_probe) {
325             score = drv1->bdrv_probe(buf, ret, filename);
326             if (score > score_max) {
327                 score_max = score;
328                 drv = drv1;
329             }
330         }
331     }
332     return drv;
333 }
334
335 int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
336 {
337     BlockDriverState *bs;
338     int ret;
339
340     bs = bdrv_new("");
341     ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
342     if (ret < 0) {
343         bdrv_delete(bs);
344         return ret;
345     }
346     bs->growable = 1;
347     *pbs = bs;
348     return 0;
349 }
350
351 int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
352 {
353     return bdrv_open2(bs, filename, flags, NULL);
354 }
355
356 int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
357                BlockDriver *drv)
358 {
359     int ret, open_flags;
360     char tmp_filename[PATH_MAX];
361     char backing_filename[PATH_MAX];
362
363     bs->is_temporary = 0;
364     bs->encrypted = 0;
365     bs->valid_key = 0;
366     /* buffer_alignment defaulted to 512, drivers can change this value */
367     bs->buffer_alignment = 512;
368
369     if (flags & BDRV_O_SNAPSHOT) {
370         BlockDriverState *bs1;
371         int64_t total_size;
372         int is_protocol = 0;
373         BlockDriver *bdrv_qcow2;
374         QEMUOptionParameter *options;
375
376         /* if snapshot, we create a temporary backing file and open it
377            instead of opening 'filename' directly */
378
379         /* if there is a backing file, use it */
380         bs1 = bdrv_new("");
381         ret = bdrv_open2(bs1, filename, 0, drv);
382         if (ret < 0) {
383             bdrv_delete(bs1);
384             return ret;
385         }
386         total_size = bdrv_getlength(bs1) >> BDRV_SECTOR_BITS;
387
388         if (bs1->drv && bs1->drv->protocol_name)
389             is_protocol = 1;
390
391         bdrv_delete(bs1);
392
393         get_tmp_filename(tmp_filename, sizeof(tmp_filename));
394
395         /* Real path is meaningless for protocols */
396         if (is_protocol)
397             snprintf(backing_filename, sizeof(backing_filename),
398                      "%s", filename);
399         else if (!realpath(filename, backing_filename))
400             return -errno;
401
402         bdrv_qcow2 = bdrv_find_format("qcow2");
403         options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
404
405         set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size * 512);
406         set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
407         if (drv) {
408             set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
409                 drv->format_name);
410         }
411
412         ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
413         if (ret < 0) {
414             return ret;
415         }
416
417         filename = tmp_filename;
418         drv = bdrv_qcow2;
419         bs->is_temporary = 1;
420     }
421
422     pstrcpy(bs->filename, sizeof(bs->filename), filename);
423     if (flags & BDRV_O_FILE) {
424         drv = find_protocol(filename);
425     } else if (!drv) {
426         drv = find_hdev_driver(filename);
427         if (!drv) {
428             drv = find_image_format(filename);
429         }
430     }
431     if (!drv) {
432         ret = -ENOENT;
433         goto unlink_and_fail;
434     }
435     bs->drv = drv;
436     bs->opaque = qemu_mallocz(drv->instance_size);
437
438     /*
439      * Yes, BDRV_O_NOCACHE aka O_DIRECT means we have to present a
440      * write cache to the guest.  We do need the fdatasync to flush
441      * out transactions for block allocations, and we maybe have a
442      * volatile write cache in our backing device to deal with.
443      */
444     if (flags & (BDRV_O_CACHE_WB|BDRV_O_NOCACHE))
445         bs->enable_write_cache = 1;
446
447     bs->read_only = (flags & BDRV_O_RDWR) == 0;
448     if (!(flags & BDRV_O_FILE)) {
449         open_flags = (flags & (BDRV_O_RDWR | BDRV_O_CACHE_MASK|BDRV_O_NATIVE_AIO));
450         if (bs->is_temporary) { /* snapshot should be writeable */
451             open_flags |= BDRV_O_RDWR;
452         }
453     } else {
454         open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
455     }
456     if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
457         ret = -ENOTSUP;
458     } else {
459         ret = drv->bdrv_open(bs, filename, open_flags);
460     }
461     if (ret < 0) {
462         qemu_free(bs->opaque);
463         bs->opaque = NULL;
464         bs->drv = NULL;
465     unlink_and_fail:
466         if (bs->is_temporary)
467             unlink(filename);
468         return ret;
469     }
470     if (drv->bdrv_getlength) {
471         bs->total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
472     }
473 #ifndef _WIN32
474     if (bs->is_temporary) {
475         unlink(filename);
476     }
477 #endif
478     if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
479         /* if there is a backing file, use it */
480         BlockDriver *back_drv = NULL;
481         bs->backing_hd = bdrv_new("");
482         path_combine(backing_filename, sizeof(backing_filename),
483                      filename, bs->backing_file);
484         if (bs->backing_format[0] != '\0')
485             back_drv = bdrv_find_format(bs->backing_format);
486         ret = bdrv_open2(bs->backing_hd, backing_filename, open_flags,
487                          back_drv);
488         bs->backing_hd->read_only =  (open_flags & BDRV_O_RDWR) == 0;
489         if (ret < 0) {
490             bdrv_close(bs);
491             return ret;
492         }
493     }
494
495     if (!bdrv_key_required(bs)) {
496         /* call the change callback */
497         bs->media_changed = 1;
498         if (bs->change_cb)
499             bs->change_cb(bs->change_opaque);
500     }
501     return 0;
502 }
503
504 void bdrv_close(BlockDriverState *bs)
505 {
506     if (bs->drv) {
507         if (bs->backing_hd)
508             bdrv_delete(bs->backing_hd);
509         bs->drv->bdrv_close(bs);
510         qemu_free(bs->opaque);
511 #ifdef _WIN32
512         if (bs->is_temporary) {
513             unlink(bs->filename);
514         }
515 #endif
516         bs->opaque = NULL;
517         bs->drv = NULL;
518
519         /* call the change callback */
520         bs->media_changed = 1;
521         if (bs->change_cb)
522             bs->change_cb(bs->change_opaque);
523     }
524 }
525
526 void bdrv_delete(BlockDriverState *bs)
527 {
528     BlockDriverState **pbs;
529
530     pbs = &bdrv_first;
531     while (*pbs != bs && *pbs != NULL)
532         pbs = &(*pbs)->next;
533     if (*pbs == bs)
534         *pbs = bs->next;
535
536     bdrv_close(bs);
537     qemu_free(bs);
538 }
539
540 /*
541  * Run consistency checks on an image
542  *
543  * Returns the number of errors or -errno when an internal error occurs
544  */
545 int bdrv_check(BlockDriverState *bs)
546 {
547     if (bs->drv->bdrv_check == NULL) {
548         return -ENOTSUP;
549     }
550
551     return bs->drv->bdrv_check(bs);
552 }
553
554 /* commit COW file into the raw image */
555 int bdrv_commit(BlockDriverState *bs)
556 {
557     BlockDriver *drv = bs->drv;
558     int64_t i, total_sectors;
559     int n, j;
560     unsigned char sector[512];
561
562     if (!drv)
563         return -ENOMEDIUM;
564
565     if (bs->read_only) {
566         return -EACCES;
567     }
568
569     if (!bs->backing_hd) {
570         return -ENOTSUP;
571     }
572
573     total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
574     for (i = 0; i < total_sectors;) {
575         if (drv->bdrv_is_allocated(bs, i, 65536, &n)) {
576             for(j = 0; j < n; j++) {
577                 if (bdrv_read(bs, i, sector, 1) != 0) {
578                     return -EIO;
579                 }
580
581                 if (bdrv_write(bs->backing_hd, i, sector, 1) != 0) {
582                     return -EIO;
583                 }
584                 i++;
585             }
586         } else {
587             i += n;
588         }
589     }
590
591     if (drv->bdrv_make_empty)
592         return drv->bdrv_make_empty(bs);
593
594     /*
595      * Make sure all data we wrote to the backing device is actually
596      * stable on disk.
597      */
598     if (bs->backing_hd)
599         bdrv_flush(bs->backing_hd);
600     return 0;
601 }
602
603 /*
604  * Return values:
605  * 0        - success
606  * -EINVAL  - backing format specified, but no file
607  * -ENOSPC  - can't update the backing file because no space is left in the
608  *            image file header
609  * -ENOTSUP - format driver doesn't support changing the backing file
610  */
611 int bdrv_change_backing_file(BlockDriverState *bs,
612     const char *backing_file, const char *backing_fmt)
613 {
614     BlockDriver *drv = bs->drv;
615
616     if (drv->bdrv_change_backing_file != NULL) {
617         return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
618     } else {
619         return -ENOTSUP;
620     }
621 }
622
623 static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
624                                    size_t size)
625 {
626     int64_t len;
627
628     if (!bdrv_is_inserted(bs))
629         return -ENOMEDIUM;
630
631     if (bs->growable)
632         return 0;
633
634     len = bdrv_getlength(bs);
635
636     if (offset < 0)
637         return -EIO;
638
639     if ((offset > len) || (len - offset < size))
640         return -EIO;
641
642     return 0;
643 }
644
645 static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
646                               int nb_sectors)
647 {
648     return bdrv_check_byte_request(bs, sector_num * 512, nb_sectors * 512);
649 }
650
651 /* return < 0 if error. See bdrv_write() for the return codes */
652 int bdrv_read(BlockDriverState *bs, int64_t sector_num,
653               uint8_t *buf, int nb_sectors)
654 {
655     BlockDriver *drv = bs->drv;
656
657     if (!drv)
658         return -ENOMEDIUM;
659     if (bdrv_check_request(bs, sector_num, nb_sectors))
660         return -EIO;
661
662     return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
663 }
664
665 static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
666                              int nb_sectors, int dirty)
667 {
668     int64_t start, end;
669     unsigned long val, idx, bit;
670
671     start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
672     end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
673
674     for (; start <= end; start++) {
675         idx = start / (sizeof(unsigned long) * 8);
676         bit = start % (sizeof(unsigned long) * 8);
677         val = bs->dirty_bitmap[idx];
678         if (dirty) {
679             val |= 1 << bit;
680         } else {
681             val &= ~(1 << bit);
682         }
683         bs->dirty_bitmap[idx] = val;
684     }
685 }
686
687 /* Return < 0 if error. Important errors are:
688   -EIO         generic I/O error (may happen for all errors)
689   -ENOMEDIUM   No media inserted.
690   -EINVAL      Invalid sector number or nb_sectors
691   -EACCES      Trying to write a read-only device
692 */
693 int bdrv_write(BlockDriverState *bs, int64_t sector_num,
694                const uint8_t *buf, int nb_sectors)
695 {
696     BlockDriver *drv = bs->drv;
697     if (!bs->drv)
698         return -ENOMEDIUM;
699     if (bs->read_only)
700         return -EACCES;
701     if (bdrv_check_request(bs, sector_num, nb_sectors))
702         return -EIO;
703
704     if (bs->dirty_bitmap) {
705         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
706     }
707
708     return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
709 }
710
711 int bdrv_pread(BlockDriverState *bs, int64_t offset,
712                void *buf, int count1)
713 {
714     uint8_t tmp_buf[BDRV_SECTOR_SIZE];
715     int len, nb_sectors, count;
716     int64_t sector_num;
717
718     count = count1;
719     /* first read to align to sector start */
720     len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
721     if (len > count)
722         len = count;
723     sector_num = offset >> BDRV_SECTOR_BITS;
724     if (len > 0) {
725         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
726             return -EIO;
727         memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
728         count -= len;
729         if (count == 0)
730             return count1;
731         sector_num++;
732         buf += len;
733     }
734
735     /* read the sectors "in place" */
736     nb_sectors = count >> BDRV_SECTOR_BITS;
737     if (nb_sectors > 0) {
738         if (bdrv_read(bs, sector_num, buf, nb_sectors) < 0)
739             return -EIO;
740         sector_num += nb_sectors;
741         len = nb_sectors << BDRV_SECTOR_BITS;
742         buf += len;
743         count -= len;
744     }
745
746     /* add data from the last sector */
747     if (count > 0) {
748         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
749             return -EIO;
750         memcpy(buf, tmp_buf, count);
751     }
752     return count1;
753 }
754
755 int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
756                 const void *buf, int count1)
757 {
758     uint8_t tmp_buf[BDRV_SECTOR_SIZE];
759     int len, nb_sectors, count;
760     int64_t sector_num;
761
762     count = count1;
763     /* first write to align to sector start */
764     len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
765     if (len > count)
766         len = count;
767     sector_num = offset >> BDRV_SECTOR_BITS;
768     if (len > 0) {
769         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
770             return -EIO;
771         memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
772         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
773             return -EIO;
774         count -= len;
775         if (count == 0)
776             return count1;
777         sector_num++;
778         buf += len;
779     }
780
781     /* write the sectors "in place" */
782     nb_sectors = count >> BDRV_SECTOR_BITS;
783     if (nb_sectors > 0) {
784         if (bdrv_write(bs, sector_num, buf, nb_sectors) < 0)
785             return -EIO;
786         sector_num += nb_sectors;
787         len = nb_sectors << BDRV_SECTOR_BITS;
788         buf += len;
789         count -= len;
790     }
791
792     /* add data from the last sector */
793     if (count > 0) {
794         if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
795             return -EIO;
796         memcpy(tmp_buf, buf, count);
797         if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
798             return -EIO;
799     }
800     return count1;
801 }
802
803 /**
804  * Truncate file to 'offset' bytes (needed only for file protocols)
805  */
806 int bdrv_truncate(BlockDriverState *bs, int64_t offset)
807 {
808     BlockDriver *drv = bs->drv;
809     if (!drv)
810         return -ENOMEDIUM;
811     if (!drv->bdrv_truncate)
812         return -ENOTSUP;
813     if (bs->read_only)
814         return -EACCES;
815     return drv->bdrv_truncate(bs, offset);
816 }
817
818 /**
819  * Length of a file in bytes. Return < 0 if error or unknown.
820  */
821 int64_t bdrv_getlength(BlockDriverState *bs)
822 {
823     BlockDriver *drv = bs->drv;
824     if (!drv)
825         return -ENOMEDIUM;
826     if (!drv->bdrv_getlength) {
827         /* legacy mode */
828         return bs->total_sectors * BDRV_SECTOR_SIZE;
829     }
830     return drv->bdrv_getlength(bs);
831 }
832
833 /* return 0 as number of sectors if no device present or error */
834 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
835 {
836     int64_t length;
837     length = bdrv_getlength(bs);
838     if (length < 0)
839         length = 0;
840     else
841         length = length >> BDRV_SECTOR_BITS;
842     *nb_sectors_ptr = length;
843 }
844
845 struct partition {
846         uint8_t boot_ind;           /* 0x80 - active */
847         uint8_t head;               /* starting head */
848         uint8_t sector;             /* starting sector */
849         uint8_t cyl;                /* starting cylinder */
850         uint8_t sys_ind;            /* What partition type */
851         uint8_t end_head;           /* end head */
852         uint8_t end_sector;         /* end sector */
853         uint8_t end_cyl;            /* end cylinder */
854         uint32_t start_sect;        /* starting sector counting from 0 */
855         uint32_t nr_sects;          /* nr of sectors in partition */
856 } __attribute__((packed));
857
858 /* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
859 static int guess_disk_lchs(BlockDriverState *bs,
860                            int *pcylinders, int *pheads, int *psectors)
861 {
862     uint8_t buf[512];
863     int ret, i, heads, sectors, cylinders;
864     struct partition *p;
865     uint32_t nr_sects;
866     uint64_t nb_sectors;
867
868     bdrv_get_geometry(bs, &nb_sectors);
869
870     ret = bdrv_read(bs, 0, buf, 1);
871     if (ret < 0)
872         return -1;
873     /* test msdos magic */
874     if (buf[510] != 0x55 || buf[511] != 0xaa)
875         return -1;
876     for(i = 0; i < 4; i++) {
877         p = ((struct partition *)(buf + 0x1be)) + i;
878         nr_sects = le32_to_cpu(p->nr_sects);
879         if (nr_sects && p->end_head) {
880             /* We make the assumption that the partition terminates on
881                a cylinder boundary */
882             heads = p->end_head + 1;
883             sectors = p->end_sector & 63;
884             if (sectors == 0)
885                 continue;
886             cylinders = nb_sectors / (heads * sectors);
887             if (cylinders < 1 || cylinders > 16383)
888                 continue;
889             *pheads = heads;
890             *psectors = sectors;
891             *pcylinders = cylinders;
892 #if 0
893             printf("guessed geometry: LCHS=%d %d %d\n",
894                    cylinders, heads, sectors);
895 #endif
896             return 0;
897         }
898     }
899     return -1;
900 }
901
902 void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
903 {
904     int translation, lba_detected = 0;
905     int cylinders, heads, secs;
906     uint64_t nb_sectors;
907
908     /* if a geometry hint is available, use it */
909     bdrv_get_geometry(bs, &nb_sectors);
910     bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
911     translation = bdrv_get_translation_hint(bs);
912     if (cylinders != 0) {
913         *pcyls = cylinders;
914         *pheads = heads;
915         *psecs = secs;
916     } else {
917         if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
918             if (heads > 16) {
919                 /* if heads > 16, it means that a BIOS LBA
920                    translation was active, so the default
921                    hardware geometry is OK */
922                 lba_detected = 1;
923                 goto default_geometry;
924             } else {
925                 *pcyls = cylinders;
926                 *pheads = heads;
927                 *psecs = secs;
928                 /* disable any translation to be in sync with
929                    the logical geometry */
930                 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
931                     bdrv_set_translation_hint(bs,
932                                               BIOS_ATA_TRANSLATION_NONE);
933                 }
934             }
935         } else {
936         default_geometry:
937             /* if no geometry, use a standard physical disk geometry */
938             cylinders = nb_sectors / (16 * 63);
939
940             if (cylinders > 16383)
941                 cylinders = 16383;
942             else if (cylinders < 2)
943                 cylinders = 2;
944             *pcyls = cylinders;
945             *pheads = 16;
946             *psecs = 63;
947             if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
948                 if ((*pcyls * *pheads) <= 131072) {
949                     bdrv_set_translation_hint(bs,
950                                               BIOS_ATA_TRANSLATION_LARGE);
951                 } else {
952                     bdrv_set_translation_hint(bs,
953                                               BIOS_ATA_TRANSLATION_LBA);
954                 }
955             }
956         }
957         bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
958     }
959 }
960
961 void bdrv_set_geometry_hint(BlockDriverState *bs,
962                             int cyls, int heads, int secs)
963 {
964     bs->cyls = cyls;
965     bs->heads = heads;
966     bs->secs = secs;
967 }
968
969 void bdrv_set_type_hint(BlockDriverState *bs, int type)
970 {
971     bs->type = type;
972     bs->removable = ((type == BDRV_TYPE_CDROM ||
973                       type == BDRV_TYPE_FLOPPY));
974 }
975
976 void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
977 {
978     bs->translation = translation;
979 }
980
981 void bdrv_get_geometry_hint(BlockDriverState *bs,
982                             int *pcyls, int *pheads, int *psecs)
983 {
984     *pcyls = bs->cyls;
985     *pheads = bs->heads;
986     *psecs = bs->secs;
987 }
988
989 int bdrv_get_type_hint(BlockDriverState *bs)
990 {
991     return bs->type;
992 }
993
994 int bdrv_get_translation_hint(BlockDriverState *bs)
995 {
996     return bs->translation;
997 }
998
999 int bdrv_is_removable(BlockDriverState *bs)
1000 {
1001     return bs->removable;
1002 }
1003
1004 int bdrv_is_read_only(BlockDriverState *bs)
1005 {
1006     return bs->read_only;
1007 }
1008
1009 int bdrv_set_read_only(BlockDriverState *bs, int read_only)
1010 {
1011     int ret = bs->read_only;
1012     bs->read_only = read_only;
1013     return ret;
1014 }
1015
1016 int bdrv_is_sg(BlockDriverState *bs)
1017 {
1018     return bs->sg;
1019 }
1020
1021 int bdrv_enable_write_cache(BlockDriverState *bs)
1022 {
1023     return bs->enable_write_cache;
1024 }
1025
1026 /* XXX: no longer used */
1027 void bdrv_set_change_cb(BlockDriverState *bs,
1028                         void (*change_cb)(void *opaque), void *opaque)
1029 {
1030     bs->change_cb = change_cb;
1031     bs->change_opaque = opaque;
1032 }
1033
1034 int bdrv_is_encrypted(BlockDriverState *bs)
1035 {
1036     if (bs->backing_hd && bs->backing_hd->encrypted)
1037         return 1;
1038     return bs->encrypted;
1039 }
1040
1041 int bdrv_key_required(BlockDriverState *bs)
1042 {
1043     BlockDriverState *backing_hd = bs->backing_hd;
1044
1045     if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
1046         return 1;
1047     return (bs->encrypted && !bs->valid_key);
1048 }
1049
1050 int bdrv_set_key(BlockDriverState *bs, const char *key)
1051 {
1052     int ret;
1053     if (bs->backing_hd && bs->backing_hd->encrypted) {
1054         ret = bdrv_set_key(bs->backing_hd, key);
1055         if (ret < 0)
1056             return ret;
1057         if (!bs->encrypted)
1058             return 0;
1059     }
1060     if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
1061         return -1;
1062     ret = bs->drv->bdrv_set_key(bs, key);
1063     if (ret < 0) {
1064         bs->valid_key = 0;
1065     } else if (!bs->valid_key) {
1066         bs->valid_key = 1;
1067         /* call the change callback now, we skipped it on open */
1068         bs->media_changed = 1;
1069         if (bs->change_cb)
1070             bs->change_cb(bs->change_opaque);
1071     }
1072     return ret;
1073 }
1074
1075 void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
1076 {
1077     if (!bs->drv) {
1078         buf[0] = '\0';
1079     } else {
1080         pstrcpy(buf, buf_size, bs->drv->format_name);
1081     }
1082 }
1083
1084 void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
1085                          void *opaque)
1086 {
1087     BlockDriver *drv;
1088
1089     for (drv = first_drv; drv != NULL; drv = drv->next) {
1090         it(opaque, drv->format_name);
1091     }
1092 }
1093
1094 BlockDriverState *bdrv_find(const char *name)
1095 {
1096     BlockDriverState *bs;
1097
1098     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1099         if (!strcmp(name, bs->device_name))
1100             return bs;
1101     }
1102     return NULL;
1103 }
1104
1105 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
1106 {
1107     BlockDriverState *bs;
1108
1109     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1110         it(opaque, bs);
1111     }
1112 }
1113
1114 const char *bdrv_get_device_name(BlockDriverState *bs)
1115 {
1116     return bs->device_name;
1117 }
1118
1119 void bdrv_flush(BlockDriverState *bs)
1120 {
1121     if (bs->drv && bs->drv->bdrv_flush)
1122         bs->drv->bdrv_flush(bs);
1123 }
1124
1125 void bdrv_flush_all(void)
1126 {
1127     BlockDriverState *bs;
1128
1129     for (bs = bdrv_first; bs != NULL; bs = bs->next)
1130         if (bs->drv && !bdrv_is_read_only(bs) && 
1131             (!bdrv_is_removable(bs) || bdrv_is_inserted(bs)))
1132             bdrv_flush(bs);
1133 }
1134
1135 /*
1136  * Returns true iff the specified sector is present in the disk image. Drivers
1137  * not implementing the functionality are assumed to not support backing files,
1138  * hence all their sectors are reported as allocated.
1139  *
1140  * 'pnum' is set to the number of sectors (including and immediately following
1141  * the specified sector) that are known to be in the same
1142  * allocated/unallocated state.
1143  *
1144  * 'nb_sectors' is the max value 'pnum' should be set to.
1145  */
1146 int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
1147         int *pnum)
1148 {
1149     int64_t n;
1150     if (!bs->drv->bdrv_is_allocated) {
1151         if (sector_num >= bs->total_sectors) {
1152             *pnum = 0;
1153             return 0;
1154         }
1155         n = bs->total_sectors - sector_num;
1156         *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
1157         return 1;
1158     }
1159     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
1160 }
1161
1162 static void bdrv_print_dict(QObject *obj, void *opaque)
1163 {
1164     QDict *bs_dict;
1165     Monitor *mon = opaque;
1166
1167     bs_dict = qobject_to_qdict(obj);
1168
1169     monitor_printf(mon, "%s: type=%s removable=%d",
1170                         qdict_get_str(bs_dict, "device"),
1171                         qdict_get_str(bs_dict, "type"),
1172                         qdict_get_bool(bs_dict, "removable"));
1173
1174     if (qdict_get_bool(bs_dict, "removable")) {
1175         monitor_printf(mon, " locked=%d", qdict_get_bool(bs_dict, "locked"));
1176     }
1177
1178     if (qdict_haskey(bs_dict, "inserted")) {
1179         QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted"));
1180
1181         monitor_printf(mon, " file=");
1182         monitor_print_filename(mon, qdict_get_str(qdict, "file"));
1183         if (qdict_haskey(qdict, "backing_file")) {
1184             monitor_printf(mon, " backing_file=");
1185             monitor_print_filename(mon, qdict_get_str(qdict, "backing_file"));
1186         }
1187         monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
1188                             qdict_get_bool(qdict, "ro"),
1189                             qdict_get_str(qdict, "drv"),
1190                             qdict_get_bool(qdict, "encrypted"));
1191     } else {
1192         monitor_printf(mon, " [not inserted]");
1193     }
1194
1195     monitor_printf(mon, "\n");
1196 }
1197
1198 void bdrv_info_print(Monitor *mon, const QObject *data)
1199 {
1200     qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
1201 }
1202
1203 /**
1204  * bdrv_info(): Block devices information
1205  *
1206  * Each block device information is stored in a QDict and the
1207  * returned QObject is a QList of all devices.
1208  *
1209  * The QDict contains the following:
1210  *
1211  * - "device": device name
1212  * - "type": device type
1213  * - "removable": true if the device is removable, false otherwise
1214  * - "locked": true if the device is locked, false otherwise
1215  * - "inserted": only present if the device is inserted, it is a QDict
1216  *    containing the following:
1217  *          - "file": device file name
1218  *          - "ro": true if read-only, false otherwise
1219  *          - "drv": driver format name
1220  *          - "backing_file": backing file name if one is used
1221  *          - "encrypted": true if encrypted, false otherwise
1222  *
1223  * Example:
1224  *
1225  * [ { "device": "ide0-hd0", "type": "hd", "removable": false, "locked": false,
1226  *     "inserted": { "file": "/tmp/foobar", "ro": false, "drv": "qcow2" } },
1227  *   { "device": "floppy0", "type": "floppy", "removable": true,
1228  *     "locked": false } ]
1229  */
1230 void bdrv_info(Monitor *mon, QObject **ret_data)
1231 {
1232     QList *bs_list;
1233     BlockDriverState *bs;
1234
1235     bs_list = qlist_new();
1236
1237     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1238         QObject *bs_obj;
1239         const char *type = "unknown";
1240
1241         switch(bs->type) {
1242         case BDRV_TYPE_HD:
1243             type = "hd";
1244             break;
1245         case BDRV_TYPE_CDROM:
1246             type = "cdrom";
1247             break;
1248         case BDRV_TYPE_FLOPPY:
1249             type = "floppy";
1250             break;
1251         }
1252
1253         bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': %s, "
1254                                     "'removable': %i, 'locked': %i }",
1255                                     bs->device_name, type, bs->removable,
1256                                     bs->locked);
1257         assert(bs_obj != NULL);
1258
1259         if (bs->drv) {
1260             QObject *obj;
1261             QDict *bs_dict = qobject_to_qdict(bs_obj);
1262
1263             obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
1264                                      "'encrypted': %i }",
1265                                      bs->filename, bs->read_only,
1266                                      bs->drv->format_name,
1267                                      bdrv_is_encrypted(bs));
1268             assert(obj != NULL);
1269             if (bs->backing_file[0] != '\0') {
1270                 QDict *qdict = qobject_to_qdict(obj);
1271                 qdict_put(qdict, "backing_file",
1272                           qstring_from_str(bs->backing_file));
1273             }
1274
1275             qdict_put_obj(bs_dict, "inserted", obj);
1276         }
1277         qlist_append_obj(bs_list, bs_obj);
1278     }
1279
1280     *ret_data = QOBJECT(bs_list);
1281 }
1282
1283 static void bdrv_stats_iter(QObject *data, void *opaque)
1284 {
1285     QDict *qdict;
1286     Monitor *mon = opaque;
1287
1288     qdict = qobject_to_qdict(data);
1289     monitor_printf(mon, "%s:", qdict_get_str(qdict, "device"));
1290
1291     qdict = qobject_to_qdict(qdict_get(qdict, "stats"));
1292     monitor_printf(mon, " rd_bytes=%" PRId64
1293                         " wr_bytes=%" PRId64
1294                         " rd_operations=%" PRId64
1295                         " wr_operations=%" PRId64
1296                         "\n",
1297                         qdict_get_int(qdict, "rd_bytes"),
1298                         qdict_get_int(qdict, "wr_bytes"),
1299                         qdict_get_int(qdict, "rd_operations"),
1300                         qdict_get_int(qdict, "wr_operations"));
1301 }
1302
1303 void bdrv_stats_print(Monitor *mon, const QObject *data)
1304 {
1305     qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon);
1306 }
1307
1308 /**
1309  * bdrv_info_stats(): show block device statistics
1310  *
1311  * Each device statistic information is stored in a QDict and
1312  * the returned QObject is a QList of all devices.
1313  *
1314  * The QDict contains the following:
1315  *
1316  * - "device": device name
1317  * - "stats": A QDict with the statistics information, it contains:
1318  *     - "rd_bytes": bytes read
1319  *     - "wr_bytes": bytes written
1320  *     - "rd_operations": read operations
1321  *     - "wr_operations": write operations
1322  * 
1323  * Example:
1324  *
1325  * [ { "device": "ide0-hd0",
1326  *               "stats": { "rd_bytes": 512,
1327  *                          "wr_bytes": 0,
1328  *                          "rd_operations": 1,
1329  *                          "wr_operations": 0 } },
1330  *   { "device": "ide1-cd0",
1331  *               "stats": { "rd_bytes": 0,
1332  *                          "wr_bytes": 0,
1333  *                          "rd_operations": 0,
1334  *                          "wr_operations": 0 } } ]
1335  */
1336 void bdrv_info_stats(Monitor *mon, QObject **ret_data)
1337 {
1338     QObject *obj;
1339     QList *devices;
1340     BlockDriverState *bs;
1341
1342     devices = qlist_new();
1343
1344     for (bs = bdrv_first; bs != NULL; bs = bs->next) {
1345         obj = qobject_from_jsonf("{ 'device': %s, 'stats': {"
1346                                  "'rd_bytes': %" PRId64 ","
1347                                  "'wr_bytes': %" PRId64 ","
1348                                  "'rd_operations': %" PRId64 ","
1349                                  "'wr_operations': %" PRId64
1350                                  "} }",
1351                                  bs->device_name,
1352                                  bs->rd_bytes, bs->wr_bytes,
1353                                  bs->rd_ops, bs->wr_ops);
1354         assert(obj != NULL);
1355         qlist_append_obj(devices, obj);
1356     }
1357
1358     *ret_data = QOBJECT(devices);
1359 }
1360
1361 const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
1362 {
1363     if (bs->backing_hd && bs->backing_hd->encrypted)
1364         return bs->backing_file;
1365     else if (bs->encrypted)
1366         return bs->filename;
1367     else
1368         return NULL;
1369 }
1370
1371 void bdrv_get_backing_filename(BlockDriverState *bs,
1372                                char *filename, int filename_size)
1373 {
1374     if (!bs->backing_file) {
1375         pstrcpy(filename, filename_size, "");
1376     } else {
1377         pstrcpy(filename, filename_size, bs->backing_file);
1378     }
1379 }
1380
1381 int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
1382                           const uint8_t *buf, int nb_sectors)
1383 {
1384     BlockDriver *drv = bs->drv;
1385     if (!drv)
1386         return -ENOMEDIUM;
1387     if (!drv->bdrv_write_compressed)
1388         return -ENOTSUP;
1389     if (bdrv_check_request(bs, sector_num, nb_sectors))
1390         return -EIO;
1391
1392     if (bs->dirty_bitmap) {
1393         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1394     }
1395
1396     return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
1397 }
1398
1399 int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
1400 {
1401     BlockDriver *drv = bs->drv;
1402     if (!drv)
1403         return -ENOMEDIUM;
1404     if (!drv->bdrv_get_info)
1405         return -ENOTSUP;
1406     memset(bdi, 0, sizeof(*bdi));
1407     return drv->bdrv_get_info(bs, bdi);
1408 }
1409
1410 int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
1411                       int64_t pos, int size)
1412 {
1413     BlockDriver *drv = bs->drv;
1414     if (!drv)
1415         return -ENOMEDIUM;
1416     if (!drv->bdrv_save_vmstate)
1417         return -ENOTSUP;
1418     return drv->bdrv_save_vmstate(bs, buf, pos, size);
1419 }
1420
1421 int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
1422                       int64_t pos, int size)
1423 {
1424     BlockDriver *drv = bs->drv;
1425     if (!drv)
1426         return -ENOMEDIUM;
1427     if (!drv->bdrv_load_vmstate)
1428         return -ENOTSUP;
1429     return drv->bdrv_load_vmstate(bs, buf, pos, size);
1430 }
1431
1432 /**************************************************************/
1433 /* handling of snapshots */
1434
1435 int bdrv_snapshot_create(BlockDriverState *bs,
1436                          QEMUSnapshotInfo *sn_info)
1437 {
1438     BlockDriver *drv = bs->drv;
1439     if (!drv)
1440         return -ENOMEDIUM;
1441     if (!drv->bdrv_snapshot_create)
1442         return -ENOTSUP;
1443     return drv->bdrv_snapshot_create(bs, sn_info);
1444 }
1445
1446 int bdrv_snapshot_goto(BlockDriverState *bs,
1447                        const char *snapshot_id)
1448 {
1449     BlockDriver *drv = bs->drv;
1450     if (!drv)
1451         return -ENOMEDIUM;
1452     if (!drv->bdrv_snapshot_goto)
1453         return -ENOTSUP;
1454     return drv->bdrv_snapshot_goto(bs, snapshot_id);
1455 }
1456
1457 int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
1458 {
1459     BlockDriver *drv = bs->drv;
1460     if (!drv)
1461         return -ENOMEDIUM;
1462     if (!drv->bdrv_snapshot_delete)
1463         return -ENOTSUP;
1464     return drv->bdrv_snapshot_delete(bs, snapshot_id);
1465 }
1466
1467 int bdrv_snapshot_list(BlockDriverState *bs,
1468                        QEMUSnapshotInfo **psn_info)
1469 {
1470     BlockDriver *drv = bs->drv;
1471     if (!drv)
1472         return -ENOMEDIUM;
1473     if (!drv->bdrv_snapshot_list)
1474         return -ENOTSUP;
1475     return drv->bdrv_snapshot_list(bs, psn_info);
1476 }
1477
1478 #define NB_SUFFIXES 4
1479
1480 char *get_human_readable_size(char *buf, int buf_size, int64_t size)
1481 {
1482     static const char suffixes[NB_SUFFIXES] = "KMGT";
1483     int64_t base;
1484     int i;
1485
1486     if (size <= 999) {
1487         snprintf(buf, buf_size, "%" PRId64, size);
1488     } else {
1489         base = 1024;
1490         for(i = 0; i < NB_SUFFIXES; i++) {
1491             if (size < (10 * base)) {
1492                 snprintf(buf, buf_size, "%0.1f%c",
1493                          (double)size / base,
1494                          suffixes[i]);
1495                 break;
1496             } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
1497                 snprintf(buf, buf_size, "%" PRId64 "%c",
1498                          ((size + (base >> 1)) / base),
1499                          suffixes[i]);
1500                 break;
1501             }
1502             base = base * 1024;
1503         }
1504     }
1505     return buf;
1506 }
1507
1508 char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
1509 {
1510     char buf1[128], date_buf[128], clock_buf[128];
1511 #ifdef _WIN32
1512     struct tm *ptm;
1513 #else
1514     struct tm tm;
1515 #endif
1516     time_t ti;
1517     int64_t secs;
1518
1519     if (!sn) {
1520         snprintf(buf, buf_size,
1521                  "%-10s%-20s%7s%20s%15s",
1522                  "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
1523     } else {
1524         ti = sn->date_sec;
1525 #ifdef _WIN32
1526         ptm = localtime(&ti);
1527         strftime(date_buf, sizeof(date_buf),
1528                  "%Y-%m-%d %H:%M:%S", ptm);
1529 #else
1530         localtime_r(&ti, &tm);
1531         strftime(date_buf, sizeof(date_buf),
1532                  "%Y-%m-%d %H:%M:%S", &tm);
1533 #endif
1534         secs = sn->vm_clock_nsec / 1000000000;
1535         snprintf(clock_buf, sizeof(clock_buf),
1536                  "%02d:%02d:%02d.%03d",
1537                  (int)(secs / 3600),
1538                  (int)((secs / 60) % 60),
1539                  (int)(secs % 60),
1540                  (int)((sn->vm_clock_nsec / 1000000) % 1000));
1541         snprintf(buf, buf_size,
1542                  "%-10s%-20s%7s%20s%15s",
1543                  sn->id_str, sn->name,
1544                  get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
1545                  date_buf,
1546                  clock_buf);
1547     }
1548     return buf;
1549 }
1550
1551
1552 /**************************************************************/
1553 /* async I/Os */
1554
1555 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
1556                                  QEMUIOVector *qiov, int nb_sectors,
1557                                  BlockDriverCompletionFunc *cb, void *opaque)
1558 {
1559     BlockDriver *drv = bs->drv;
1560     BlockDriverAIOCB *ret;
1561
1562     if (!drv)
1563         return NULL;
1564     if (bdrv_check_request(bs, sector_num, nb_sectors))
1565         return NULL;
1566
1567     ret = drv->bdrv_aio_readv(bs, sector_num, qiov, nb_sectors,
1568                               cb, opaque);
1569
1570     if (ret) {
1571         /* Update stats even though technically transfer has not happened. */
1572         bs->rd_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
1573         bs->rd_ops ++;
1574     }
1575
1576     return ret;
1577 }
1578
1579 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
1580                                   QEMUIOVector *qiov, int nb_sectors,
1581                                   BlockDriverCompletionFunc *cb, void *opaque)
1582 {
1583     BlockDriver *drv = bs->drv;
1584     BlockDriverAIOCB *ret;
1585
1586     if (!drv)
1587         return NULL;
1588     if (bs->read_only)
1589         return NULL;
1590     if (bdrv_check_request(bs, sector_num, nb_sectors))
1591         return NULL;
1592
1593     if (bs->dirty_bitmap) {
1594         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1595     }
1596
1597     ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
1598                                cb, opaque);
1599
1600     if (ret) {
1601         /* Update stats even though technically transfer has not happened. */
1602         bs->wr_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
1603         bs->wr_ops ++;
1604     }
1605
1606     return ret;
1607 }
1608
1609
1610 typedef struct MultiwriteCB {
1611     int error;
1612     int num_requests;
1613     int num_callbacks;
1614     struct {
1615         BlockDriverCompletionFunc *cb;
1616         void *opaque;
1617         QEMUIOVector *free_qiov;
1618         void *free_buf;
1619     } callbacks[];
1620 } MultiwriteCB;
1621
1622 static void multiwrite_user_cb(MultiwriteCB *mcb)
1623 {
1624     int i;
1625
1626     for (i = 0; i < mcb->num_callbacks; i++) {
1627         mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
1628         qemu_free(mcb->callbacks[i].free_qiov);
1629         qemu_free(mcb->callbacks[i].free_buf);
1630     }
1631 }
1632
1633 static void multiwrite_cb(void *opaque, int ret)
1634 {
1635     MultiwriteCB *mcb = opaque;
1636
1637     if (ret < 0) {
1638         mcb->error = ret;
1639         multiwrite_user_cb(mcb);
1640     }
1641
1642     mcb->num_requests--;
1643     if (mcb->num_requests == 0) {
1644         if (mcb->error == 0) {
1645             multiwrite_user_cb(mcb);
1646         }
1647         qemu_free(mcb);
1648     }
1649 }
1650
1651 static int multiwrite_req_compare(const void *a, const void *b)
1652 {
1653     return (((BlockRequest*) a)->sector - ((BlockRequest*) b)->sector);
1654 }
1655
1656 /*
1657  * Takes a bunch of requests and tries to merge them. Returns the number of
1658  * requests that remain after merging.
1659  */
1660 static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
1661     int num_reqs, MultiwriteCB *mcb)
1662 {
1663     int i, outidx;
1664
1665     // Sort requests by start sector
1666     qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
1667
1668     // Check if adjacent requests touch the same clusters. If so, combine them,
1669     // filling up gaps with zero sectors.
1670     outidx = 0;
1671     for (i = 1; i < num_reqs; i++) {
1672         int merge = 0;
1673         int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
1674
1675         // This handles the cases that are valid for all block drivers, namely
1676         // exactly sequential writes and overlapping writes.
1677         if (reqs[i].sector <= oldreq_last) {
1678             merge = 1;
1679         }
1680
1681         // The block driver may decide that it makes sense to combine requests
1682         // even if there is a gap of some sectors between them. In this case,
1683         // the gap is filled with zeros (therefore only applicable for yet
1684         // unused space in format like qcow2).
1685         if (!merge && bs->drv->bdrv_merge_requests) {
1686             merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
1687         }
1688
1689         if (merge) {
1690             size_t size;
1691             QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));
1692             qemu_iovec_init(qiov,
1693                 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
1694
1695             // Add the first request to the merged one. If the requests are
1696             // overlapping, drop the last sectors of the first request.
1697             size = (reqs[i].sector - reqs[outidx].sector) << 9;
1698             qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
1699
1700             // We might need to add some zeros between the two requests
1701             if (reqs[i].sector > oldreq_last) {
1702                 size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
1703                 uint8_t *buf = qemu_blockalign(bs, zero_bytes);
1704                 memset(buf, 0, zero_bytes);
1705                 qemu_iovec_add(qiov, buf, zero_bytes);
1706                 mcb->callbacks[i].free_buf = buf;
1707             }
1708
1709             // Add the second request
1710             qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
1711
1712             reqs[outidx].nb_sectors += reqs[i].nb_sectors;
1713             reqs[outidx].qiov = qiov;
1714
1715             mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
1716         } else {
1717             outidx++;
1718             reqs[outidx].sector     = reqs[i].sector;
1719             reqs[outidx].nb_sectors = reqs[i].nb_sectors;
1720             reqs[outidx].qiov       = reqs[i].qiov;
1721         }
1722     }
1723
1724     return outidx + 1;
1725 }
1726
1727 /*
1728  * Submit multiple AIO write requests at once.
1729  *
1730  * On success, the function returns 0 and all requests in the reqs array have
1731  * been submitted. In error case this function returns -1, and any of the
1732  * requests may or may not be submitted yet. In particular, this means that the
1733  * callback will be called for some of the requests, for others it won't. The
1734  * caller must check the error field of the BlockRequest to wait for the right
1735  * callbacks (if error != 0, no callback will be called).
1736  *
1737  * The implementation may modify the contents of the reqs array, e.g. to merge
1738  * requests. However, the fields opaque and error are left unmodified as they
1739  * are used to signal failure for a single request to the caller.
1740  */
1741 int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
1742 {
1743     BlockDriverAIOCB *acb;
1744     MultiwriteCB *mcb;
1745     int i;
1746
1747     if (num_reqs == 0) {
1748         return 0;
1749     }
1750
1751     // Create MultiwriteCB structure
1752     mcb = qemu_mallocz(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
1753     mcb->num_requests = 0;
1754     mcb->num_callbacks = num_reqs;
1755
1756     for (i = 0; i < num_reqs; i++) {
1757         mcb->callbacks[i].cb = reqs[i].cb;
1758         mcb->callbacks[i].opaque = reqs[i].opaque;
1759     }
1760
1761     // Check for mergable requests
1762     num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
1763
1764     // Run the aio requests
1765     for (i = 0; i < num_reqs; i++) {
1766         acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
1767             reqs[i].nb_sectors, multiwrite_cb, mcb);
1768
1769         if (acb == NULL) {
1770             // We can only fail the whole thing if no request has been
1771             // submitted yet. Otherwise we'll wait for the submitted AIOs to
1772             // complete and report the error in the callback.
1773             if (mcb->num_requests == 0) {
1774                 reqs[i].error = EIO;
1775                 goto fail;
1776             } else {
1777                 mcb->error = EIO;
1778                 break;
1779             }
1780         } else {
1781             mcb->num_requests++;
1782         }
1783     }
1784
1785     return 0;
1786
1787 fail:
1788     free(mcb);
1789     return -1;
1790 }
1791
1792 BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
1793         BlockDriverCompletionFunc *cb, void *opaque)
1794 {
1795     BlockDriver *drv = bs->drv;
1796
1797     if (!drv)
1798         return NULL;
1799     return drv->bdrv_aio_flush(bs, cb, opaque);
1800 }
1801
1802 void bdrv_aio_cancel(BlockDriverAIOCB *acb)
1803 {
1804     acb->pool->cancel(acb);
1805 }
1806
1807
1808 /**************************************************************/
1809 /* async block device emulation */
1810
1811 typedef struct BlockDriverAIOCBSync {
1812     BlockDriverAIOCB common;
1813     QEMUBH *bh;
1814     int ret;
1815     /* vector translation state */
1816     QEMUIOVector *qiov;
1817     uint8_t *bounce;
1818     int is_write;
1819 } BlockDriverAIOCBSync;
1820
1821 static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
1822 {
1823     BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
1824     qemu_bh_delete(acb->bh);
1825     acb->bh = NULL;
1826     qemu_aio_release(acb);
1827 }
1828
1829 static AIOPool bdrv_em_aio_pool = {
1830     .aiocb_size         = sizeof(BlockDriverAIOCBSync),
1831     .cancel             = bdrv_aio_cancel_em,
1832 };
1833
1834 static void bdrv_aio_bh_cb(void *opaque)
1835 {
1836     BlockDriverAIOCBSync *acb = opaque;
1837
1838     if (!acb->is_write)
1839         qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
1840     qemu_vfree(acb->bounce);
1841     acb->common.cb(acb->common.opaque, acb->ret);
1842     qemu_bh_delete(acb->bh);
1843     acb->bh = NULL;
1844     qemu_aio_release(acb);
1845 }
1846
1847 static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
1848                                             int64_t sector_num,
1849                                             QEMUIOVector *qiov,
1850                                             int nb_sectors,
1851                                             BlockDriverCompletionFunc *cb,
1852                                             void *opaque,
1853                                             int is_write)
1854
1855 {
1856     BlockDriverAIOCBSync *acb;
1857
1858     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
1859     acb->is_write = is_write;
1860     acb->qiov = qiov;
1861     acb->bounce = qemu_blockalign(bs, qiov->size);
1862
1863     if (!acb->bh)
1864         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1865
1866     if (is_write) {
1867         qemu_iovec_to_buffer(acb->qiov, acb->bounce);
1868         acb->ret = bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
1869     } else {
1870         acb->ret = bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
1871     }
1872
1873     qemu_bh_schedule(acb->bh);
1874
1875     return &acb->common;
1876 }
1877
1878 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
1879         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
1880         BlockDriverCompletionFunc *cb, void *opaque)
1881 {
1882     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
1883 }
1884
1885 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
1886         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
1887         BlockDriverCompletionFunc *cb, void *opaque)
1888 {
1889     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
1890 }
1891
1892 static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
1893         BlockDriverCompletionFunc *cb, void *opaque)
1894 {
1895     BlockDriverAIOCBSync *acb;
1896
1897     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
1898     acb->is_write = 1; /* don't bounce in the completion hadler */
1899     acb->qiov = NULL;
1900     acb->bounce = NULL;
1901     acb->ret = 0;
1902
1903     if (!acb->bh)
1904         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1905
1906     bdrv_flush(bs);
1907     qemu_bh_schedule(acb->bh);
1908     return &acb->common;
1909 }
1910
1911 /**************************************************************/
1912 /* sync block device emulation */
1913
1914 static void bdrv_rw_em_cb(void *opaque, int ret)
1915 {
1916     *(int *)opaque = ret;
1917 }
1918
1919 #define NOT_DONE 0x7fffffff
1920
1921 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
1922                         uint8_t *buf, int nb_sectors)
1923 {
1924     int async_ret;
1925     BlockDriverAIOCB *acb;
1926     struct iovec iov;
1927     QEMUIOVector qiov;
1928
1929     async_context_push();
1930
1931     async_ret = NOT_DONE;
1932     iov.iov_base = (void *)buf;
1933     iov.iov_len = nb_sectors * 512;
1934     qemu_iovec_init_external(&qiov, &iov, 1);
1935     acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
1936         bdrv_rw_em_cb, &async_ret);
1937     if (acb == NULL) {
1938         async_ret = -1;
1939         goto fail;
1940     }
1941
1942     while (async_ret == NOT_DONE) {
1943         qemu_aio_wait();
1944     }
1945
1946
1947 fail:
1948     async_context_pop();
1949     return async_ret;
1950 }
1951
1952 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
1953                          const uint8_t *buf, int nb_sectors)
1954 {
1955     int async_ret;
1956     BlockDriverAIOCB *acb;
1957     struct iovec iov;
1958     QEMUIOVector qiov;
1959
1960     async_context_push();
1961
1962     async_ret = NOT_DONE;
1963     iov.iov_base = (void *)buf;
1964     iov.iov_len = nb_sectors * 512;
1965     qemu_iovec_init_external(&qiov, &iov, 1);
1966     acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
1967         bdrv_rw_em_cb, &async_ret);
1968     if (acb == NULL) {
1969         async_ret = -1;
1970         goto fail;
1971     }
1972     while (async_ret == NOT_DONE) {
1973         qemu_aio_wait();
1974     }
1975
1976 fail:
1977     async_context_pop();
1978     return async_ret;
1979 }
1980
1981 void bdrv_init(void)
1982 {
1983     module_call_init(MODULE_INIT_BLOCK);
1984 }
1985
1986 void bdrv_init_with_whitelist(void)
1987 {
1988     use_bdrv_whitelist = 1;
1989     bdrv_init();
1990 }
1991
1992 void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
1993                    BlockDriverCompletionFunc *cb, void *opaque)
1994 {
1995     BlockDriverAIOCB *acb;
1996
1997     if (pool->free_aiocb) {
1998         acb = pool->free_aiocb;
1999         pool->free_aiocb = acb->next;
2000     } else {
2001         acb = qemu_mallocz(pool->aiocb_size);
2002         acb->pool = pool;
2003     }
2004     acb->bs = bs;
2005     acb->cb = cb;
2006     acb->opaque = opaque;
2007     return acb;
2008 }
2009
2010 void qemu_aio_release(void *p)
2011 {
2012     BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
2013     AIOPool *pool = acb->pool;
2014     acb->next = pool->free_aiocb;
2015     pool->free_aiocb = acb;
2016 }
2017
2018 /**************************************************************/
2019 /* removable device support */
2020
2021 /**
2022  * Return TRUE if the media is present
2023  */
2024 int bdrv_is_inserted(BlockDriverState *bs)
2025 {
2026     BlockDriver *drv = bs->drv;
2027     int ret;
2028     if (!drv)
2029         return 0;
2030     if (!drv->bdrv_is_inserted)
2031         return 1;
2032     ret = drv->bdrv_is_inserted(bs);
2033     return ret;
2034 }
2035
2036 /**
2037  * Return TRUE if the media changed since the last call to this
2038  * function. It is currently only used for floppy disks
2039  */
2040 int bdrv_media_changed(BlockDriverState *bs)
2041 {
2042     BlockDriver *drv = bs->drv;
2043     int ret;
2044
2045     if (!drv || !drv->bdrv_media_changed)
2046         ret = -ENOTSUP;
2047     else
2048         ret = drv->bdrv_media_changed(bs);
2049     if (ret == -ENOTSUP)
2050         ret = bs->media_changed;
2051     bs->media_changed = 0;
2052     return ret;
2053 }
2054
2055 /**
2056  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
2057  */
2058 int bdrv_eject(BlockDriverState *bs, int eject_flag)
2059 {
2060     BlockDriver *drv = bs->drv;
2061     int ret;
2062
2063     if (bs->locked) {
2064         return -EBUSY;
2065     }
2066
2067     if (!drv || !drv->bdrv_eject) {
2068         ret = -ENOTSUP;
2069     } else {
2070         ret = drv->bdrv_eject(bs, eject_flag);
2071     }
2072     if (ret == -ENOTSUP) {
2073         if (eject_flag)
2074             bdrv_close(bs);
2075         ret = 0;
2076     }
2077
2078     return ret;
2079 }
2080
2081 int bdrv_is_locked(BlockDriverState *bs)
2082 {
2083     return bs->locked;
2084 }
2085
2086 /**
2087  * Lock or unlock the media (if it is locked, the user won't be able
2088  * to eject it manually).
2089  */
2090 void bdrv_set_locked(BlockDriverState *bs, int locked)
2091 {
2092     BlockDriver *drv = bs->drv;
2093
2094     bs->locked = locked;
2095     if (drv && drv->bdrv_set_locked) {
2096         drv->bdrv_set_locked(bs, locked);
2097     }
2098 }
2099
2100 /* needed for generic scsi interface */
2101
2102 int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
2103 {
2104     BlockDriver *drv = bs->drv;
2105
2106     if (drv && drv->bdrv_ioctl)
2107         return drv->bdrv_ioctl(bs, req, buf);
2108     return -ENOTSUP;
2109 }
2110
2111 BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
2112         unsigned long int req, void *buf,
2113         BlockDriverCompletionFunc *cb, void *opaque)
2114 {
2115     BlockDriver *drv = bs->drv;
2116
2117     if (drv && drv->bdrv_aio_ioctl)
2118         return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
2119     return NULL;
2120 }
2121
2122
2123
2124 void *qemu_blockalign(BlockDriverState *bs, size_t size)
2125 {
2126     return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
2127 }
2128
2129 void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
2130 {
2131     int64_t bitmap_size;
2132
2133     if (enable) {
2134         if (!bs->dirty_bitmap) {
2135             bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
2136                     BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
2137             bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
2138
2139             bs->dirty_bitmap = qemu_mallocz(bitmap_size);
2140         }
2141     } else {
2142         if (bs->dirty_bitmap) {
2143             qemu_free(bs->dirty_bitmap);
2144             bs->dirty_bitmap = NULL;
2145         }
2146     }
2147 }
2148
2149 int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
2150 {
2151     int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
2152
2153     if (bs->dirty_bitmap &&
2154         (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
2155         return bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
2156             (1 << (chunk % (sizeof(unsigned long) * 8)));
2157     } else {
2158         return 0;
2159     }
2160 }
2161
2162 void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
2163                       int nr_sectors)
2164 {
2165     set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
2166 }
This page took 0.142444 seconds and 4 git commands to generate.