• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
54         BlockDriverCompletionFunc *cb, void *opaque);
55 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
56                         uint8_t *buf, int nb_sectors);
57 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
58                          const uint8_t *buf, int nb_sectors);
59 
60 static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
61     QTAILQ_HEAD_INITIALIZER(bdrv_states);
62 
63 static QLIST_HEAD(, BlockDriver) bdrv_drivers =
64     QLIST_HEAD_INITIALIZER(bdrv_drivers);
65 
66 /* The device to use for VM snapshots */
67 static BlockDriverState *bs_snapshots;
68 
69 /* If non-zero, use only whitelisted block drivers */
70 static int use_bdrv_whitelist;
71 
_path_is_absolute(const char * path)72 int _path_is_absolute(const char *path)
73 {
74     const char *p;
75 #ifdef _WIN32
76     /* specific case for names like: "\\.\d:" */
77     if (*path == '/' || *path == '\\')
78         return 1;
79 #endif
80     p = strchr(path, ':');
81     if (p)
82         p++;
83     else
84         p = path;
85 #ifdef _WIN32
86     return (*p == '/' || *p == '\\');
87 #else
88     return (*p == '/');
89 #endif
90 }
91 
92 /* if filename is absolute, just copy it to dest. Otherwise, build a
93    path to it by considering it is relative to base_path. URL are
94    supported. */
path_combine(char * dest,int dest_size,const char * base_path,const char * filename)95 void path_combine(char *dest, int dest_size,
96                   const char *base_path,
97                   const char *filename)
98 {
99     const char *p, *p1;
100     int len;
101 
102     if (dest_size <= 0)
103         return;
104     if (_path_is_absolute(filename)) {
105         pstrcpy(dest, dest_size, filename);
106     } else {
107         p = strchr(base_path, ':');
108         if (p)
109             p++;
110         else
111             p = base_path;
112         p1 = strrchr(base_path, '/');
113 #ifdef _WIN32
114         {
115             const char *p2;
116             p2 = strrchr(base_path, '\\');
117             if (!p1 || p2 > p1)
118                 p1 = p2;
119         }
120 #endif
121         if (p1)
122             p1++;
123         else
124             p1 = base_path;
125         if (p1 > p)
126             p = p1;
127         len = p - base_path;
128         if (len > dest_size - 1)
129             len = dest_size - 1;
130         memcpy(dest, base_path, len);
131         dest[len] = '\0';
132         pstrcat(dest, dest_size, filename);
133     }
134 }
135 
bdrv_register(BlockDriver * bdrv)136 void bdrv_register(BlockDriver *bdrv)
137 {
138     if (!bdrv->bdrv_aio_readv) {
139         /* add AIO emulation layer */
140         bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
141         bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
142     } else if (!bdrv->bdrv_read) {
143         /* add synchronous IO emulation layer */
144         bdrv->bdrv_read = bdrv_read_em;
145         bdrv->bdrv_write = bdrv_write_em;
146     }
147 
148     if (!bdrv->bdrv_aio_flush)
149         bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
150 
151     QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
152 }
153 
154 /* create a new block device (by default it is empty) */
bdrv_new(const char * device_name)155 BlockDriverState *bdrv_new(const char *device_name)
156 {
157     BlockDriverState *bs;
158 
159     bs = qemu_mallocz(sizeof(BlockDriverState));
160     pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
161     if (device_name[0] != '\0') {
162         QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
163     }
164     return bs;
165 }
166 
bdrv_find_format(const char * format_name)167 BlockDriver *bdrv_find_format(const char *format_name)
168 {
169     BlockDriver *drv1;
170     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
171         if (!strcmp(drv1->format_name, format_name)) {
172             return drv1;
173         }
174     }
175     return NULL;
176 }
177 
bdrv_is_whitelisted(BlockDriver * drv)178 static int bdrv_is_whitelisted(BlockDriver *drv)
179 {
180     static const char *whitelist[] = {
181         CONFIG_BDRV_WHITELIST
182     };
183     const char **p;
184 
185     if (!whitelist[0])
186         return 1;               /* no whitelist, anything goes */
187 
188     for (p = whitelist; *p; p++) {
189         if (!strcmp(drv->format_name, *p)) {
190             return 1;
191         }
192     }
193     return 0;
194 }
195 
bdrv_find_whitelisted_format(const char * format_name)196 BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
197 {
198     BlockDriver *drv = bdrv_find_format(format_name);
199     return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
200 }
201 
bdrv_create(BlockDriver * drv,const char * filename,QEMUOptionParameter * options)202 int bdrv_create(BlockDriver *drv, const char* filename,
203     QEMUOptionParameter *options)
204 {
205     if (!drv->bdrv_create)
206         return -ENOTSUP;
207 
208     return drv->bdrv_create(filename, options);
209 }
210 
bdrv_create_file(const char * filename,QEMUOptionParameter * options)211 int bdrv_create_file(const char* filename, QEMUOptionParameter *options)
212 {
213     BlockDriver *drv;
214 
215     drv = bdrv_find_protocol(filename);
216     if (drv == NULL) {
217         drv = bdrv_find_format("file");
218     }
219 
220     return bdrv_create(drv, filename, options);
221 }
222 
223 #ifdef _WIN32
get_tmp_filename(char * filename,int size)224 void get_tmp_filename(char *filename, int size)
225 {
226     char temp_dir[MAX_PATH];
227 
228     GetTempPath(MAX_PATH, temp_dir);
229     GetTempFileName(temp_dir, "qem", 0, filename);
230 }
231 #else
get_tmp_filename(char * filename,int size)232 void get_tmp_filename(char *filename, int size)
233 {
234     int fd;
235     const char *tmpdir;
236     /* XXX: race condition possible */
237     tmpdir = getenv("TMPDIR");
238     if (!tmpdir)
239         tmpdir = "/tmp";
240     snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
241     fd = mkstemp(filename);
242     close(fd);
243 }
244 #endif
245 
246 #ifdef _WIN32
is_windows_drive_prefix(const char * filename)247 static int is_windows_drive_prefix(const char *filename)
248 {
249     return (((filename[0] >= 'a' && filename[0] <= 'z') ||
250              (filename[0] >= 'A' && filename[0] <= 'Z')) &&
251             filename[1] == ':');
252 }
253 
is_windows_drive(const char * filename)254 int is_windows_drive(const char *filename)
255 {
256     if (is_windows_drive_prefix(filename) &&
257         filename[2] == '\0')
258         return 1;
259     if (strstart(filename, "\\\\.\\", NULL) ||
260         strstart(filename, "//./", NULL))
261         return 1;
262     return 0;
263 }
264 #endif
265 
266 /*
267  * Detect host devices. By convention, /dev/cdrom[N] is always
268  * recognized as a host CDROM.
269  */
find_hdev_driver(const char * filename)270 static BlockDriver *find_hdev_driver(const char *filename)
271 {
272     int score_max = 0, score;
273     BlockDriver *drv = NULL, *d;
274 
275     QLIST_FOREACH(d, &bdrv_drivers, list) {
276         if (d->bdrv_probe_device) {
277             score = d->bdrv_probe_device(filename);
278             if (score > score_max) {
279                 score_max = score;
280                 drv = d;
281             }
282         }
283     }
284 
285     return drv;
286 }
287 
bdrv_find_protocol(const char * filename)288 BlockDriver *bdrv_find_protocol(const char *filename)
289 {
290     BlockDriver *drv1;
291     char protocol[128];
292     int len;
293     const char *p;
294 
295     /* TODO Drivers without bdrv_file_open must be specified explicitly */
296 
297     /*
298      * XXX(hch): we really should not let host device detection
299      * override an explicit protocol specification, but moving this
300      * later breaks access to device names with colons in them.
301      * Thanks to the brain-dead persistent naming schemes on udev-
302      * based Linux systems those actually are quite common.
303      */
304     drv1 = find_hdev_driver(filename);
305     if (drv1) {
306         return drv1;
307     }
308 
309 #ifdef _WIN32
310      if (is_windows_drive(filename) ||
311          is_windows_drive_prefix(filename))
312          return bdrv_find_format("file");
313 #endif
314 
315     p = strchr(filename, ':');
316     if (!p) {
317         return bdrv_find_format("file");
318     }
319     len = p - filename;
320     if (len > sizeof(protocol) - 1)
321         len = sizeof(protocol) - 1;
322     memcpy(protocol, filename, len);
323     protocol[len] = '\0';
324     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
325         if (drv1->protocol_name &&
326             !strcmp(drv1->protocol_name, protocol)) {
327             return drv1;
328         }
329     }
330     return NULL;
331 }
332 
find_image_format(const char * filename,BlockDriver ** pdrv)333 static int find_image_format(const char *filename, BlockDriver **pdrv)
334 {
335     int ret, score, score_max;
336     BlockDriver *drv1, *drv;
337     uint8_t buf[2048];
338     BlockDriverState *bs;
339 
340     ret = bdrv_file_open(&bs, filename, 0);
341     if (ret < 0) {
342         *pdrv = NULL;
343         return ret;
344     }
345 
346     /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
347     if (bs->sg || !bdrv_is_inserted(bs)) {
348         bdrv_delete(bs);
349         drv = bdrv_find_format("raw");
350         if (!drv) {
351             ret = -ENOENT;
352         }
353         *pdrv = drv;
354         return ret;
355     }
356 
357     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
358     bdrv_delete(bs);
359     if (ret < 0) {
360         *pdrv = NULL;
361         return ret;
362     }
363 
364     score_max = 0;
365     drv = NULL;
366     QLIST_FOREACH(drv1, &bdrv_drivers, list) {
367         if (drv1->bdrv_probe) {
368             score = drv1->bdrv_probe(buf, ret, filename);
369             if (score > score_max) {
370                 score_max = score;
371                 drv = drv1;
372             }
373         }
374     }
375     if (!drv) {
376         ret = -ENOENT;
377     }
378     *pdrv = drv;
379     return ret;
380 }
381 
382 /**
383  * Set the current 'total_sectors' value
384  */
refresh_total_sectors(BlockDriverState * bs,int64_t hint)385 static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
386 {
387     BlockDriver *drv = bs->drv;
388 
389     /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
390     if (bs->sg)
391         return 0;
392 
393     /* query actual device if possible, otherwise just trust the hint */
394     if (drv->bdrv_getlength) {
395         int64_t length = drv->bdrv_getlength(bs);
396         if (length < 0) {
397             return length;
398         }
399         hint = length >> BDRV_SECTOR_BITS;
400     }
401 
402     bs->total_sectors = hint;
403     return 0;
404 }
405 
406 /*
407  * Common part for opening disk images and files
408  */
bdrv_open_common(BlockDriverState * bs,const char * filename,int flags,BlockDriver * drv)409 static int bdrv_open_common(BlockDriverState *bs, const char *filename,
410     int flags, BlockDriver *drv)
411 {
412     int ret, open_flags;
413 
414     assert(drv != NULL);
415 
416     bs->file = NULL;
417     bs->total_sectors = 0;
418     bs->encrypted = 0;
419     bs->valid_key = 0;
420     bs->open_flags = flags;
421     /* buffer_alignment defaulted to 512, drivers can change this value */
422     bs->buffer_alignment = 512;
423 
424     pstrcpy(bs->filename, sizeof(bs->filename), filename);
425 
426     if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
427         return -ENOTSUP;
428     }
429 
430     bs->drv = drv;
431     bs->opaque = qemu_mallocz(drv->instance_size);
432 
433     /*
434      * Yes, BDRV_O_NOCACHE aka O_DIRECT means we have to present a
435      * write cache to the guest.  We do need the fdatasync to flush
436      * out transactions for block allocations, and we maybe have a
437      * volatile write cache in our backing device to deal with.
438      */
439     if (flags & (BDRV_O_CACHE_WB|BDRV_O_NOCACHE))
440         bs->enable_write_cache = 1;
441 
442     /*
443      * Clear flags that are internal to the block layer before opening the
444      * image.
445      */
446     open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
447 
448     /*
449      * Snapshots should be writeable.
450      */
451     if (bs->is_temporary) {
452         open_flags |= BDRV_O_RDWR;
453     }
454 
455     /* Open the image, either directly or using a protocol */
456     if (drv->bdrv_file_open) {
457         ret = drv->bdrv_file_open(bs, filename, open_flags);
458     } else {
459         ret = bdrv_file_open(&bs->file, filename, open_flags);
460         if (ret >= 0) {
461             ret = drv->bdrv_open(bs, open_flags);
462         }
463     }
464 
465     if (ret < 0) {
466         goto free_and_fail;
467     }
468 
469     bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
470 
471     ret = refresh_total_sectors(bs, bs->total_sectors);
472     if (ret < 0) {
473         goto free_and_fail;
474     }
475 
476 #ifndef _WIN32
477     if (bs->is_temporary) {
478         unlink(filename);
479     }
480 #endif
481     return 0;
482 
483 free_and_fail:
484     if (bs->file) {
485         bdrv_delete(bs->file);
486         bs->file = NULL;
487     }
488     qemu_free(bs->opaque);
489     bs->opaque = NULL;
490     bs->drv = NULL;
491     return ret;
492 }
493 
494 /*
495  * Opens a file using a protocol (file, host_device, nbd, ...)
496  */
bdrv_file_open(BlockDriverState ** pbs,const char * filename,int flags)497 int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
498 {
499     BlockDriverState *bs;
500     BlockDriver *drv;
501     int ret;
502 
503     drv = bdrv_find_protocol(filename);
504     if (!drv) {
505         return -ENOENT;
506     }
507 
508     bs = bdrv_new("");
509     ret = bdrv_open_common(bs, filename, flags, drv);
510     if (ret < 0) {
511         bdrv_delete(bs);
512         return ret;
513     }
514     bs->growable = 1;
515     *pbs = bs;
516     return 0;
517 }
518 
519 /*
520  * Opens a disk image (raw, qcow2, vmdk, ...)
521  */
bdrv_open(BlockDriverState * bs,const char * filename,int flags,BlockDriver * drv)522 int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
523               BlockDriver *drv)
524 {
525     int ret;
526     int probed = 0;
527 
528     if (flags & BDRV_O_SNAPSHOT) {
529         BlockDriverState *bs1;
530         int64_t total_size;
531         int is_protocol = 0;
532         BlockDriver *bdrv_qcow2;
533         QEMUOptionParameter *options;
534         char tmp_filename[PATH_MAX];
535         char backing_filename[PATH_MAX];
536 
537         /* if snapshot, we create a temporary backing file and open it
538            instead of opening 'filename' directly */
539 
540         /* if there is a backing file, use it */
541         bs1 = bdrv_new("");
542         ret = bdrv_open(bs1, filename, 0, drv);
543         if (ret < 0) {
544             bdrv_delete(bs1);
545             return ret;
546         }
547         total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
548 
549         if (bs1->drv && bs1->drv->protocol_name)
550             is_protocol = 1;
551 
552         bdrv_delete(bs1);
553 
554         get_tmp_filename(tmp_filename, sizeof(tmp_filename));
555 
556         /* Real path is meaningless for protocols */
557         if (is_protocol)
558             snprintf(backing_filename, sizeof(backing_filename),
559                      "%s", filename);
560         else if (!realpath(filename, backing_filename))
561             return -errno;
562 
563         bdrv_qcow2 = bdrv_find_format("qcow2");
564         options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
565 
566         set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size);
567         set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
568         if (drv) {
569             set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
570                 drv->format_name);
571         }
572 
573         ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
574         free_option_parameters(options);
575         if (ret < 0) {
576             return ret;
577         }
578 
579         filename = tmp_filename;
580         drv = bdrv_qcow2;
581         bs->is_temporary = 1;
582     }
583 
584     /* Find the right image format driver */
585     if (!drv) {
586         ret = find_image_format(filename, &drv);
587         probed = 1;
588     }
589 
590     if (!drv) {
591         goto unlink_and_fail;
592     }
593 
594     /* Open the image */
595     ret = bdrv_open_common(bs, filename, flags, drv);
596     if (ret < 0) {
597         goto unlink_and_fail;
598     }
599 
600     bs->probed = probed;
601 
602     /* If there is a backing file, use it */
603     if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
604         char backing_filename[PATH_MAX];
605         int back_flags;
606         BlockDriver *back_drv = NULL;
607 
608         bs->backing_hd = bdrv_new("");
609         path_combine(backing_filename, sizeof(backing_filename),
610                      filename, bs->backing_file);
611         if (bs->backing_format[0] != '\0')
612             back_drv = bdrv_find_format(bs->backing_format);
613 
614         /* backing files always opened read-only */
615         back_flags =
616             flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
617 
618         ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
619         if (ret < 0) {
620             bdrv_close(bs);
621             return ret;
622         }
623         if (bs->is_temporary) {
624             bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
625         } else {
626             /* base image inherits from "parent" */
627             bs->backing_hd->keep_read_only = bs->keep_read_only;
628         }
629     }
630 
631     if (!bdrv_key_required(bs)) {
632         /* call the change callback */
633         bs->media_changed = 1;
634         if (bs->change_cb)
635             bs->change_cb(bs->change_opaque);
636     }
637 
638     return 0;
639 
640 unlink_and_fail:
641     if (bs->is_temporary) {
642         unlink(filename);
643     }
644     return ret;
645 }
646 
bdrv_close(BlockDriverState * bs)647 void bdrv_close(BlockDriverState *bs)
648 {
649     if (bs->drv) {
650         if (bs == bs_snapshots) {
651             bs_snapshots = NULL;
652         }
653         if (bs->backing_hd) {
654             bdrv_delete(bs->backing_hd);
655             bs->backing_hd = NULL;
656         }
657         bs->drv->bdrv_close(bs);
658         qemu_free(bs->opaque);
659 #ifdef _WIN32
660         if (bs->is_temporary) {
661             unlink(bs->filename);
662         }
663 #endif
664         bs->opaque = NULL;
665         bs->drv = NULL;
666 
667         if (bs->file != NULL) {
668             bdrv_close(bs->file);
669         }
670 
671         /* call the change callback */
672         bs->media_changed = 1;
673         if (bs->change_cb)
674             bs->change_cb(bs->change_opaque);
675     }
676 }
677 
bdrv_close_all(void)678 void bdrv_close_all(void)
679 {
680     BlockDriverState *bs;
681 
682     QTAILQ_FOREACH(bs, &bdrv_states, list) {
683         bdrv_close(bs);
684     }
685 }
686 
bdrv_delete(BlockDriverState * bs)687 void bdrv_delete(BlockDriverState *bs)
688 {
689     assert(!bs->peer);
690 
691     /* remove from list, if necessary */
692     if (bs->device_name[0] != '\0') {
693         QTAILQ_REMOVE(&bdrv_states, bs, list);
694     }
695 
696     bdrv_close(bs);
697     if (bs->file != NULL) {
698         bdrv_delete(bs->file);
699     }
700 
701     assert(bs != bs_snapshots);
702     qemu_free(bs);
703 }
704 
bdrv_attach(BlockDriverState * bs,DeviceState * qdev)705 int bdrv_attach(BlockDriverState *bs, DeviceState *qdev)
706 {
707     if (bs->peer) {
708         return -EBUSY;
709     }
710     bs->peer = qdev;
711     return 0;
712 }
713 
bdrv_detach(BlockDriverState * bs,DeviceState * qdev)714 void bdrv_detach(BlockDriverState *bs, DeviceState *qdev)
715 {
716     assert(bs->peer == qdev);
717     bs->peer = NULL;
718 }
719 
bdrv_get_attached(BlockDriverState * bs)720 DeviceState *bdrv_get_attached(BlockDriverState *bs)
721 {
722     return bs->peer;
723 }
724 
725 /*
726  * Run consistency checks on an image
727  *
728  * Returns 0 if the check could be completed (it doesn't mean that the image is
729  * free of errors) or -errno when an internal error occured. The results of the
730  * check are stored in res.
731  */
bdrv_check(BlockDriverState * bs,BdrvCheckResult * res)732 int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
733 {
734     if (bs->drv->bdrv_check == NULL) {
735         return -ENOTSUP;
736     }
737 
738     memset(res, 0, sizeof(*res));
739     return bs->drv->bdrv_check(bs, res);
740 }
741 
742 #define COMMIT_BUF_SECTORS 2048
743 
744 /* commit COW file into the raw image */
bdrv_commit(BlockDriverState * bs)745 int bdrv_commit(BlockDriverState *bs)
746 {
747     BlockDriver *drv = bs->drv;
748     int64_t sector, total_sectors;
749     int n, ro, open_flags;
750     int ret = 0, rw_ret = 0;
751     uint8_t *buf;
752     char filename[1024];
753     BlockDriverState *bs_rw, *bs_ro;
754 
755     if (!drv)
756         return -ENOMEDIUM;
757 
758     if (!bs->backing_hd) {
759         return -ENOTSUP;
760     }
761 
762     if (bs->backing_hd->keep_read_only) {
763         return -EACCES;
764     }
765 
766     ro = bs->backing_hd->read_only;
767     strncpy(filename, bs->backing_hd->filename, sizeof(filename));
768     open_flags =  bs->backing_hd->open_flags;
769 
770     if (ro) {
771         /* re-open as RW */
772         bdrv_delete(bs->backing_hd);
773         bs->backing_hd = NULL;
774         bs_rw = bdrv_new("");
775         rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR, drv);
776         if (rw_ret < 0) {
777             bdrv_delete(bs_rw);
778             /* try to re-open read-only */
779             bs_ro = bdrv_new("");
780             ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR, drv);
781             if (ret < 0) {
782                 bdrv_delete(bs_ro);
783                 /* drive not functional anymore */
784                 bs->drv = NULL;
785                 return ret;
786             }
787             bs->backing_hd = bs_ro;
788             return rw_ret;
789         }
790         bs->backing_hd = bs_rw;
791     }
792 
793     total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
794     buf = qemu_malloc(COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
795 
796     for (sector = 0; sector < total_sectors; sector += n) {
797         if (drv->bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n)) {
798 
799             if (bdrv_read(bs, sector, buf, n) != 0) {
800                 ret = -EIO;
801                 goto ro_cleanup;
802             }
803 
804             if (bdrv_write(bs->backing_hd, sector, buf, n) != 0) {
805                 ret = -EIO;
806                 goto ro_cleanup;
807             }
808         }
809     }
810 
811     if (drv->bdrv_make_empty) {
812         ret = drv->bdrv_make_empty(bs);
813         bdrv_flush(bs);
814     }
815 
816     /*
817      * Make sure all data we wrote to the backing device is actually
818      * stable on disk.
819      */
820     if (bs->backing_hd)
821         bdrv_flush(bs->backing_hd);
822 
823 ro_cleanup:
824     qemu_free(buf);
825 
826     if (ro) {
827         /* re-open as RO */
828         bdrv_delete(bs->backing_hd);
829         bs->backing_hd = NULL;
830         bs_ro = bdrv_new("");
831         ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR, drv);
832         if (ret < 0) {
833             bdrv_delete(bs_ro);
834             /* drive not functional anymore */
835             bs->drv = NULL;
836             return ret;
837         }
838         bs->backing_hd = bs_ro;
839         bs->backing_hd->keep_read_only = 0;
840     }
841 
842     return ret;
843 }
844 
bdrv_commit_all(void)845 void bdrv_commit_all(void)
846 {
847     BlockDriverState *bs;
848 
849     QTAILQ_FOREACH(bs, &bdrv_states, list) {
850         bdrv_commit(bs);
851     }
852 }
853 
854 /*
855  * Return values:
856  * 0        - success
857  * -EINVAL  - backing format specified, but no file
858  * -ENOSPC  - can't update the backing file because no space is left in the
859  *            image file header
860  * -ENOTSUP - format driver doesn't support changing the backing file
861  */
bdrv_change_backing_file(BlockDriverState * bs,const char * backing_file,const char * backing_fmt)862 int bdrv_change_backing_file(BlockDriverState *bs,
863     const char *backing_file, const char *backing_fmt)
864 {
865     BlockDriver *drv = bs->drv;
866 
867     if (drv->bdrv_change_backing_file != NULL) {
868         return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
869     } else {
870         return -ENOTSUP;
871     }
872 }
873 
bdrv_check_byte_request(BlockDriverState * bs,int64_t offset,size_t size)874 static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
875                                    size_t size)
876 {
877     int64_t len;
878 
879     if (!bdrv_is_inserted(bs))
880         return -ENOMEDIUM;
881 
882     if (bs->growable)
883         return 0;
884 
885     len = bdrv_getlength(bs);
886 
887     if (offset < 0)
888         return -EIO;
889 
890     if ((offset > len) || (len - offset < size))
891         return -EIO;
892 
893     return 0;
894 }
895 
bdrv_check_request(BlockDriverState * bs,int64_t sector_num,int nb_sectors)896 static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
897                               int nb_sectors)
898 {
899     return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
900                                    nb_sectors * BDRV_SECTOR_SIZE);
901 }
902 
903 /* return < 0 if error. See bdrv_write() for the return codes */
bdrv_read(BlockDriverState * bs,int64_t sector_num,uint8_t * buf,int nb_sectors)904 int bdrv_read(BlockDriverState *bs, int64_t sector_num,
905               uint8_t *buf, int nb_sectors)
906 {
907     BlockDriver *drv = bs->drv;
908 
909     if (!drv)
910         return -ENOMEDIUM;
911     if (bdrv_check_request(bs, sector_num, nb_sectors))
912         return -EIO;
913 
914     return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
915 }
916 
set_dirty_bitmap(BlockDriverState * bs,int64_t sector_num,int nb_sectors,int dirty)917 static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
918                              int nb_sectors, int dirty)
919 {
920     int64_t start, end;
921     unsigned long val, idx, bit;
922 
923     start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
924     end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
925 
926     for (; start <= end; start++) {
927         idx = start / (sizeof(unsigned long) * 8);
928         bit = start % (sizeof(unsigned long) * 8);
929         val = bs->dirty_bitmap[idx];
930         if (dirty) {
931             if (!(val & (1 << bit))) {
932                 bs->dirty_count++;
933                 val |= 1 << bit;
934             }
935         } else {
936             if (val & (1 << bit)) {
937                 bs->dirty_count--;
938                 val &= ~(1 << bit);
939             }
940         }
941         bs->dirty_bitmap[idx] = val;
942     }
943 }
944 
945 /* Return < 0 if error. Important errors are:
946   -EIO         generic I/O error (may happen for all errors)
947   -ENOMEDIUM   No media inserted.
948   -EINVAL      Invalid sector number or nb_sectors
949   -EACCES      Trying to write a read-only device
950 */
bdrv_write(BlockDriverState * bs,int64_t sector_num,const uint8_t * buf,int nb_sectors)951 int bdrv_write(BlockDriverState *bs, int64_t sector_num,
952                const uint8_t *buf, int nb_sectors)
953 {
954     BlockDriver *drv = bs->drv;
955     if (!bs->drv)
956         return -ENOMEDIUM;
957     if (bs->read_only)
958         return -EACCES;
959     if (bdrv_check_request(bs, sector_num, nb_sectors))
960         return -EIO;
961 
962     if (bs->dirty_bitmap) {
963         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
964     }
965 
966     if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
967         bs->wr_highest_sector = sector_num + nb_sectors - 1;
968     }
969 
970     return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
971 }
972 
bdrv_pread(BlockDriverState * bs,int64_t offset,void * buf,int count1)973 int bdrv_pread(BlockDriverState *bs, int64_t offset,
974                void *buf, int count1)
975 {
976     uint8_t tmp_buf[BDRV_SECTOR_SIZE];
977     int len, nb_sectors, count;
978     int64_t sector_num;
979     int ret;
980 
981     count = count1;
982     /* first read to align to sector start */
983     len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
984     if (len > count)
985         len = count;
986     sector_num = offset >> BDRV_SECTOR_BITS;
987     if (len > 0) {
988         if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
989             return ret;
990         memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
991         count -= len;
992         if (count == 0)
993             return count1;
994         sector_num++;
995         buf += len;
996     }
997 
998     /* read the sectors "in place" */
999     nb_sectors = count >> BDRV_SECTOR_BITS;
1000     if (nb_sectors > 0) {
1001         if ((ret = bdrv_read(bs, sector_num, buf, nb_sectors)) < 0)
1002             return ret;
1003         sector_num += nb_sectors;
1004         len = nb_sectors << BDRV_SECTOR_BITS;
1005         buf += len;
1006         count -= len;
1007     }
1008 
1009     /* add data from the last sector */
1010     if (count > 0) {
1011         if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1012             return ret;
1013         memcpy(buf, tmp_buf, count);
1014     }
1015     return count1;
1016 }
1017 
bdrv_pwrite(BlockDriverState * bs,int64_t offset,const void * buf,int count1)1018 int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
1019                 const void *buf, int count1)
1020 {
1021     uint8_t tmp_buf[BDRV_SECTOR_SIZE];
1022     int len, nb_sectors, count;
1023     int64_t sector_num;
1024     int ret;
1025 
1026     count = count1;
1027     /* first write to align to sector start */
1028     len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
1029     if (len > count)
1030         len = count;
1031     sector_num = offset >> BDRV_SECTOR_BITS;
1032     if (len > 0) {
1033         if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1034             return ret;
1035         memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
1036         if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1037             return ret;
1038         count -= len;
1039         if (count == 0)
1040             return count1;
1041         sector_num++;
1042         buf += len;
1043     }
1044 
1045     /* write the sectors "in place" */
1046     nb_sectors = count >> BDRV_SECTOR_BITS;
1047     if (nb_sectors > 0) {
1048         if ((ret = bdrv_write(bs, sector_num, buf, nb_sectors)) < 0)
1049             return ret;
1050         sector_num += nb_sectors;
1051         len = nb_sectors << BDRV_SECTOR_BITS;
1052         buf += len;
1053         count -= len;
1054     }
1055 
1056     /* add data from the last sector */
1057     if (count > 0) {
1058         if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
1059             return ret;
1060         memcpy(tmp_buf, buf, count);
1061         if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
1062             return ret;
1063     }
1064     return count1;
1065 }
1066 
1067 /*
1068  * Writes to the file and ensures that no writes are reordered across this
1069  * request (acts as a barrier)
1070  *
1071  * Returns 0 on success, -errno in error cases.
1072  */
bdrv_pwrite_sync(BlockDriverState * bs,int64_t offset,const void * buf,int count)1073 int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
1074     const void *buf, int count)
1075 {
1076     int ret;
1077 
1078     ret = bdrv_pwrite(bs, offset, buf, count);
1079     if (ret < 0) {
1080         return ret;
1081     }
1082 
1083     /* No flush needed for cache=writethrough, it uses O_DSYNC */
1084     if ((bs->open_flags & BDRV_O_CACHE_MASK) != 0) {
1085         bdrv_flush(bs);
1086     }
1087 
1088     return 0;
1089 }
1090 
1091 /*
1092  * Writes to the file and ensures that no writes are reordered across this
1093  * request (acts as a barrier)
1094  *
1095  * Returns 0 on success, -errno in error cases.
1096  */
bdrv_write_sync(BlockDriverState * bs,int64_t sector_num,const uint8_t * buf,int nb_sectors)1097 int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num,
1098     const uint8_t *buf, int nb_sectors)
1099 {
1100     return bdrv_pwrite_sync(bs, BDRV_SECTOR_SIZE * sector_num,
1101         buf, BDRV_SECTOR_SIZE * nb_sectors);
1102 }
1103 
1104 /**
1105  * Truncate file to 'offset' bytes (needed only for file protocols)
1106  */
bdrv_truncate(BlockDriverState * bs,int64_t offset)1107 int bdrv_truncate(BlockDriverState *bs, int64_t offset)
1108 {
1109     BlockDriver *drv = bs->drv;
1110     int ret;
1111     if (!drv)
1112         return -ENOMEDIUM;
1113     if (!drv->bdrv_truncate)
1114         return -ENOTSUP;
1115     if (bs->read_only)
1116         return -EACCES;
1117     ret = drv->bdrv_truncate(bs, offset);
1118     if (ret == 0) {
1119         ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
1120     }
1121     return ret;
1122 }
1123 
1124 /**
1125  * Length of a file in bytes. Return < 0 if error or unknown.
1126  */
bdrv_getlength(BlockDriverState * bs)1127 int64_t bdrv_getlength(BlockDriverState *bs)
1128 {
1129     BlockDriver *drv = bs->drv;
1130     if (!drv)
1131         return -ENOMEDIUM;
1132 
1133     /* Fixed size devices use the total_sectors value for speed instead of
1134        issuing a length query (like lseek) on each call.  Also, legacy block
1135        drivers don't provide a bdrv_getlength function and must use
1136        total_sectors. */
1137     if (!bs->growable || !drv->bdrv_getlength) {
1138         return bs->total_sectors * BDRV_SECTOR_SIZE;
1139     }
1140     return drv->bdrv_getlength(bs);
1141 }
1142 
1143 /* return 0 as number of sectors if no device present or error */
bdrv_get_geometry(BlockDriverState * bs,uint64_t * nb_sectors_ptr)1144 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
1145 {
1146     int64_t length;
1147     length = bdrv_getlength(bs);
1148     if (length < 0)
1149         length = 0;
1150     else
1151         length = length >> BDRV_SECTOR_BITS;
1152     *nb_sectors_ptr = length;
1153 }
1154 
1155 struct partition {
1156         uint8_t boot_ind;           /* 0x80 - active */
1157         uint8_t head;               /* starting head */
1158         uint8_t sector;             /* starting sector */
1159         uint8_t cyl;                /* starting cylinder */
1160         uint8_t sys_ind;            /* What partition type */
1161         uint8_t end_head;           /* end head */
1162         uint8_t end_sector;         /* end sector */
1163         uint8_t end_cyl;            /* end cylinder */
1164         uint32_t start_sect;        /* starting sector counting from 0 */
1165         uint32_t nr_sects;          /* nr of sectors in partition */
1166 } __attribute__((packed));
1167 
1168 /* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
guess_disk_lchs(BlockDriverState * bs,int * pcylinders,int * pheads,int * psectors)1169 static int guess_disk_lchs(BlockDriverState *bs,
1170                            int *pcylinders, int *pheads, int *psectors)
1171 {
1172     uint8_t buf[BDRV_SECTOR_SIZE];
1173     int ret, i, heads, sectors, cylinders;
1174     struct partition *p;
1175     uint32_t nr_sects;
1176     uint64_t nb_sectors;
1177 
1178     bdrv_get_geometry(bs, &nb_sectors);
1179 
1180     ret = bdrv_read(bs, 0, buf, 1);
1181     if (ret < 0)
1182         return -1;
1183     /* test msdos magic */
1184     if (buf[510] != 0x55 || buf[511] != 0xaa)
1185         return -1;
1186     for(i = 0; i < 4; i++) {
1187         p = ((struct partition *)(buf + 0x1be)) + i;
1188         nr_sects = le32_to_cpu(p->nr_sects);
1189         if (nr_sects && p->end_head) {
1190             /* We make the assumption that the partition terminates on
1191                a cylinder boundary */
1192             heads = p->end_head + 1;
1193             sectors = p->end_sector & 63;
1194             if (sectors == 0)
1195                 continue;
1196             cylinders = nb_sectors / (heads * sectors);
1197             if (cylinders < 1 || cylinders > 16383)
1198                 continue;
1199             *pheads = heads;
1200             *psectors = sectors;
1201             *pcylinders = cylinders;
1202 #if 0
1203             printf("guessed geometry: LCHS=%d %d %d\n",
1204                    cylinders, heads, sectors);
1205 #endif
1206             return 0;
1207         }
1208     }
1209     return -1;
1210 }
1211 
bdrv_guess_geometry(BlockDriverState * bs,int * pcyls,int * pheads,int * psecs)1212 void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
1213 {
1214     int translation, lba_detected = 0;
1215     int cylinders, heads, secs;
1216     uint64_t nb_sectors;
1217 
1218     /* if a geometry hint is available, use it */
1219     bdrv_get_geometry(bs, &nb_sectors);
1220     bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
1221     translation = bdrv_get_translation_hint(bs);
1222     if (cylinders != 0) {
1223         *pcyls = cylinders;
1224         *pheads = heads;
1225         *psecs = secs;
1226     } else {
1227         if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
1228             if (heads > 16) {
1229                 /* if heads > 16, it means that a BIOS LBA
1230                    translation was active, so the default
1231                    hardware geometry is OK */
1232                 lba_detected = 1;
1233                 goto default_geometry;
1234             } else {
1235                 *pcyls = cylinders;
1236                 *pheads = heads;
1237                 *psecs = secs;
1238                 /* disable any translation to be in sync with
1239                    the logical geometry */
1240                 if (translation == BIOS_ATA_TRANSLATION_AUTO) {
1241                     bdrv_set_translation_hint(bs,
1242                                               BIOS_ATA_TRANSLATION_NONE);
1243                 }
1244             }
1245         } else {
1246         default_geometry:
1247             /* if no geometry, use a standard physical disk geometry */
1248             cylinders = nb_sectors / (16 * 63);
1249 
1250             if (cylinders > 16383)
1251                 cylinders = 16383;
1252             else if (cylinders < 2)
1253                 cylinders = 2;
1254             *pcyls = cylinders;
1255             *pheads = 16;
1256             *psecs = 63;
1257             if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
1258                 if ((*pcyls * *pheads) <= 131072) {
1259                     bdrv_set_translation_hint(bs,
1260                                               BIOS_ATA_TRANSLATION_LARGE);
1261                 } else {
1262                     bdrv_set_translation_hint(bs,
1263                                               BIOS_ATA_TRANSLATION_LBA);
1264                 }
1265             }
1266         }
1267         bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
1268     }
1269 }
1270 
bdrv_set_geometry_hint(BlockDriverState * bs,int cyls,int heads,int secs)1271 void bdrv_set_geometry_hint(BlockDriverState *bs,
1272                             int cyls, int heads, int secs)
1273 {
1274     bs->cyls = cyls;
1275     bs->heads = heads;
1276     bs->secs = secs;
1277 }
1278 
bdrv_set_type_hint(BlockDriverState * bs,int type)1279 void bdrv_set_type_hint(BlockDriverState *bs, int type)
1280 {
1281     bs->type = type;
1282     bs->removable = ((type == BDRV_TYPE_CDROM ||
1283                       type == BDRV_TYPE_FLOPPY));
1284 }
1285 
bdrv_set_translation_hint(BlockDriverState * bs,int translation)1286 void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
1287 {
1288     bs->translation = translation;
1289 }
1290 
bdrv_get_geometry_hint(BlockDriverState * bs,int * pcyls,int * pheads,int * psecs)1291 void bdrv_get_geometry_hint(BlockDriverState *bs,
1292                             int *pcyls, int *pheads, int *psecs)
1293 {
1294     *pcyls = bs->cyls;
1295     *pheads = bs->heads;
1296     *psecs = bs->secs;
1297 }
1298 
bdrv_get_type_hint(BlockDriverState * bs)1299 int bdrv_get_type_hint(BlockDriverState *bs)
1300 {
1301     return bs->type;
1302 }
1303 
bdrv_get_translation_hint(BlockDriverState * bs)1304 int bdrv_get_translation_hint(BlockDriverState *bs)
1305 {
1306     return bs->translation;
1307 }
1308 
bdrv_set_on_error(BlockDriverState * bs,BlockErrorAction on_read_error,BlockErrorAction on_write_error)1309 void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
1310                        BlockErrorAction on_write_error)
1311 {
1312     bs->on_read_error = on_read_error;
1313     bs->on_write_error = on_write_error;
1314 }
1315 
bdrv_get_on_error(BlockDriverState * bs,int is_read)1316 BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
1317 {
1318     return is_read ? bs->on_read_error : bs->on_write_error;
1319 }
1320 
bdrv_set_removable(BlockDriverState * bs,int removable)1321 void bdrv_set_removable(BlockDriverState *bs, int removable)
1322 {
1323     bs->removable = removable;
1324     if (removable && bs == bs_snapshots) {
1325         bs_snapshots = NULL;
1326     }
1327 }
1328 
bdrv_is_removable(BlockDriverState * bs)1329 int bdrv_is_removable(BlockDriverState *bs)
1330 {
1331     return bs->removable;
1332 }
1333 
bdrv_is_read_only(BlockDriverState * bs)1334 int bdrv_is_read_only(BlockDriverState *bs)
1335 {
1336     return bs->read_only;
1337 }
1338 
bdrv_is_sg(BlockDriverState * bs)1339 int bdrv_is_sg(BlockDriverState *bs)
1340 {
1341     return bs->sg;
1342 }
1343 
bdrv_enable_write_cache(BlockDriverState * bs)1344 int bdrv_enable_write_cache(BlockDriverState *bs)
1345 {
1346     return bs->enable_write_cache;
1347 }
1348 
1349 /* XXX: no longer used */
bdrv_set_change_cb(BlockDriverState * bs,void (* change_cb)(void * opaque),void * opaque)1350 void bdrv_set_change_cb(BlockDriverState *bs,
1351                         void (*change_cb)(void *opaque), void *opaque)
1352 {
1353     bs->change_cb = change_cb;
1354     bs->change_opaque = opaque;
1355 }
1356 
bdrv_is_encrypted(BlockDriverState * bs)1357 int bdrv_is_encrypted(BlockDriverState *bs)
1358 {
1359     if (bs->backing_hd && bs->backing_hd->encrypted)
1360         return 1;
1361     return bs->encrypted;
1362 }
1363 
bdrv_key_required(BlockDriverState * bs)1364 int bdrv_key_required(BlockDriverState *bs)
1365 {
1366     BlockDriverState *backing_hd = bs->backing_hd;
1367 
1368     if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
1369         return 1;
1370     return (bs->encrypted && !bs->valid_key);
1371 }
1372 
bdrv_set_key(BlockDriverState * bs,const char * key)1373 int bdrv_set_key(BlockDriverState *bs, const char *key)
1374 {
1375     int ret;
1376     if (bs->backing_hd && bs->backing_hd->encrypted) {
1377         ret = bdrv_set_key(bs->backing_hd, key);
1378         if (ret < 0)
1379             return ret;
1380         if (!bs->encrypted)
1381             return 0;
1382     }
1383     if (!bs->encrypted) {
1384         return -EINVAL;
1385     } else if (!bs->drv || !bs->drv->bdrv_set_key) {
1386         return -ENOMEDIUM;
1387     }
1388     ret = bs->drv->bdrv_set_key(bs, key);
1389     if (ret < 0) {
1390         bs->valid_key = 0;
1391     } else if (!bs->valid_key) {
1392         bs->valid_key = 1;
1393         /* call the change callback now, we skipped it on open */
1394         bs->media_changed = 1;
1395         if (bs->change_cb)
1396             bs->change_cb(bs->change_opaque);
1397     }
1398     return ret;
1399 }
1400 
bdrv_get_format(BlockDriverState * bs,char * buf,int buf_size)1401 void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
1402 {
1403     if (!bs->drv) {
1404         buf[0] = '\0';
1405     } else {
1406         pstrcpy(buf, buf_size, bs->drv->format_name);
1407     }
1408 }
1409 
bdrv_iterate_format(void (* it)(void * opaque,const char * name),void * opaque)1410 void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
1411                          void *opaque)
1412 {
1413     BlockDriver *drv;
1414 
1415     QLIST_FOREACH(drv, &bdrv_drivers, list) {
1416         it(opaque, drv->format_name);
1417     }
1418 }
1419 
bdrv_find(const char * name)1420 BlockDriverState *bdrv_find(const char *name)
1421 {
1422     BlockDriverState *bs;
1423 
1424     QTAILQ_FOREACH(bs, &bdrv_states, list) {
1425         if (!strcmp(name, bs->device_name)) {
1426             return bs;
1427         }
1428     }
1429     return NULL;
1430 }
1431 
bdrv_next(BlockDriverState * bs)1432 BlockDriverState *bdrv_next(BlockDriverState *bs)
1433 {
1434     if (!bs) {
1435         return QTAILQ_FIRST(&bdrv_states);
1436     }
1437     return QTAILQ_NEXT(bs, list);
1438 }
1439 
bdrv_iterate(void (* it)(void * opaque,BlockDriverState * bs),void * opaque)1440 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
1441 {
1442     BlockDriverState *bs;
1443 
1444     QTAILQ_FOREACH(bs, &bdrv_states, list) {
1445         it(opaque, bs);
1446     }
1447 }
1448 
bdrv_get_device_name(BlockDriverState * bs)1449 const char *bdrv_get_device_name(BlockDriverState *bs)
1450 {
1451     return bs->device_name;
1452 }
1453 
bdrv_flush(BlockDriverState * bs)1454 void bdrv_flush(BlockDriverState *bs)
1455 {
1456     if (bs->open_flags & BDRV_O_NO_FLUSH) {
1457         return;
1458     }
1459 
1460     if (bs->drv && bs->drv->bdrv_flush)
1461         bs->drv->bdrv_flush(bs);
1462 }
1463 
bdrv_flush_all(void)1464 void bdrv_flush_all(void)
1465 {
1466     BlockDriverState *bs;
1467 
1468     QTAILQ_FOREACH(bs, &bdrv_states, list) {
1469         if (bs->drv && !bdrv_is_read_only(bs) &&
1470             (!bdrv_is_removable(bs) || bdrv_is_inserted(bs))) {
1471             bdrv_flush(bs);
1472         }
1473     }
1474 }
1475 
bdrv_has_zero_init(BlockDriverState * bs)1476 int bdrv_has_zero_init(BlockDriverState *bs)
1477 {
1478     assert(bs->drv);
1479 
1480     if (bs->drv->bdrv_has_zero_init) {
1481         return bs->drv->bdrv_has_zero_init(bs);
1482     }
1483 
1484     return 1;
1485 }
1486 
1487 /*
1488  * Returns true iff the specified sector is present in the disk image. Drivers
1489  * not implementing the functionality are assumed to not support backing files,
1490  * hence all their sectors are reported as allocated.
1491  *
1492  * 'pnum' is set to the number of sectors (including and immediately following
1493  * the specified sector) that are known to be in the same
1494  * allocated/unallocated state.
1495  *
1496  * 'nb_sectors' is the max value 'pnum' should be set to.
1497  */
bdrv_is_allocated(BlockDriverState * bs,int64_t sector_num,int nb_sectors,int * pnum)1498 int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
1499 	int *pnum)
1500 {
1501     int64_t n;
1502     if (!bs->drv->bdrv_is_allocated) {
1503         if (sector_num >= bs->total_sectors) {
1504             *pnum = 0;
1505             return 0;
1506         }
1507         n = bs->total_sectors - sector_num;
1508         *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
1509         return 1;
1510     }
1511     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
1512 }
1513 
bdrv_mon_event(const BlockDriverState * bdrv,BlockMonEventAction action,int is_read)1514 void bdrv_mon_event(const BlockDriverState *bdrv,
1515                     BlockMonEventAction action, int is_read)
1516 {
1517     QObject *data;
1518     const char *action_str;
1519 
1520     switch (action) {
1521     case BDRV_ACTION_REPORT:
1522         action_str = "report";
1523         break;
1524     case BDRV_ACTION_IGNORE:
1525         action_str = "ignore";
1526         break;
1527     case BDRV_ACTION_STOP:
1528         action_str = "stop";
1529         break;
1530     default:
1531         abort();
1532     }
1533 
1534     data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
1535                               bdrv->device_name,
1536                               action_str,
1537                               is_read ? "read" : "write");
1538     monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
1539 
1540     qobject_decref(data);
1541 }
1542 
bdrv_print_dict(QObject * obj,void * opaque)1543 static void bdrv_print_dict(QObject *obj, void *opaque)
1544 {
1545     QDict *bs_dict;
1546     Monitor *mon = opaque;
1547 
1548     bs_dict = qobject_to_qdict(obj);
1549 
1550     monitor_printf(mon, "%s: type=%s removable=%d",
1551                         qdict_get_str(bs_dict, "device"),
1552                         qdict_get_str(bs_dict, "type"),
1553                         qdict_get_bool(bs_dict, "removable"));
1554 
1555     if (qdict_get_bool(bs_dict, "removable")) {
1556         monitor_printf(mon, " locked=%d", qdict_get_bool(bs_dict, "locked"));
1557     }
1558 
1559     if (qdict_haskey(bs_dict, "inserted")) {
1560         QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted"));
1561 
1562         monitor_printf(mon, " file=");
1563         monitor_print_filename(mon, qdict_get_str(qdict, "file"));
1564         if (qdict_haskey(qdict, "backing_file")) {
1565             monitor_printf(mon, " backing_file=");
1566             monitor_print_filename(mon, qdict_get_str(qdict, "backing_file"));
1567         }
1568         monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
1569                             qdict_get_bool(qdict, "ro"),
1570                             qdict_get_str(qdict, "drv"),
1571                             qdict_get_bool(qdict, "encrypted"));
1572     } else {
1573         monitor_printf(mon, " [not inserted]");
1574     }
1575 
1576     monitor_printf(mon, "\n");
1577 }
1578 
bdrv_info_print(Monitor * mon,const QObject * data)1579 void bdrv_info_print(Monitor *mon, const QObject *data)
1580 {
1581     qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
1582 }
1583 
bdrv_info(Monitor * mon,QObject ** ret_data)1584 void bdrv_info(Monitor *mon, QObject **ret_data)
1585 {
1586     QList *bs_list;
1587     BlockDriverState *bs;
1588 
1589     bs_list = qlist_new();
1590 
1591     QTAILQ_FOREACH(bs, &bdrv_states, list) {
1592         QObject *bs_obj;
1593         const char *type = "unknown";
1594 
1595         switch(bs->type) {
1596         case BDRV_TYPE_HD:
1597             type = "hd";
1598             break;
1599         case BDRV_TYPE_CDROM:
1600             type = "cdrom";
1601             break;
1602         case BDRV_TYPE_FLOPPY:
1603             type = "floppy";
1604             break;
1605         }
1606 
1607         bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': %s, "
1608                                     "'removable': %i, 'locked': %i }",
1609                                     bs->device_name, type, bs->removable,
1610                                     bs->locked);
1611 
1612         if (bs->drv) {
1613             QObject *obj;
1614             QDict *bs_dict = qobject_to_qdict(bs_obj);
1615 
1616             obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
1617                                      "'encrypted': %i }",
1618                                      bs->filename, bs->read_only,
1619                                      bs->drv->format_name,
1620                                      bdrv_is_encrypted(bs));
1621             if (bs->backing_file[0] != '\0') {
1622                 QDict *qdict = qobject_to_qdict(obj);
1623                 qdict_put(qdict, "backing_file",
1624                           qstring_from_str(bs->backing_file));
1625             }
1626 
1627             qdict_put_obj(bs_dict, "inserted", obj);
1628         }
1629         qlist_append_obj(bs_list, bs_obj);
1630     }
1631 
1632     *ret_data = QOBJECT(bs_list);
1633 }
1634 
bdrv_stats_iter(QObject * data,void * opaque)1635 static void bdrv_stats_iter(QObject *data, void *opaque)
1636 {
1637     QDict *qdict;
1638     Monitor *mon = opaque;
1639 
1640     qdict = qobject_to_qdict(data);
1641     monitor_printf(mon, "%s:", qdict_get_str(qdict, "device"));
1642 
1643     qdict = qobject_to_qdict(qdict_get(qdict, "stats"));
1644     monitor_printf(mon, " rd_bytes=%" PRId64
1645                         " wr_bytes=%" PRId64
1646                         " rd_operations=%" PRId64
1647                         " wr_operations=%" PRId64
1648                         "\n",
1649                         qdict_get_int(qdict, "rd_bytes"),
1650                         qdict_get_int(qdict, "wr_bytes"),
1651                         qdict_get_int(qdict, "rd_operations"),
1652                         qdict_get_int(qdict, "wr_operations"));
1653 }
1654 
bdrv_stats_print(Monitor * mon,const QObject * data)1655 void bdrv_stats_print(Monitor *mon, const QObject *data)
1656 {
1657     qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon);
1658 }
1659 
bdrv_info_stats_bs(BlockDriverState * bs)1660 static QObject* bdrv_info_stats_bs(BlockDriverState *bs)
1661 {
1662     QObject *res;
1663     QDict *dict;
1664 
1665     res = qobject_from_jsonf("{ 'stats': {"
1666                              "'rd_bytes': %" PRId64 ","
1667                              "'wr_bytes': %" PRId64 ","
1668                              "'rd_operations': %" PRId64 ","
1669                              "'wr_operations': %" PRId64 ","
1670                              "'wr_highest_offset': %" PRId64
1671                              "} }",
1672                              bs->rd_bytes, bs->wr_bytes,
1673                              bs->rd_ops, bs->wr_ops,
1674                              bs->wr_highest_sector *
1675                              (uint64_t)BDRV_SECTOR_SIZE);
1676     dict  = qobject_to_qdict(res);
1677 
1678     if (*bs->device_name) {
1679         qdict_put(dict, "device", qstring_from_str(bs->device_name));
1680     }
1681 
1682     if (bs->file) {
1683         QObject *parent = bdrv_info_stats_bs(bs->file);
1684         qdict_put_obj(dict, "parent", parent);
1685     }
1686 
1687     return res;
1688 }
1689 
bdrv_info_stats(Monitor * mon,QObject ** ret_data)1690 void bdrv_info_stats(Monitor *mon, QObject **ret_data)
1691 {
1692     QObject *obj;
1693     QList *devices;
1694     BlockDriverState *bs;
1695 
1696     devices = qlist_new();
1697 
1698     QTAILQ_FOREACH(bs, &bdrv_states, list) {
1699         obj = bdrv_info_stats_bs(bs);
1700         qlist_append_obj(devices, obj);
1701     }
1702 
1703     *ret_data = QOBJECT(devices);
1704 }
1705 
bdrv_get_encrypted_filename(BlockDriverState * bs)1706 const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
1707 {
1708     if (bs->backing_hd && bs->backing_hd->encrypted)
1709         return bs->backing_file;
1710     else if (bs->encrypted)
1711         return bs->filename;
1712     else
1713         return NULL;
1714 }
1715 
bdrv_get_backing_filename(BlockDriverState * bs,char * filename,int filename_size)1716 void bdrv_get_backing_filename(BlockDriverState *bs,
1717                                char *filename, int filename_size)
1718 {
1719     if (!bs->backing_file) {
1720         pstrcpy(filename, filename_size, "");
1721     } else {
1722         pstrcpy(filename, filename_size, bs->backing_file);
1723     }
1724 }
1725 
bdrv_write_compressed(BlockDriverState * bs,int64_t sector_num,const uint8_t * buf,int nb_sectors)1726 int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
1727                           const uint8_t *buf, int nb_sectors)
1728 {
1729     BlockDriver *drv = bs->drv;
1730     if (!drv)
1731         return -ENOMEDIUM;
1732     if (!drv->bdrv_write_compressed)
1733         return -ENOTSUP;
1734     if (bdrv_check_request(bs, sector_num, nb_sectors))
1735         return -EIO;
1736 
1737     if (bs->dirty_bitmap) {
1738         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
1739     }
1740 
1741     return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
1742 }
1743 
bdrv_get_info(BlockDriverState * bs,BlockDriverInfo * bdi)1744 int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
1745 {
1746     BlockDriver *drv = bs->drv;
1747     if (!drv)
1748         return -ENOMEDIUM;
1749     if (!drv->bdrv_get_info)
1750         return -ENOTSUP;
1751     memset(bdi, 0, sizeof(*bdi));
1752     return drv->bdrv_get_info(bs, bdi);
1753 }
1754 
bdrv_save_vmstate(BlockDriverState * bs,const uint8_t * buf,int64_t pos,int size)1755 int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
1756                       int64_t pos, int size)
1757 {
1758     BlockDriver *drv = bs->drv;
1759     if (!drv)
1760         return -ENOMEDIUM;
1761     if (drv->bdrv_save_vmstate)
1762         return drv->bdrv_save_vmstate(bs, buf, pos, size);
1763     if (bs->file)
1764         return bdrv_save_vmstate(bs->file, buf, pos, size);
1765     return -ENOTSUP;
1766 }
1767 
bdrv_load_vmstate(BlockDriverState * bs,uint8_t * buf,int64_t pos,int size)1768 int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
1769                       int64_t pos, int size)
1770 {
1771     BlockDriver *drv = bs->drv;
1772     if (!drv)
1773         return -ENOMEDIUM;
1774     if (drv->bdrv_load_vmstate)
1775         return drv->bdrv_load_vmstate(bs, buf, pos, size);
1776     if (bs->file)
1777         return bdrv_load_vmstate(bs->file, buf, pos, size);
1778     return -ENOTSUP;
1779 }
1780 
bdrv_debug_event(BlockDriverState * bs,BlkDebugEvent event)1781 void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
1782 {
1783     BlockDriver *drv = bs->drv;
1784 
1785     if (!drv || !drv->bdrv_debug_event) {
1786         return;
1787     }
1788 
1789     return drv->bdrv_debug_event(bs, event);
1790 
1791 }
1792 
1793 /**************************************************************/
1794 /* handling of snapshots */
1795 
bdrv_can_snapshot(BlockDriverState * bs)1796 int bdrv_can_snapshot(BlockDriverState *bs)
1797 {
1798     BlockDriver *drv = bs->drv;
1799     if (!drv || bdrv_is_removable(bs) || bdrv_is_read_only(bs)) {
1800         return 0;
1801     }
1802 
1803     if (!drv->bdrv_snapshot_create) {
1804         if (bs->file != NULL) {
1805             return bdrv_can_snapshot(bs->file);
1806         }
1807         return 0;
1808     }
1809 
1810     return 1;
1811 }
1812 
bdrv_is_snapshot(BlockDriverState * bs)1813 int bdrv_is_snapshot(BlockDriverState *bs)
1814 {
1815     return !!(bs->open_flags & BDRV_O_SNAPSHOT);
1816 }
1817 
bdrv_snapshots(void)1818 BlockDriverState *bdrv_snapshots(void)
1819 {
1820     BlockDriverState *bs;
1821 
1822     if (bs_snapshots) {
1823         return bs_snapshots;
1824     }
1825 
1826     bs = NULL;
1827     while ((bs = bdrv_next(bs))) {
1828         if (bdrv_can_snapshot(bs)) {
1829             bs_snapshots = bs;
1830             return bs;
1831         }
1832     }
1833     return NULL;
1834 }
1835 
bdrv_snapshot_create(BlockDriverState * bs,QEMUSnapshotInfo * sn_info)1836 int bdrv_snapshot_create(BlockDriverState *bs,
1837                          QEMUSnapshotInfo *sn_info)
1838 {
1839     BlockDriver *drv = bs->drv;
1840     if (!drv)
1841         return -ENOMEDIUM;
1842     if (drv->bdrv_snapshot_create)
1843         return drv->bdrv_snapshot_create(bs, sn_info);
1844     if (bs->file)
1845         return bdrv_snapshot_create(bs->file, sn_info);
1846     return -ENOTSUP;
1847 }
1848 
bdrv_snapshot_goto(BlockDriverState * bs,const char * snapshot_id)1849 int bdrv_snapshot_goto(BlockDriverState *bs,
1850                        const char *snapshot_id)
1851 {
1852     BlockDriver *drv = bs->drv;
1853     int ret, open_ret;
1854 
1855     if (!drv)
1856         return -ENOMEDIUM;
1857     if (drv->bdrv_snapshot_goto)
1858         return drv->bdrv_snapshot_goto(bs, snapshot_id);
1859 
1860     if (bs->file) {
1861         drv->bdrv_close(bs);
1862         ret = bdrv_snapshot_goto(bs->file, snapshot_id);
1863         open_ret = drv->bdrv_open(bs, bs->open_flags);
1864         if (open_ret < 0) {
1865             bdrv_delete(bs->file);
1866             bs->drv = NULL;
1867             return open_ret;
1868         }
1869         return ret;
1870     }
1871 
1872     return -ENOTSUP;
1873 }
1874 
bdrv_snapshot_delete(BlockDriverState * bs,const char * snapshot_id)1875 int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
1876 {
1877     BlockDriver *drv = bs->drv;
1878     if (!drv)
1879         return -ENOMEDIUM;
1880     if (drv->bdrv_snapshot_delete)
1881         return drv->bdrv_snapshot_delete(bs, snapshot_id);
1882     if (bs->file)
1883         return bdrv_snapshot_delete(bs->file, snapshot_id);
1884     return -ENOTSUP;
1885 }
1886 
bdrv_snapshot_list(BlockDriverState * bs,QEMUSnapshotInfo ** psn_info)1887 int bdrv_snapshot_list(BlockDriverState *bs,
1888                        QEMUSnapshotInfo **psn_info)
1889 {
1890     BlockDriver *drv = bs->drv;
1891     if (!drv)
1892         return -ENOMEDIUM;
1893     if (drv->bdrv_snapshot_list)
1894         return drv->bdrv_snapshot_list(bs, psn_info);
1895     if (bs->file)
1896         return bdrv_snapshot_list(bs->file, psn_info);
1897     return -ENOTSUP;
1898 }
1899 
1900 #define NB_SUFFIXES 4
1901 
get_human_readable_size(char * buf,int buf_size,int64_t size)1902 char *get_human_readable_size(char *buf, int buf_size, int64_t size)
1903 {
1904     static const char suffixes[NB_SUFFIXES] = "KMGT";
1905     int64_t base;
1906     int i;
1907 
1908     if (size <= 999) {
1909         snprintf(buf, buf_size, "%" PRId64, size);
1910     } else {
1911         base = 1024;
1912         for(i = 0; i < NB_SUFFIXES; i++) {
1913             if (size < (10 * base)) {
1914                 snprintf(buf, buf_size, "%0.1f%c",
1915                          (double)size / base,
1916                          suffixes[i]);
1917                 break;
1918             } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
1919                 snprintf(buf, buf_size, "%" PRId64 "%c",
1920                          ((size + (base >> 1)) / base),
1921                          suffixes[i]);
1922                 break;
1923             }
1924             base = base * 1024;
1925         }
1926     }
1927     return buf;
1928 }
1929 
bdrv_snapshot_dump(char * buf,int buf_size,QEMUSnapshotInfo * sn)1930 char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
1931 {
1932     char buf1[128], date_buf[128], clock_buf[128];
1933 #ifdef _WIN32
1934     struct tm *ptm;
1935 #else
1936     struct tm tm;
1937 #endif
1938     time_t ti;
1939     int64_t secs;
1940 
1941     if (!sn) {
1942         snprintf(buf, buf_size,
1943                  "%-10s%-20s%7s%20s%15s",
1944                  "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
1945     } else {
1946         ti = sn->date_sec;
1947 #ifdef _WIN32
1948         ptm = localtime(&ti);
1949         strftime(date_buf, sizeof(date_buf),
1950                  "%Y-%m-%d %H:%M:%S", ptm);
1951 #else
1952         localtime_r(&ti, &tm);
1953         strftime(date_buf, sizeof(date_buf),
1954                  "%Y-%m-%d %H:%M:%S", &tm);
1955 #endif
1956         secs = sn->vm_clock_nsec / 1000000000;
1957         snprintf(clock_buf, sizeof(clock_buf),
1958                  "%02d:%02d:%02d.%03d",
1959                  (int)(secs / 3600),
1960                  (int)((secs / 60) % 60),
1961                  (int)(secs % 60),
1962                  (int)((sn->vm_clock_nsec / 1000000) % 1000));
1963         snprintf(buf, buf_size,
1964                  "%-10s%-20s%7s%20s%15s",
1965                  sn->id_str, sn->name,
1966                  get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
1967                  date_buf,
1968                  clock_buf);
1969     }
1970     return buf;
1971 }
1972 
1973 
1974 /**************************************************************/
1975 /* async I/Os */
1976 
bdrv_aio_readv(BlockDriverState * bs,int64_t sector_num,QEMUIOVector * qiov,int nb_sectors,BlockDriverCompletionFunc * cb,void * opaque)1977 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
1978                                  QEMUIOVector *qiov, int nb_sectors,
1979                                  BlockDriverCompletionFunc *cb, void *opaque)
1980 {
1981     BlockDriver *drv = bs->drv;
1982     BlockDriverAIOCB *ret;
1983 
1984     if (!drv)
1985         return NULL;
1986     if (bdrv_check_request(bs, sector_num, nb_sectors))
1987         return NULL;
1988 
1989     ret = drv->bdrv_aio_readv(bs, sector_num, qiov, nb_sectors,
1990                               cb, opaque);
1991 
1992     if (ret) {
1993 	/* Update stats even though technically transfer has not happened. */
1994 	bs->rd_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
1995 	bs->rd_ops ++;
1996     }
1997 
1998     return ret;
1999 }
2000 
bdrv_aio_writev(BlockDriverState * bs,int64_t sector_num,QEMUIOVector * qiov,int nb_sectors,BlockDriverCompletionFunc * cb,void * opaque)2001 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2002                                   QEMUIOVector *qiov, int nb_sectors,
2003                                   BlockDriverCompletionFunc *cb, void *opaque)
2004 {
2005     BlockDriver *drv = bs->drv;
2006     BlockDriverAIOCB *ret;
2007 
2008     if (!drv)
2009         return NULL;
2010     if (bs->read_only)
2011         return NULL;
2012     if (bdrv_check_request(bs, sector_num, nb_sectors))
2013         return NULL;
2014 
2015     if (bs->dirty_bitmap) {
2016         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
2017     }
2018 
2019     ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
2020                                cb, opaque);
2021 
2022     if (ret) {
2023         /* Update stats even though technically transfer has not happened. */
2024         bs->wr_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
2025         bs->wr_ops ++;
2026         if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
2027             bs->wr_highest_sector = sector_num + nb_sectors - 1;
2028         }
2029     }
2030 
2031     return ret;
2032 }
2033 
2034 
2035 typedef struct MultiwriteCB {
2036     int error;
2037     int num_requests;
2038     int num_callbacks;
2039     struct {
2040         BlockDriverCompletionFunc *cb;
2041         void *opaque;
2042         QEMUIOVector *free_qiov;
2043         void *free_buf;
2044     } callbacks[];
2045 } MultiwriteCB;
2046 
multiwrite_user_cb(MultiwriteCB * mcb)2047 static void multiwrite_user_cb(MultiwriteCB *mcb)
2048 {
2049     int i;
2050 
2051     for (i = 0; i < mcb->num_callbacks; i++) {
2052         mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
2053         if (mcb->callbacks[i].free_qiov) {
2054             qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
2055         }
2056         qemu_free(mcb->callbacks[i].free_qiov);
2057         qemu_vfree(mcb->callbacks[i].free_buf);
2058     }
2059 }
2060 
multiwrite_cb(void * opaque,int ret)2061 static void multiwrite_cb(void *opaque, int ret)
2062 {
2063     MultiwriteCB *mcb = opaque;
2064 
2065     if (ret < 0 && !mcb->error) {
2066         mcb->error = ret;
2067     }
2068 
2069     mcb->num_requests--;
2070     if (mcb->num_requests == 0) {
2071         multiwrite_user_cb(mcb);
2072         qemu_free(mcb);
2073     }
2074 }
2075 
multiwrite_req_compare(const void * a,const void * b)2076 static int multiwrite_req_compare(const void *a, const void *b)
2077 {
2078     const BlockRequest *req1 = a, *req2 = b;
2079 
2080     /*
2081      * Note that we can't simply subtract req2->sector from req1->sector
2082      * here as that could overflow the return value.
2083      */
2084     if (req1->sector > req2->sector) {
2085         return 1;
2086     } else if (req1->sector < req2->sector) {
2087         return -1;
2088     } else {
2089         return 0;
2090     }
2091 }
2092 
2093 /*
2094  * Takes a bunch of requests and tries to merge them. Returns the number of
2095  * requests that remain after merging.
2096  */
multiwrite_merge(BlockDriverState * bs,BlockRequest * reqs,int num_reqs,MultiwriteCB * mcb)2097 static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
2098     int num_reqs, MultiwriteCB *mcb)
2099 {
2100     int i, outidx;
2101 
2102     // Sort requests by start sector
2103     qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
2104 
2105     // Check if adjacent requests touch the same clusters. If so, combine them,
2106     // filling up gaps with zero sectors.
2107     outidx = 0;
2108     for (i = 1; i < num_reqs; i++) {
2109         int merge = 0;
2110         int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
2111 
2112         // This handles the cases that are valid for all block drivers, namely
2113         // exactly sequential writes and overlapping writes.
2114         if (reqs[i].sector <= oldreq_last) {
2115             merge = 1;
2116         }
2117 
2118         // The block driver may decide that it makes sense to combine requests
2119         // even if there is a gap of some sectors between them. In this case,
2120         // the gap is filled with zeros (therefore only applicable for yet
2121         // unused space in format like qcow2).
2122         if (!merge && bs->drv->bdrv_merge_requests) {
2123             merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
2124         }
2125 
2126         if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
2127             merge = 0;
2128         }
2129 
2130         if (merge) {
2131             size_t size;
2132             QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));
2133             qemu_iovec_init(qiov,
2134                 reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
2135 
2136             // Add the first request to the merged one. If the requests are
2137             // overlapping, drop the last sectors of the first request.
2138             size = (reqs[i].sector - reqs[outidx].sector) << 9;
2139             qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
2140 
2141             // We might need to add some zeros between the two requests
2142             if (reqs[i].sector > oldreq_last) {
2143                 size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
2144                 uint8_t *buf = qemu_blockalign(bs, zero_bytes);
2145                 memset(buf, 0, zero_bytes);
2146                 qemu_iovec_add(qiov, buf, zero_bytes);
2147                 mcb->callbacks[i].free_buf = buf;
2148             }
2149 
2150             // Add the second request
2151             qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
2152 
2153             reqs[outidx].nb_sectors = qiov->size >> 9;
2154             reqs[outidx].qiov = qiov;
2155 
2156             mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
2157         } else {
2158             outidx++;
2159             reqs[outidx].sector     = reqs[i].sector;
2160             reqs[outidx].nb_sectors = reqs[i].nb_sectors;
2161             reqs[outidx].qiov       = reqs[i].qiov;
2162         }
2163     }
2164 
2165     return outidx + 1;
2166 }
2167 
2168 /*
2169  * Submit multiple AIO write requests at once.
2170  *
2171  * On success, the function returns 0 and all requests in the reqs array have
2172  * been submitted. In error case this function returns -1, and any of the
2173  * requests may or may not be submitted yet. In particular, this means that the
2174  * callback will be called for some of the requests, for others it won't. The
2175  * caller must check the error field of the BlockRequest to wait for the right
2176  * callbacks (if error != 0, no callback will be called).
2177  *
2178  * The implementation may modify the contents of the reqs array, e.g. to merge
2179  * requests. However, the fields opaque and error are left unmodified as they
2180  * are used to signal failure for a single request to the caller.
2181  */
bdrv_aio_multiwrite(BlockDriverState * bs,BlockRequest * reqs,int num_reqs)2182 int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
2183 {
2184     BlockDriverAIOCB *acb;
2185     MultiwriteCB *mcb;
2186     int i;
2187 
2188     if (num_reqs == 0) {
2189         return 0;
2190     }
2191 
2192     // Create MultiwriteCB structure
2193     mcb = qemu_mallocz(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
2194     mcb->num_requests = 0;
2195     mcb->num_callbacks = num_reqs;
2196 
2197     for (i = 0; i < num_reqs; i++) {
2198         mcb->callbacks[i].cb = reqs[i].cb;
2199         mcb->callbacks[i].opaque = reqs[i].opaque;
2200     }
2201 
2202     // Check for mergable requests
2203     num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
2204 
2205     /*
2206      * Run the aio requests. As soon as one request can't be submitted
2207      * successfully, fail all requests that are not yet submitted (we must
2208      * return failure for all requests anyway)
2209      *
2210      * num_requests cannot be set to the right value immediately: If
2211      * bdrv_aio_writev fails for some request, num_requests would be too high
2212      * and therefore multiwrite_cb() would never recognize the multiwrite
2213      * request as completed. We also cannot use the loop variable i to set it
2214      * when the first request fails because the callback may already have been
2215      * called for previously submitted requests. Thus, num_requests must be
2216      * incremented for each request that is submitted.
2217      *
2218      * The problem that callbacks may be called early also means that we need
2219      * to take care that num_requests doesn't become 0 before all requests are
2220      * submitted - multiwrite_cb() would consider the multiwrite request
2221      * completed. A dummy request that is "completed" by a manual call to
2222      * multiwrite_cb() takes care of this.
2223      */
2224     mcb->num_requests = 1;
2225 
2226     for (i = 0; i < num_reqs; i++) {
2227         mcb->num_requests++;
2228         acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
2229             reqs[i].nb_sectors, multiwrite_cb, mcb);
2230 
2231         if (acb == NULL) {
2232             // We can only fail the whole thing if no request has been
2233             // submitted yet. Otherwise we'll wait for the submitted AIOs to
2234             // complete and report the error in the callback.
2235             if (i == 0) {
2236                 goto fail;
2237             } else {
2238                 multiwrite_cb(mcb, -EIO);
2239                 break;
2240             }
2241         }
2242     }
2243 
2244     /* Complete the dummy request */
2245     multiwrite_cb(mcb, 0);
2246 
2247     return 0;
2248 
2249 fail:
2250     for (i = 0; i < mcb->num_callbacks; i++) {
2251         reqs[i].error = -EIO;
2252     }
2253     qemu_free(mcb);
2254     return -1;
2255 }
2256 
bdrv_aio_flush(BlockDriverState * bs,BlockDriverCompletionFunc * cb,void * opaque)2257 BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
2258         BlockDriverCompletionFunc *cb, void *opaque)
2259 {
2260     BlockDriver *drv = bs->drv;
2261 
2262     if (bs->open_flags & BDRV_O_NO_FLUSH) {
2263         return bdrv_aio_noop_em(bs, cb, opaque);
2264     }
2265 
2266     if (!drv)
2267         return NULL;
2268     return drv->bdrv_aio_flush(bs, cb, opaque);
2269 }
2270 
bdrv_aio_cancel(BlockDriverAIOCB * acb)2271 void bdrv_aio_cancel(BlockDriverAIOCB *acb)
2272 {
2273     acb->pool->cancel(acb);
2274 }
2275 
2276 
2277 /**************************************************************/
2278 /* async block device emulation */
2279 
2280 typedef struct BlockDriverAIOCBSync {
2281     BlockDriverAIOCB common;
2282     QEMUBH *bh;
2283     int ret;
2284     /* vector translation state */
2285     QEMUIOVector *qiov;
2286     uint8_t *bounce;
2287     int is_write;
2288 } BlockDriverAIOCBSync;
2289 
bdrv_aio_cancel_em(BlockDriverAIOCB * blockacb)2290 static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
2291 {
2292     BlockDriverAIOCBSync *acb =
2293         container_of(blockacb, BlockDriverAIOCBSync, common);
2294     qemu_bh_delete(acb->bh);
2295     acb->bh = NULL;
2296     qemu_aio_release(acb);
2297 }
2298 
2299 static AIOPool bdrv_em_aio_pool = {
2300     .aiocb_size         = sizeof(BlockDriverAIOCBSync),
2301     .cancel             = bdrv_aio_cancel_em,
2302 };
2303 
bdrv_aio_bh_cb(void * opaque)2304 static void bdrv_aio_bh_cb(void *opaque)
2305 {
2306     BlockDriverAIOCBSync *acb = opaque;
2307 
2308     if (!acb->is_write)
2309         qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
2310     qemu_vfree(acb->bounce);
2311     acb->common.cb(acb->common.opaque, acb->ret);
2312     qemu_bh_delete(acb->bh);
2313     acb->bh = NULL;
2314     qemu_aio_release(acb);
2315 }
2316 
bdrv_aio_rw_vector(BlockDriverState * bs,int64_t sector_num,QEMUIOVector * qiov,int nb_sectors,BlockDriverCompletionFunc * cb,void * opaque,int is_write)2317 static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
2318                                             int64_t sector_num,
2319                                             QEMUIOVector *qiov,
2320                                             int nb_sectors,
2321                                             BlockDriverCompletionFunc *cb,
2322                                             void *opaque,
2323                                             int is_write)
2324 
2325 {
2326     BlockDriverAIOCBSync *acb;
2327 
2328     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2329     acb->is_write = is_write;
2330     acb->qiov = qiov;
2331     acb->bounce = qemu_blockalign(bs, qiov->size);
2332 
2333     if (!acb->bh)
2334         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2335 
2336     if (is_write) {
2337         qemu_iovec_to_buffer(acb->qiov, acb->bounce);
2338         acb->ret = bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
2339     } else {
2340         acb->ret = bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
2341     }
2342 
2343     qemu_bh_schedule(acb->bh);
2344 
2345     return &acb->common;
2346 }
2347 
bdrv_aio_readv_em(BlockDriverState * bs,int64_t sector_num,QEMUIOVector * qiov,int nb_sectors,BlockDriverCompletionFunc * cb,void * opaque)2348 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
2349         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2350         BlockDriverCompletionFunc *cb, void *opaque)
2351 {
2352     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
2353 }
2354 
bdrv_aio_writev_em(BlockDriverState * bs,int64_t sector_num,QEMUIOVector * qiov,int nb_sectors,BlockDriverCompletionFunc * cb,void * opaque)2355 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
2356         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
2357         BlockDriverCompletionFunc *cb, void *opaque)
2358 {
2359     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
2360 }
2361 
bdrv_aio_flush_em(BlockDriverState * bs,BlockDriverCompletionFunc * cb,void * opaque)2362 static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
2363         BlockDriverCompletionFunc *cb, void *opaque)
2364 {
2365     BlockDriverAIOCBSync *acb;
2366 
2367     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2368     acb->is_write = 1; /* don't bounce in the completion hadler */
2369     acb->qiov = NULL;
2370     acb->bounce = NULL;
2371     acb->ret = 0;
2372 
2373     if (!acb->bh)
2374         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2375 
2376     bdrv_flush(bs);
2377     qemu_bh_schedule(acb->bh);
2378     return &acb->common;
2379 }
2380 
bdrv_aio_noop_em(BlockDriverState * bs,BlockDriverCompletionFunc * cb,void * opaque)2381 static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
2382         BlockDriverCompletionFunc *cb, void *opaque)
2383 {
2384     BlockDriverAIOCBSync *acb;
2385 
2386     acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
2387     acb->is_write = 1; /* don't bounce in the completion handler */
2388     acb->qiov = NULL;
2389     acb->bounce = NULL;
2390     acb->ret = 0;
2391 
2392     if (!acb->bh) {
2393         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
2394     }
2395 
2396     qemu_bh_schedule(acb->bh);
2397     return &acb->common;
2398 }
2399 
2400 /**************************************************************/
2401 /* sync block device emulation */
2402 
bdrv_rw_em_cb(void * opaque,int ret)2403 static void bdrv_rw_em_cb(void *opaque, int ret)
2404 {
2405     *(int *)opaque = ret;
2406 }
2407 
2408 #define NOT_DONE 0x7fffffff
2409 
bdrv_read_em(BlockDriverState * bs,int64_t sector_num,uint8_t * buf,int nb_sectors)2410 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
2411                         uint8_t *buf, int nb_sectors)
2412 {
2413     int async_ret;
2414     BlockDriverAIOCB *acb;
2415     struct iovec iov;
2416     QEMUIOVector qiov;
2417 
2418     async_context_push();
2419 
2420     async_ret = NOT_DONE;
2421     iov.iov_base = (void *)buf;
2422     iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
2423     qemu_iovec_init_external(&qiov, &iov, 1);
2424     acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
2425         bdrv_rw_em_cb, &async_ret);
2426     if (acb == NULL) {
2427         async_ret = -1;
2428         goto fail;
2429     }
2430 
2431     while (async_ret == NOT_DONE) {
2432         qemu_aio_wait();
2433     }
2434 
2435 
2436 fail:
2437     async_context_pop();
2438     return async_ret;
2439 }
2440 
bdrv_write_em(BlockDriverState * bs,int64_t sector_num,const uint8_t * buf,int nb_sectors)2441 static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
2442                          const uint8_t *buf, int nb_sectors)
2443 {
2444     int async_ret;
2445     BlockDriverAIOCB *acb;
2446     struct iovec iov;
2447     QEMUIOVector qiov;
2448 
2449     async_context_push();
2450 
2451     async_ret = NOT_DONE;
2452     iov.iov_base = (void *)buf;
2453     iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
2454     qemu_iovec_init_external(&qiov, &iov, 1);
2455     acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
2456         bdrv_rw_em_cb, &async_ret);
2457     if (acb == NULL) {
2458         async_ret = -1;
2459         goto fail;
2460     }
2461     while (async_ret == NOT_DONE) {
2462         qemu_aio_wait();
2463     }
2464 
2465 fail:
2466     async_context_pop();
2467     return async_ret;
2468 }
2469 
bdrv_init(void)2470 void bdrv_init(void)
2471 {
2472     module_call_init(MODULE_INIT_BLOCK);
2473 }
2474 
bdrv_init_with_whitelist(void)2475 void bdrv_init_with_whitelist(void)
2476 {
2477     use_bdrv_whitelist = 1;
2478     bdrv_init();
2479 }
2480 
qemu_aio_get(AIOPool * pool,BlockDriverState * bs,BlockDriverCompletionFunc * cb,void * opaque)2481 void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
2482                    BlockDriverCompletionFunc *cb, void *opaque)
2483 {
2484     BlockDriverAIOCB *acb;
2485 
2486     if (pool->free_aiocb) {
2487         acb = pool->free_aiocb;
2488         pool->free_aiocb = acb->next;
2489     } else {
2490         acb = qemu_mallocz(pool->aiocb_size);
2491         acb->pool = pool;
2492     }
2493     acb->bs = bs;
2494     acb->cb = cb;
2495     acb->opaque = opaque;
2496     return acb;
2497 }
2498 
qemu_aio_release(void * p)2499 void qemu_aio_release(void *p)
2500 {
2501     BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
2502     AIOPool *pool = acb->pool;
2503     acb->next = pool->free_aiocb;
2504     pool->free_aiocb = acb;
2505 }
2506 
2507 /**************************************************************/
2508 /* removable device support */
2509 
2510 /**
2511  * Return TRUE if the media is present
2512  */
bdrv_is_inserted(BlockDriverState * bs)2513 int bdrv_is_inserted(BlockDriverState *bs)
2514 {
2515     BlockDriver *drv = bs->drv;
2516     int ret;
2517     if (!drv)
2518         return 0;
2519     if (!drv->bdrv_is_inserted)
2520         return !bs->tray_open;
2521     ret = drv->bdrv_is_inserted(bs);
2522     return ret;
2523 }
2524 
2525 /**
2526  * Return TRUE if the media changed since the last call to this
2527  * function. It is currently only used for floppy disks
2528  */
bdrv_media_changed(BlockDriverState * bs)2529 int bdrv_media_changed(BlockDriverState *bs)
2530 {
2531     BlockDriver *drv = bs->drv;
2532     int ret;
2533 
2534     if (!drv || !drv->bdrv_media_changed)
2535         ret = -ENOTSUP;
2536     else
2537         ret = drv->bdrv_media_changed(bs);
2538     if (ret == -ENOTSUP)
2539         ret = bs->media_changed;
2540     bs->media_changed = 0;
2541     return ret;
2542 }
2543 
2544 /**
2545  * If eject_flag is TRUE, eject the media. Otherwise, close the tray
2546  */
bdrv_eject(BlockDriverState * bs,int eject_flag)2547 int bdrv_eject(BlockDriverState *bs, int eject_flag)
2548 {
2549     BlockDriver *drv = bs->drv;
2550     int ret;
2551 
2552     if (bs->locked) {
2553         return -EBUSY;
2554     }
2555 
2556     if (!drv || !drv->bdrv_eject) {
2557         ret = -ENOTSUP;
2558     } else {
2559         ret = drv->bdrv_eject(bs, eject_flag);
2560     }
2561     if (ret == -ENOTSUP) {
2562         ret = 0;
2563     }
2564     if (ret >= 0) {
2565         bs->tray_open = eject_flag;
2566     }
2567 
2568     return ret;
2569 }
2570 
bdrv_is_locked(BlockDriverState * bs)2571 int bdrv_is_locked(BlockDriverState *bs)
2572 {
2573     return bs->locked;
2574 }
2575 
2576 /**
2577  * Lock or unlock the media (if it is locked, the user won't be able
2578  * to eject it manually).
2579  */
bdrv_set_locked(BlockDriverState * bs,int locked)2580 void bdrv_set_locked(BlockDriverState *bs, int locked)
2581 {
2582     BlockDriver *drv = bs->drv;
2583 
2584     bs->locked = locked;
2585     if (drv && drv->bdrv_set_locked) {
2586         drv->bdrv_set_locked(bs, locked);
2587     }
2588 }
2589 
2590 /* needed for generic scsi interface */
2591 
bdrv_ioctl(BlockDriverState * bs,unsigned long int req,void * buf)2592 int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
2593 {
2594     BlockDriver *drv = bs->drv;
2595 
2596     if (drv && drv->bdrv_ioctl)
2597         return drv->bdrv_ioctl(bs, req, buf);
2598     return -ENOTSUP;
2599 }
2600 
bdrv_aio_ioctl(BlockDriverState * bs,unsigned long int req,void * buf,BlockDriverCompletionFunc * cb,void * opaque)2601 BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
2602         unsigned long int req, void *buf,
2603         BlockDriverCompletionFunc *cb, void *opaque)
2604 {
2605     BlockDriver *drv = bs->drv;
2606 
2607     if (drv && drv->bdrv_aio_ioctl)
2608         return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
2609     return NULL;
2610 }
2611 
2612 
2613 
qemu_blockalign(BlockDriverState * bs,size_t size)2614 void *qemu_blockalign(BlockDriverState *bs, size_t size)
2615 {
2616     return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
2617 }
2618 
bdrv_set_dirty_tracking(BlockDriverState * bs,int enable)2619 void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
2620 {
2621     int64_t bitmap_size;
2622 
2623     bs->dirty_count = 0;
2624     if (enable) {
2625         if (!bs->dirty_bitmap) {
2626             bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
2627                     BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
2628             bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
2629 
2630             bs->dirty_bitmap = qemu_mallocz(bitmap_size);
2631         }
2632     } else {
2633         if (bs->dirty_bitmap) {
2634             qemu_free(bs->dirty_bitmap);
2635             bs->dirty_bitmap = NULL;
2636         }
2637     }
2638 }
2639 
bdrv_get_dirty(BlockDriverState * bs,int64_t sector)2640 int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
2641 {
2642     int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
2643 
2644     if (bs->dirty_bitmap &&
2645         (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
2646         return bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
2647             (1 << (chunk % (sizeof(unsigned long) * 8)));
2648     } else {
2649         return 0;
2650     }
2651 }
2652 
bdrv_reset_dirty(BlockDriverState * bs,int64_t cur_sector,int nr_sectors)2653 void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
2654                       int nr_sectors)
2655 {
2656     set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
2657 }
2658 
bdrv_get_dirty_count(BlockDriverState * bs)2659 int64_t bdrv_get_dirty_count(BlockDriverState *bs)
2660 {
2661     return bs->dirty_count;
2662 }
2663