1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "qemu/osdep.h"
25#include "block/trace.h"
26#include "block/block_int.h"
27#include "block/blockjob.h"
28#include "block/nbd.h"
29#include "qemu/error-report.h"
30#include "module_block.h"
31#include "qemu/module.h"
32#include "qapi/qmp/qerror.h"
33#include "qapi/qmp/qbool.h"
34#include "qapi/qmp/qjson.h"
35#include "sysemu/block-backend.h"
36#include "sysemu/sysemu.h"
37#include "qemu/notify.h"
38#include "qemu/coroutine.h"
39#include "block/qapi.h"
40#include "qmp-commands.h"
41#include "qemu/timer.h"
42#include "qapi-event.h"
43#include "qemu/cutils.h"
44#include "qemu/id.h"
45
46#ifdef CONFIG_BSD
47#include <sys/ioctl.h>
48#include <sys/queue.h>
49#ifndef __DragonFly__
50#include <sys/disk.h>
51#endif
52#endif
53
54#ifdef _WIN32
55#include <windows.h>
56#endif
57
58#define NOT_DONE 0x7fffffff
59
60static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
61 QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
62
63static QTAILQ_HEAD(, BlockDriverState) all_bdrv_states =
64 QTAILQ_HEAD_INITIALIZER(all_bdrv_states);
65
66static QLIST_HEAD(, BlockDriver) bdrv_drivers =
67 QLIST_HEAD_INITIALIZER(bdrv_drivers);
68
69static BlockDriverState *bdrv_open_inherit(const char *filename,
70 const char *reference,
71 QDict *options, int flags,
72 BlockDriverState *parent,
73 const BdrvChildRole *child_role,
74 Error **errp);
75
76
77static int use_bdrv_whitelist;
78
79#ifdef _WIN32
80static int is_windows_drive_prefix(const char *filename)
81{
82 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
83 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
84 filename[1] == ':');
85}
86
87int is_windows_drive(const char *filename)
88{
89 if (is_windows_drive_prefix(filename) &&
90 filename[2] == '\0')
91 return 1;
92 if (strstart(filename, "\\\\.\\", NULL) ||
93 strstart(filename, "//./", NULL))
94 return 1;
95 return 0;
96}
97#endif
98
99size_t bdrv_opt_mem_align(BlockDriverState *bs)
100{
101 if (!bs || !bs->drv) {
102
103 return MAX(4096, getpagesize());
104 }
105
106 return bs->bl.opt_mem_alignment;
107}
108
109size_t bdrv_min_mem_align(BlockDriverState *bs)
110{
111 if (!bs || !bs->drv) {
112
113 return MAX(4096, getpagesize());
114 }
115
116 return bs->bl.min_mem_alignment;
117}
118
119
120int path_has_protocol(const char *path)
121{
122 const char *p;
123
124#ifdef _WIN32
125 if (is_windows_drive(path) ||
126 is_windows_drive_prefix(path)) {
127 return 0;
128 }
129 p = path + strcspn(path, ":/\\");
130#else
131 p = path + strcspn(path, ":/");
132#endif
133
134 return *p == ':';
135}
136
137int path_is_absolute(const char *path)
138{
139#ifdef _WIN32
140
141 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
142 return 1;
143 }
144 return (*path == '/' || *path == '\\');
145#else
146 return (*path == '/');
147#endif
148}
149
150
151
152
153void path_combine(char *dest, int dest_size,
154 const char *base_path,
155 const char *filename)
156{
157 const char *p, *p1;
158 int len;
159
160 if (dest_size <= 0)
161 return;
162 if (path_is_absolute(filename)) {
163 pstrcpy(dest, dest_size, filename);
164 } else {
165 const char *protocol_stripped = NULL;
166
167 if (path_has_protocol(base_path)) {
168 protocol_stripped = strchr(base_path, ':');
169 if (protocol_stripped) {
170 protocol_stripped++;
171 }
172 }
173 p = protocol_stripped ?: base_path;
174
175 p1 = strrchr(base_path, '/');
176#ifdef _WIN32
177 {
178 const char *p2;
179 p2 = strrchr(base_path, '\\');
180 if (!p1 || p2 > p1)
181 p1 = p2;
182 }
183#endif
184 if (p1)
185 p1++;
186 else
187 p1 = base_path;
188 if (p1 > p)
189 p = p1;
190 len = p - base_path;
191 if (len > dest_size - 1)
192 len = dest_size - 1;
193 memcpy(dest, base_path, len);
194 dest[len] = '\0';
195 pstrcat(dest, dest_size, filename);
196 }
197}
198
199
200
201
202
203
204void bdrv_parse_filename_strip_prefix(const char *filename, const char *prefix,
205 QDict *options)
206{
207 if (strstart(filename, prefix, &filename)) {
208
209
210 if (path_has_protocol(filename)) {
211 QString *fat_filename;
212
213
214
215 assert(!path_is_absolute(filename));
216
217
218
219 fat_filename = qstring_from_str("./");
220 qstring_append(fat_filename, filename);
221
222 assert(!path_has_protocol(qstring_get_str(fat_filename)));
223
224 qdict_put(options, "filename", fat_filename);
225 } else {
226
227
228 qdict_put_str(options, "filename", filename);
229 }
230 }
231}
232
233
234
235
236
237bool bdrv_is_read_only(BlockDriverState *bs)
238{
239 return bs->read_only;
240}
241
242int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
243 bool ignore_allow_rdw, Error **errp)
244{
245
246 if (bs->copy_on_read && read_only) {
247 error_setg(errp, "Can't set node '%s' to r/o with copy-on-read enabled",
248 bdrv_get_device_or_node_name(bs));
249 return -EINVAL;
250 }
251
252
253 if (!read_only && !(bs->open_flags & BDRV_O_ALLOW_RDWR) &&
254 !ignore_allow_rdw)
255 {
256 error_setg(errp, "Node '%s' is read only",
257 bdrv_get_device_or_node_name(bs));
258 return -EPERM;
259 }
260
261 return 0;
262}
263
264
265
266
267
268
269int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
270{
271 int ret = 0;
272
273 ret = bdrv_can_set_read_only(bs, read_only, false, errp);
274 if (ret < 0) {
275 return ret;
276 }
277
278 bs->read_only = read_only;
279 return 0;
280}
281
282void bdrv_get_full_backing_filename_from_filename(const char *backed,
283 const char *backing,
284 char *dest, size_t sz,
285 Error **errp)
286{
287 if (backing[0] == '\0' || path_has_protocol(backing) ||
288 path_is_absolute(backing))
289 {
290 pstrcpy(dest, sz, backing);
291 } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
292 error_setg(errp, "Cannot use relative backing file names for '%s'",
293 backed);
294 } else {
295 path_combine(dest, sz, backed, backing);
296 }
297}
298
299void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
300 Error **errp)
301{
302 char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
303
304 bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
305 dest, sz, errp);
306}
307
308void bdrv_register(BlockDriver *bdrv)
309{
310 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
311}
312
313BlockDriverState *bdrv_new(void)
314{
315 BlockDriverState *bs;
316 int i;
317
318 bs = g_new0(BlockDriverState, 1);
319 QLIST_INIT(&bs->dirty_bitmaps);
320 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
321 QLIST_INIT(&bs->op_blockers[i]);
322 }
323 notifier_with_return_list_init(&bs->before_write_notifiers);
324 qemu_co_mutex_init(&bs->reqs_lock);
325 qemu_mutex_init(&bs->dirty_bitmap_mutex);
326 bs->refcnt = 1;
327 bs->aio_context = qemu_get_aio_context();
328
329 qemu_co_queue_init(&bs->flush_queue);
330
331 QTAILQ_INSERT_TAIL(&all_bdrv_states, bs, bs_list);
332
333 return bs;
334}
335
336static BlockDriver *bdrv_do_find_format(const char *format_name)
337{
338 BlockDriver *drv1;
339
340 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
341 if (!strcmp(drv1->format_name, format_name)) {
342 return drv1;
343 }
344 }
345
346 return NULL;
347}
348
349BlockDriver *bdrv_find_format(const char *format_name)
350{
351 BlockDriver *drv1;
352 int i;
353
354 drv1 = bdrv_do_find_format(format_name);
355 if (drv1) {
356 return drv1;
357 }
358
359
360 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); ++i) {
361 if (!strcmp(block_driver_modules[i].format_name, format_name)) {
362 block_module_load_one(block_driver_modules[i].library_name);
363 break;
364 }
365 }
366
367 return bdrv_do_find_format(format_name);
368}
369
370static int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
371{
372 static const char *whitelist_rw[] = {
373 CONFIG_BDRV_RW_WHITELIST
374 };
375 static const char *whitelist_ro[] = {
376 CONFIG_BDRV_RO_WHITELIST
377 };
378 const char **p;
379
380 if (!whitelist_rw[0] && !whitelist_ro[0]) {
381 return 1;
382 }
383
384 for (p = whitelist_rw; *p; p++) {
385 if (!strcmp(drv->format_name, *p)) {
386 return 1;
387 }
388 }
389 if (read_only) {
390 for (p = whitelist_ro; *p; p++) {
391 if (!strcmp(drv->format_name, *p)) {
392 return 1;
393 }
394 }
395 }
396 return 0;
397}
398
399bool bdrv_uses_whitelist(void)
400{
401 return use_bdrv_whitelist;
402}
403
404typedef struct CreateCo {
405 BlockDriver *drv;
406 char *filename;
407 QemuOpts *opts;
408 int ret;
409 Error *err;
410} CreateCo;
411
412static void coroutine_fn bdrv_create_co_entry(void *opaque)
413{
414 Error *local_err = NULL;
415 int ret;
416
417 CreateCo *cco = opaque;
418 assert(cco->drv);
419
420 ret = cco->drv->bdrv_create(cco->filename, cco->opts, &local_err);
421 error_propagate(&cco->err, local_err);
422 cco->ret = ret;
423}
424
425int bdrv_create(BlockDriver *drv, const char* filename,
426 QemuOpts *opts, Error **errp)
427{
428 int ret;
429
430 Coroutine *co;
431 CreateCo cco = {
432 .drv = drv,
433 .filename = g_strdup(filename),
434 .opts = opts,
435 .ret = NOT_DONE,
436 .err = NULL,
437 };
438
439 if (!drv->bdrv_create) {
440 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name);
441 ret = -ENOTSUP;
442 goto out;
443 }
444
445 if (qemu_in_coroutine()) {
446
447 bdrv_create_co_entry(&cco);
448 } else {
449 co = qemu_coroutine_create(bdrv_create_co_entry, &cco);
450 qemu_coroutine_enter(co);
451 while (cco.ret == NOT_DONE) {
452 aio_poll(qemu_get_aio_context(), true);
453 }
454 }
455
456 ret = cco.ret;
457 if (ret < 0) {
458 if (cco.err) {
459 error_propagate(errp, cco.err);
460 } else {
461 error_setg_errno(errp, -ret, "Could not create image");
462 }
463 }
464
465out:
466 g_free(cco.filename);
467 return ret;
468}
469
470int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
471{
472 BlockDriver *drv;
473 Error *local_err = NULL;
474 int ret;
475
476 drv = bdrv_find_protocol(filename, true, errp);
477 if (drv == NULL) {
478 return -ENOENT;
479 }
480
481 ret = bdrv_create(drv, filename, opts, &local_err);
482 error_propagate(errp, local_err);
483 return ret;
484}
485
486
487
488
489
490
491
492int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
493{
494 BlockDriver *drv = bs->drv;
495
496 if (drv && drv->bdrv_probe_blocksizes) {
497 return drv->bdrv_probe_blocksizes(bs, bsz);
498 } else if (drv && drv->is_filter && bs->file) {
499 return bdrv_probe_blocksizes(bs->file->bs, bsz);
500 }
501
502 return -ENOTSUP;
503}
504
505
506
507
508
509
510
511int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
512{
513 BlockDriver *drv = bs->drv;
514
515 if (drv && drv->bdrv_probe_geometry) {
516 return drv->bdrv_probe_geometry(bs, geo);
517 } else if (drv && drv->is_filter && bs->file) {
518 return bdrv_probe_geometry(bs->file->bs, geo);
519 }
520
521 return -ENOTSUP;
522}
523
524
525
526
527
528int get_tmp_filename(char *filename, int size)
529{
530#ifdef _WIN32
531 char temp_dir[MAX_PATH];
532
533
534 assert(size >= MAX_PATH);
535 return (GetTempPath(MAX_PATH, temp_dir)
536 && GetTempFileName(temp_dir, "qem", 0, filename)
537 ? 0 : -GetLastError());
538#else
539 int fd;
540 const char *tmpdir;
541 tmpdir = getenv("TMPDIR");
542 if (!tmpdir) {
543 tmpdir = "/var/tmp";
544 }
545 if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) {
546 return -EOVERFLOW;
547 }
548 fd = mkstemp(filename);
549 if (fd < 0) {
550 return -errno;
551 }
552 if (close(fd) != 0) {
553 unlink(filename);
554 return -errno;
555 }
556 return 0;
557#endif
558}
559
560
561
562
563
564static BlockDriver *find_hdev_driver(const char *filename)
565{
566 int score_max = 0, score;
567 BlockDriver *drv = NULL, *d;
568
569 QLIST_FOREACH(d, &bdrv_drivers, list) {
570 if (d->bdrv_probe_device) {
571 score = d->bdrv_probe_device(filename);
572 if (score > score_max) {
573 score_max = score;
574 drv = d;
575 }
576 }
577 }
578
579 return drv;
580}
581
582static BlockDriver *bdrv_do_find_protocol(const char *protocol)
583{
584 BlockDriver *drv1;
585
586 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
587 if (drv1->protocol_name && !strcmp(drv1->protocol_name, protocol)) {
588 return drv1;
589 }
590 }
591
592 return NULL;
593}
594
595BlockDriver *bdrv_find_protocol(const char *filename,
596 bool allow_protocol_prefix,
597 Error **errp)
598{
599 BlockDriver *drv1;
600 char protocol[128];
601 int len;
602 const char *p;
603 int i;
604
605
606
607
608
609
610
611
612
613
614 drv1 = find_hdev_driver(filename);
615 if (drv1) {
616 return drv1;
617 }
618
619 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
620 return &bdrv_file;
621 }
622
623 p = strchr(filename, ':');
624 assert(p != NULL);
625 len = p - filename;
626 if (len > sizeof(protocol) - 1)
627 len = sizeof(protocol) - 1;
628 memcpy(protocol, filename, len);
629 protocol[len] = '\0';
630
631 drv1 = bdrv_do_find_protocol(protocol);
632 if (drv1) {
633 return drv1;
634 }
635
636 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); ++i) {
637 if (block_driver_modules[i].protocol_name &&
638 !strcmp(block_driver_modules[i].protocol_name, protocol)) {
639 block_module_load_one(block_driver_modules[i].library_name);
640 break;
641 }
642 }
643
644 drv1 = bdrv_do_find_protocol(protocol);
645 if (!drv1) {
646 error_setg(errp, "Unknown protocol '%s'", protocol);
647 }
648 return drv1;
649}
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
666 const char *filename)
667{
668 int score_max = 0, score;
669 BlockDriver *drv = NULL, *d;
670
671 QLIST_FOREACH(d, &bdrv_drivers, list) {
672 if (d->bdrv_probe) {
673 score = d->bdrv_probe(buf, buf_size, filename);
674 if (score > score_max) {
675 score_max = score;
676 drv = d;
677 }
678 }
679 }
680
681 return drv;
682}
683
684static int find_image_format(BlockBackend *file, const char *filename,
685 BlockDriver **pdrv, Error **errp)
686{
687 BlockDriver *drv;
688 uint8_t buf[BLOCK_PROBE_BUF_SIZE];
689 int ret = 0;
690
691
692 if (blk_is_sg(file) || !blk_is_inserted(file) || blk_getlength(file) == 0) {
693 *pdrv = &bdrv_raw;
694 return ret;
695 }
696
697 ret = blk_pread(file, 0, buf, sizeof(buf));
698 if (ret < 0) {
699 error_setg_errno(errp, -ret, "Could not read image for determining its "
700 "format");
701 *pdrv = NULL;
702 return ret;
703 }
704
705 drv = bdrv_probe_all(buf, ret, filename);
706 if (!drv) {
707 error_setg(errp, "Could not determine image format: No compatible "
708 "driver found");
709 ret = -ENOENT;
710 }
711 *pdrv = drv;
712 return ret;
713}
714
715
716
717
718
719static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
720{
721 BlockDriver *drv = bs->drv;
722
723 if (!drv) {
724 return -ENOMEDIUM;
725 }
726
727
728 if (bdrv_is_sg(bs))
729 return 0;
730
731
732 if (drv->bdrv_getlength) {
733 int64_t length = drv->bdrv_getlength(bs);
734 if (length < 0) {
735 return length;
736 }
737 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
738 }
739
740 bs->total_sectors = hint;
741 return 0;
742}
743
744
745
746
747
748static void bdrv_join_options(BlockDriverState *bs, QDict *options,
749 QDict *old_options)
750{
751 if (bs->drv && bs->drv->bdrv_join_options) {
752 bs->drv->bdrv_join_options(options, old_options);
753 } else {
754 qdict_join(options, old_options, false);
755 }
756}
757
758
759
760
761
762
763int bdrv_parse_discard_flags(const char *mode, int *flags)
764{
765 *flags &= ~BDRV_O_UNMAP;
766
767 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
768
769 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
770 *flags |= BDRV_O_UNMAP;
771 } else {
772 return -1;
773 }
774
775 return 0;
776}
777
778
779
780
781
782
783int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough)
784{
785 *flags &= ~BDRV_O_CACHE_MASK;
786
787 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
788 *writethrough = false;
789 *flags |= BDRV_O_NOCACHE;
790 } else if (!strcmp(mode, "directsync")) {
791 *writethrough = true;
792 *flags |= BDRV_O_NOCACHE;
793 } else if (!strcmp(mode, "writeback")) {
794 *writethrough = false;
795 } else if (!strcmp(mode, "unsafe")) {
796 *writethrough = false;
797 *flags |= BDRV_O_NO_FLUSH;
798 } else if (!strcmp(mode, "writethrough")) {
799 *writethrough = true;
800 } else {
801 return -1;
802 }
803
804 return 0;
805}
806
807static char *bdrv_child_get_parent_desc(BdrvChild *c)
808{
809 BlockDriverState *parent = c->opaque;
810 return g_strdup(bdrv_get_device_or_node_name(parent));
811}
812
813static void bdrv_child_cb_drained_begin(BdrvChild *child)
814{
815 BlockDriverState *bs = child->opaque;
816 bdrv_drained_begin(bs);
817}
818
819static void bdrv_child_cb_drained_end(BdrvChild *child)
820{
821 BlockDriverState *bs = child->opaque;
822 bdrv_drained_end(bs);
823}
824
825static int bdrv_child_cb_inactivate(BdrvChild *child)
826{
827 BlockDriverState *bs = child->opaque;
828 assert(bs->open_flags & BDRV_O_INACTIVE);
829 return 0;
830}
831
832
833
834
835
836
837static void bdrv_temp_snapshot_options(int *child_flags, QDict *child_options,
838 int parent_flags, QDict *parent_options)
839{
840 *child_flags = (parent_flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
841
842
843 qdict_set_default_str(child_options, BDRV_OPT_CACHE_DIRECT, "off");
844 qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
845
846
847 qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
848
849
850
851 *child_flags &= ~BDRV_O_NATIVE_AIO;
852}
853
854
855
856
857
858static void bdrv_inherited_options(int *child_flags, QDict *child_options,
859 int parent_flags, QDict *parent_options)
860{
861 int flags = parent_flags;
862
863
864 flags |= BDRV_O_PROTOCOL;
865
866
867
868 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
869 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
870 qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE);
871
872
873 qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
874
875
876
877
878 qdict_set_default_str(child_options, BDRV_OPT_DISCARD, "unmap");
879
880
881 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ |
882 BDRV_O_NO_IO);
883
884 *child_flags = flags;
885}
886
887const BdrvChildRole child_file = {
888 .get_parent_desc = bdrv_child_get_parent_desc,
889 .inherit_options = bdrv_inherited_options,
890 .drained_begin = bdrv_child_cb_drained_begin,
891 .drained_end = bdrv_child_cb_drained_end,
892 .inactivate = bdrv_child_cb_inactivate,
893};
894
895
896
897
898
899
900static void bdrv_inherited_fmt_options(int *child_flags, QDict *child_options,
901 int parent_flags, QDict *parent_options)
902{
903 child_file.inherit_options(child_flags, child_options,
904 parent_flags, parent_options);
905
906 *child_flags &= ~(BDRV_O_PROTOCOL | BDRV_O_NO_IO);
907}
908
909const BdrvChildRole child_format = {
910 .get_parent_desc = bdrv_child_get_parent_desc,
911 .inherit_options = bdrv_inherited_fmt_options,
912 .drained_begin = bdrv_child_cb_drained_begin,
913 .drained_end = bdrv_child_cb_drained_end,
914 .inactivate = bdrv_child_cb_inactivate,
915};
916
917static void bdrv_backing_attach(BdrvChild *c)
918{
919 BlockDriverState *parent = c->opaque;
920 BlockDriverState *backing_hd = c->bs;
921
922 assert(!parent->backing_blocker);
923 error_setg(&parent->backing_blocker,
924 "node is used as backing hd of '%s'",
925 bdrv_get_device_or_node_name(parent));
926
927 parent->open_flags &= ~BDRV_O_NO_BACKING;
928 pstrcpy(parent->backing_file, sizeof(parent->backing_file),
929 backing_hd->filename);
930 pstrcpy(parent->backing_format, sizeof(parent->backing_format),
931 backing_hd->drv ? backing_hd->drv->format_name : "");
932
933 bdrv_op_block_all(backing_hd, parent->backing_blocker);
934
935 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
936 parent->backing_blocker);
937 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_STREAM,
938 parent->backing_blocker);
939
940
941
942
943
944
945
946
947
948
949
950
951
952 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_SOURCE,
953 parent->backing_blocker);
954 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_TARGET,
955 parent->backing_blocker);
956}
957
958static void bdrv_backing_detach(BdrvChild *c)
959{
960 BlockDriverState *parent = c->opaque;
961
962 assert(parent->backing_blocker);
963 bdrv_op_unblock_all(c->bs, parent->backing_blocker);
964 error_free(parent->backing_blocker);
965 parent->backing_blocker = NULL;
966}
967
968
969
970
971
972static void bdrv_backing_options(int *child_flags, QDict *child_options,
973 int parent_flags, QDict *parent_options)
974{
975 int flags = parent_flags;
976
977
978
979 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
980 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
981 qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE);
982
983
984 qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
985 flags &= ~BDRV_O_COPY_ON_READ;
986
987
988 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
989
990 *child_flags = flags;
991}
992
993static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base,
994 const char *filename, Error **errp)
995{
996 BlockDriverState *parent = c->opaque;
997 int orig_flags = bdrv_get_flags(parent);
998 int ret;
999
1000 if (!(orig_flags & BDRV_O_RDWR)) {
1001 ret = bdrv_reopen(parent, orig_flags | BDRV_O_RDWR, errp);
1002 if (ret < 0) {
1003 return ret;
1004 }
1005 }
1006
1007 ret = bdrv_change_backing_file(parent, filename,
1008 base->drv ? base->drv->format_name : "");
1009 if (ret < 0) {
1010 error_setg_errno(errp, -ret, "Could not update backing file link");
1011 }
1012
1013 if (!(orig_flags & BDRV_O_RDWR)) {
1014 bdrv_reopen(parent, orig_flags, NULL);
1015 }
1016
1017 return ret;
1018}
1019
1020const BdrvChildRole child_backing = {
1021 .get_parent_desc = bdrv_child_get_parent_desc,
1022 .attach = bdrv_backing_attach,
1023 .detach = bdrv_backing_detach,
1024 .inherit_options = bdrv_backing_options,
1025 .drained_begin = bdrv_child_cb_drained_begin,
1026 .drained_end = bdrv_child_cb_drained_end,
1027 .inactivate = bdrv_child_cb_inactivate,
1028 .update_filename = bdrv_backing_update_filename,
1029};
1030
1031static int bdrv_open_flags(BlockDriverState *bs, int flags)
1032{
1033 int open_flags = flags;
1034
1035
1036
1037
1038
1039 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
1040
1041
1042
1043
1044 if (flags & BDRV_O_TEMPORARY) {
1045 open_flags |= BDRV_O_RDWR;
1046 }
1047
1048 return open_flags;
1049}
1050
1051static void update_flags_from_options(int *flags, QemuOpts *opts)
1052{
1053 *flags &= ~BDRV_O_CACHE_MASK;
1054
1055 assert(qemu_opt_find(opts, BDRV_OPT_CACHE_NO_FLUSH));
1056 if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_NO_FLUSH, false)) {
1057 *flags |= BDRV_O_NO_FLUSH;
1058 }
1059
1060 assert(qemu_opt_find(opts, BDRV_OPT_CACHE_DIRECT));
1061 if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_DIRECT, false)) {
1062 *flags |= BDRV_O_NOCACHE;
1063 }
1064
1065 *flags &= ~BDRV_O_RDWR;
1066
1067 assert(qemu_opt_find(opts, BDRV_OPT_READ_ONLY));
1068 if (!qemu_opt_get_bool(opts, BDRV_OPT_READ_ONLY, false)) {
1069 *flags |= BDRV_O_RDWR;
1070 }
1071
1072}
1073
1074static void update_options_from_flags(QDict *options, int flags)
1075{
1076 if (!qdict_haskey(options, BDRV_OPT_CACHE_DIRECT)) {
1077 qdict_put_bool(options, BDRV_OPT_CACHE_DIRECT, flags & BDRV_O_NOCACHE);
1078 }
1079 if (!qdict_haskey(options, BDRV_OPT_CACHE_NO_FLUSH)) {
1080 qdict_put_bool(options, BDRV_OPT_CACHE_NO_FLUSH,
1081 flags & BDRV_O_NO_FLUSH);
1082 }
1083 if (!qdict_haskey(options, BDRV_OPT_READ_ONLY)) {
1084 qdict_put_bool(options, BDRV_OPT_READ_ONLY, !(flags & BDRV_O_RDWR));
1085 }
1086}
1087
1088static void bdrv_assign_node_name(BlockDriverState *bs,
1089 const char *node_name,
1090 Error **errp)
1091{
1092 char *gen_node_name = NULL;
1093
1094 if (!node_name) {
1095 node_name = gen_node_name = id_generate(ID_BLOCK);
1096 } else if (!id_wellformed(node_name)) {
1097
1098
1099
1100
1101 error_setg(errp, "Invalid node name");
1102 return;
1103 }
1104
1105
1106 if (blk_by_name(node_name)) {
1107 error_setg(errp, "node-name=%s is conflicting with a device id",
1108 node_name);
1109 goto out;
1110 }
1111
1112
1113 if (bdrv_find_node(node_name)) {
1114 error_setg(errp, "Duplicate node name");
1115 goto out;
1116 }
1117
1118
1119 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
1120 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
1121out:
1122 g_free(gen_node_name);
1123}
1124
1125static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv,
1126 const char *node_name, QDict *options,
1127 int open_flags, Error **errp)
1128{
1129 Error *local_err = NULL;
1130 int ret;
1131
1132 bdrv_assign_node_name(bs, node_name, &local_err);
1133 if (local_err) {
1134 error_propagate(errp, local_err);
1135 return -EINVAL;
1136 }
1137
1138 bs->drv = drv;
1139 bs->read_only = !(bs->open_flags & BDRV_O_RDWR);
1140 bs->opaque = g_malloc0(drv->instance_size);
1141
1142 if (drv->bdrv_file_open) {
1143 assert(!drv->bdrv_needs_filename || bs->filename[0]);
1144 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
1145 } else if (drv->bdrv_open) {
1146 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
1147 } else {
1148 ret = 0;
1149 }
1150
1151 if (ret < 0) {
1152 if (local_err) {
1153 error_propagate(errp, local_err);
1154 } else if (bs->filename[0]) {
1155 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
1156 } else {
1157 error_setg_errno(errp, -ret, "Could not open image");
1158 }
1159 goto open_failed;
1160 }
1161
1162 ret = refresh_total_sectors(bs, bs->total_sectors);
1163 if (ret < 0) {
1164 error_setg_errno(errp, -ret, "Could not refresh total sector count");
1165 return ret;
1166 }
1167
1168 bdrv_refresh_limits(bs, &local_err);
1169 if (local_err) {
1170 error_propagate(errp, local_err);
1171 return -EINVAL;
1172 }
1173
1174 assert(bdrv_opt_mem_align(bs) != 0);
1175 assert(bdrv_min_mem_align(bs) != 0);
1176 assert(is_power_of_2(bs->bl.request_alignment));
1177
1178 return 0;
1179open_failed:
1180 bs->drv = NULL;
1181 if (bs->file != NULL) {
1182 bdrv_unref_child(bs, bs->file);
1183 bs->file = NULL;
1184 }
1185 g_free(bs->opaque);
1186 bs->opaque = NULL;
1187 return ret;
1188}
1189
1190BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
1191 int flags, Error **errp)
1192{
1193 BlockDriverState *bs;
1194 int ret;
1195
1196 bs = bdrv_new();
1197 bs->open_flags = flags;
1198 bs->explicit_options = qdict_new();
1199 bs->options = qdict_new();
1200 bs->opaque = NULL;
1201
1202 update_options_from_flags(bs->options, flags);
1203
1204 ret = bdrv_open_driver(bs, drv, node_name, bs->options, flags, errp);
1205 if (ret < 0) {
1206 QDECREF(bs->explicit_options);
1207 bs->explicit_options = NULL;
1208 QDECREF(bs->options);
1209 bs->options = NULL;
1210 bdrv_unref(bs);
1211 return NULL;
1212 }
1213
1214 return bs;
1215}
1216
1217QemuOptsList bdrv_runtime_opts = {
1218 .name = "bdrv_common",
1219 .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
1220 .desc = {
1221 {
1222 .name = "node-name",
1223 .type = QEMU_OPT_STRING,
1224 .help = "Node name of the block device node",
1225 },
1226 {
1227 .name = "driver",
1228 .type = QEMU_OPT_STRING,
1229 .help = "Block driver to use for the node",
1230 },
1231 {
1232 .name = BDRV_OPT_CACHE_DIRECT,
1233 .type = QEMU_OPT_BOOL,
1234 .help = "Bypass software writeback cache on the host",
1235 },
1236 {
1237 .name = BDRV_OPT_CACHE_NO_FLUSH,
1238 .type = QEMU_OPT_BOOL,
1239 .help = "Ignore flush requests",
1240 },
1241 {
1242 .name = BDRV_OPT_READ_ONLY,
1243 .type = QEMU_OPT_BOOL,
1244 .help = "Node is opened in read-only mode",
1245 },
1246 {
1247 .name = "detect-zeroes",
1248 .type = QEMU_OPT_STRING,
1249 .help = "try to optimize zero writes (off, on, unmap)",
1250 },
1251 {
1252 .name = "discard",
1253 .type = QEMU_OPT_STRING,
1254 .help = "discard operation (ignore/off, unmap/on)",
1255 },
1256 {
1257 .name = BDRV_OPT_FORCE_SHARE,
1258 .type = QEMU_OPT_BOOL,
1259 .help = "always accept other writers (default: off)",
1260 },
1261 { }
1262 },
1263};
1264
1265
1266
1267
1268
1269
1270static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
1271 QDict *options, Error **errp)
1272{
1273 int ret, open_flags;
1274 const char *filename;
1275 const char *driver_name = NULL;
1276 const char *node_name = NULL;
1277 const char *discard;
1278 const char *detect_zeroes;
1279 QemuOpts *opts;
1280 BlockDriver *drv;
1281 Error *local_err = NULL;
1282
1283 assert(bs->file == NULL);
1284 assert(options != NULL && bs->options != options);
1285
1286 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
1287 qemu_opts_absorb_qdict(opts, options, &local_err);
1288 if (local_err) {
1289 error_propagate(errp, local_err);
1290 ret = -EINVAL;
1291 goto fail_opts;
1292 }
1293
1294 update_flags_from_options(&bs->open_flags, opts);
1295
1296 driver_name = qemu_opt_get(opts, "driver");
1297 drv = bdrv_find_format(driver_name);
1298 assert(drv != NULL);
1299
1300 bs->force_share = qemu_opt_get_bool(opts, BDRV_OPT_FORCE_SHARE, false);
1301
1302 if (bs->force_share && (bs->open_flags & BDRV_O_RDWR)) {
1303 error_setg(errp,
1304 BDRV_OPT_FORCE_SHARE
1305 "=on can only be used with read-only images");
1306 ret = -EINVAL;
1307 goto fail_opts;
1308 }
1309
1310 if (file != NULL) {
1311 filename = blk_bs(file)->filename;
1312 } else {
1313
1314
1315
1316
1317
1318
1319
1320 filename = qdict_get_try_str(options, "filename");
1321 }
1322
1323 if (drv->bdrv_needs_filename && (!filename || !filename[0])) {
1324 error_setg(errp, "The '%s' block driver requires a file name",
1325 drv->format_name);
1326 ret = -EINVAL;
1327 goto fail_opts;
1328 }
1329
1330 trace_bdrv_open_common(bs, filename ?: "", bs->open_flags,
1331 drv->format_name);
1332
1333 bs->read_only = !(bs->open_flags & BDRV_O_RDWR);
1334
1335 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) {
1336 error_setg(errp,
1337 !bs->read_only && bdrv_is_whitelisted(drv, true)
1338 ? "Driver '%s' can only be used for read-only devices"
1339 : "Driver '%s' is not whitelisted",
1340 drv->format_name);
1341 ret = -ENOTSUP;
1342 goto fail_opts;
1343 }
1344
1345
1346 assert(atomic_read(&bs->copy_on_read) == 0);
1347
1348 if (bs->open_flags & BDRV_O_COPY_ON_READ) {
1349 if (!bs->read_only) {
1350 bdrv_enable_copy_on_read(bs);
1351 } else {
1352 error_setg(errp, "Can't use copy-on-read on read-only device");
1353 ret = -EINVAL;
1354 goto fail_opts;
1355 }
1356 }
1357
1358 discard = qemu_opt_get(opts, "discard");
1359 if (discard != NULL) {
1360 if (bdrv_parse_discard_flags(discard, &bs->open_flags) != 0) {
1361 error_setg(errp, "Invalid discard option");
1362 ret = -EINVAL;
1363 goto fail_opts;
1364 }
1365 }
1366
1367 detect_zeroes = qemu_opt_get(opts, "detect-zeroes");
1368 if (detect_zeroes) {
1369 BlockdevDetectZeroesOptions value =
1370 qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
1371 detect_zeroes,
1372 BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
1373 &local_err);
1374 if (local_err) {
1375 error_propagate(errp, local_err);
1376 ret = -EINVAL;
1377 goto fail_opts;
1378 }
1379
1380 if (value == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
1381 !(bs->open_flags & BDRV_O_UNMAP))
1382 {
1383 error_setg(errp, "setting detect-zeroes to unmap is not allowed "
1384 "without setting discard operation to unmap");
1385 ret = -EINVAL;
1386 goto fail_opts;
1387 }
1388
1389 bs->detect_zeroes = value;
1390 }
1391
1392 if (filename != NULL) {
1393 pstrcpy(bs->filename, sizeof(bs->filename), filename);
1394 } else {
1395 bs->filename[0] = '\0';
1396 }
1397 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
1398
1399
1400 open_flags = bdrv_open_flags(bs, bs->open_flags);
1401 node_name = qemu_opt_get(opts, "node-name");
1402
1403 assert(!drv->bdrv_file_open || file == NULL);
1404 ret = bdrv_open_driver(bs, drv, node_name, options, open_flags, errp);
1405 if (ret < 0) {
1406 goto fail_opts;
1407 }
1408
1409 qemu_opts_del(opts);
1410 return 0;
1411
1412fail_opts:
1413 qemu_opts_del(opts);
1414 return ret;
1415}
1416
1417static QDict *parse_json_filename(const char *filename, Error **errp)
1418{
1419 QObject *options_obj;
1420 QDict *options;
1421 int ret;
1422
1423 ret = strstart(filename, "json:", &filename);
1424 assert(ret);
1425
1426 options_obj = qobject_from_json(filename, errp);
1427 if (!options_obj) {
1428
1429 if (errp && !*errp) {
1430 error_setg(errp, "Could not parse the JSON options");
1431 return NULL;
1432 }
1433 error_prepend(errp, "Could not parse the JSON options: ");
1434 return NULL;
1435 }
1436
1437 options = qobject_to_qdict(options_obj);
1438 if (!options) {
1439 qobject_decref(options_obj);
1440 error_setg(errp, "Invalid JSON object given");
1441 return NULL;
1442 }
1443
1444 qdict_flatten(options);
1445
1446 return options;
1447}
1448
1449static void parse_json_protocol(QDict *options, const char **pfilename,
1450 Error **errp)
1451{
1452 QDict *json_options;
1453 Error *local_err = NULL;
1454
1455
1456 if (!*pfilename || !g_str_has_prefix(*pfilename, "json:")) {
1457 return;
1458 }
1459
1460 json_options = parse_json_filename(*pfilename, &local_err);
1461 if (local_err) {
1462 error_propagate(errp, local_err);
1463 return;
1464 }
1465
1466
1467
1468 qdict_join(options, json_options, false);
1469 QDECREF(json_options);
1470 *pfilename = NULL;
1471}
1472
1473
1474
1475
1476
1477
1478
1479static int bdrv_fill_options(QDict **options, const char *filename,
1480 int *flags, Error **errp)
1481{
1482 const char *drvname;
1483 bool protocol = *flags & BDRV_O_PROTOCOL;
1484 bool parse_filename = false;
1485 BlockDriver *drv = NULL;
1486 Error *local_err = NULL;
1487
1488
1489
1490
1491
1492
1493
1494
1495 drvname = qdict_get_try_str(*options, "driver");
1496 if (drvname) {
1497 drv = bdrv_find_format(drvname);
1498 if (!drv) {
1499 error_setg(errp, "Unknown driver '%s'", drvname);
1500 return -ENOENT;
1501 }
1502
1503
1504 protocol = drv->bdrv_file_open;
1505 }
1506
1507 if (protocol) {
1508 *flags |= BDRV_O_PROTOCOL;
1509 } else {
1510 *flags &= ~BDRV_O_PROTOCOL;
1511 }
1512
1513
1514 update_options_from_flags(*options, *flags);
1515
1516
1517 if (protocol && filename) {
1518 if (!qdict_haskey(*options, "filename")) {
1519 qdict_put_str(*options, "filename", filename);
1520 parse_filename = true;
1521 } else {
1522 error_setg(errp, "Can't specify 'file' and 'filename' options at "
1523 "the same time");
1524 return -EINVAL;
1525 }
1526 }
1527
1528
1529
1530 filename = qdict_get_try_str(*options, "filename");
1531
1532 if (!drvname && protocol) {
1533 if (filename) {
1534 drv = bdrv_find_protocol(filename, parse_filename, errp);
1535 if (!drv) {
1536 return -EINVAL;
1537 }
1538
1539 drvname = drv->format_name;
1540 qdict_put_str(*options, "driver", drvname);
1541 } else {
1542 error_setg(errp, "Must specify either driver or file");
1543 return -EINVAL;
1544 }
1545 }
1546
1547 assert(drv || !protocol);
1548
1549
1550 if (drv && drv->bdrv_parse_filename && parse_filename) {
1551 drv->bdrv_parse_filename(filename, *options, &local_err);
1552 if (local_err) {
1553 error_propagate(errp, local_err);
1554 return -EINVAL;
1555 }
1556
1557 if (!drv->bdrv_needs_filename) {
1558 qdict_del(*options, "filename");
1559 }
1560 }
1561
1562 return 0;
1563}
1564
1565static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
1566 uint64_t perm, uint64_t shared,
1567 GSList *ignore_children, Error **errp);
1568static void bdrv_child_abort_perm_update(BdrvChild *c);
1569static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
1570
1571typedef struct BlockReopenQueueEntry {
1572 bool prepared;
1573 BDRVReopenState state;
1574 QSIMPLEQ_ENTRY(BlockReopenQueueEntry) entry;
1575} BlockReopenQueueEntry;
1576
1577
1578
1579
1580
1581
1582static int bdrv_reopen_get_flags(BlockReopenQueue *q, BlockDriverState *bs)
1583{
1584 BlockReopenQueueEntry *entry;
1585
1586 if (q != NULL) {
1587 QSIMPLEQ_FOREACH(entry, q, entry) {
1588 if (entry->state.bs == bs) {
1589 return entry->state.flags;
1590 }
1591 }
1592 }
1593
1594 return bs->open_flags;
1595}
1596
1597
1598
1599static bool bdrv_is_writable(BlockDriverState *bs, BlockReopenQueue *q)
1600{
1601 int flags = bdrv_reopen_get_flags(q, bs);
1602
1603 return (flags & (BDRV_O_RDWR | BDRV_O_INACTIVE)) == BDRV_O_RDWR;
1604}
1605
1606static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
1607 BdrvChild *c, const BdrvChildRole *role,
1608 BlockReopenQueue *reopen_queue,
1609 uint64_t parent_perm, uint64_t parent_shared,
1610 uint64_t *nperm, uint64_t *nshared)
1611{
1612 if (bs->drv && bs->drv->bdrv_child_perm) {
1613 bs->drv->bdrv_child_perm(bs, c, role, reopen_queue,
1614 parent_perm, parent_shared,
1615 nperm, nshared);
1616 }
1617
1618 if (child_bs && child_bs->force_share) {
1619 *nshared = BLK_PERM_ALL;
1620 }
1621}
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
1633 uint64_t cumulative_perms,
1634 uint64_t cumulative_shared_perms,
1635 GSList *ignore_children, Error **errp)
1636{
1637 BlockDriver *drv = bs->drv;
1638 BdrvChild *c;
1639 int ret;
1640
1641
1642 if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
1643 !bdrv_is_writable(bs, q))
1644 {
1645 error_setg(errp, "Block node is read-only");
1646 return -EPERM;
1647 }
1648
1649
1650 if (!drv) {
1651 return 0;
1652 }
1653
1654 if (drv->bdrv_check_perm) {
1655 return drv->bdrv_check_perm(bs, cumulative_perms,
1656 cumulative_shared_perms, errp);
1657 }
1658
1659
1660 if (!drv->bdrv_child_perm) {
1661 assert(QLIST_EMPTY(&bs->children));
1662 return 0;
1663 }
1664
1665
1666 QLIST_FOREACH(c, &bs->children, next) {
1667 uint64_t cur_perm, cur_shared;
1668 bdrv_child_perm(bs, c->bs, c, c->role, q,
1669 cumulative_perms, cumulative_shared_perms,
1670 &cur_perm, &cur_shared);
1671 ret = bdrv_child_check_perm(c, q, cur_perm, cur_shared,
1672 ignore_children, errp);
1673 if (ret < 0) {
1674 return ret;
1675 }
1676 }
1677
1678 return 0;
1679}
1680
1681
1682
1683
1684
1685
1686
1687
1688static void bdrv_abort_perm_update(BlockDriverState *bs)
1689{
1690 BlockDriver *drv = bs->drv;
1691 BdrvChild *c;
1692
1693 if (!drv) {
1694 return;
1695 }
1696
1697 if (drv->bdrv_abort_perm_update) {
1698 drv->bdrv_abort_perm_update(bs);
1699 }
1700
1701 QLIST_FOREACH(c, &bs->children, next) {
1702 bdrv_child_abort_perm_update(c);
1703 }
1704}
1705
1706static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
1707 uint64_t cumulative_shared_perms)
1708{
1709 BlockDriver *drv = bs->drv;
1710 BdrvChild *c;
1711
1712 if (!drv) {
1713 return;
1714 }
1715
1716
1717 if (drv->bdrv_set_perm) {
1718 drv->bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms);
1719 }
1720
1721
1722 if (!drv->bdrv_child_perm) {
1723 assert(QLIST_EMPTY(&bs->children));
1724 return;
1725 }
1726
1727
1728 QLIST_FOREACH(c, &bs->children, next) {
1729 uint64_t cur_perm, cur_shared;
1730 bdrv_child_perm(bs, c->bs, c, c->role, NULL,
1731 cumulative_perms, cumulative_shared_perms,
1732 &cur_perm, &cur_shared);
1733 bdrv_child_set_perm(c, cur_perm, cur_shared);
1734 }
1735}
1736
1737static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
1738 uint64_t *shared_perm)
1739{
1740 BdrvChild *c;
1741 uint64_t cumulative_perms = 0;
1742 uint64_t cumulative_shared_perms = BLK_PERM_ALL;
1743
1744 QLIST_FOREACH(c, &bs->parents, next_parent) {
1745 cumulative_perms |= c->perm;
1746 cumulative_shared_perms &= c->shared_perm;
1747 }
1748
1749 *perm = cumulative_perms;
1750 *shared_perm = cumulative_shared_perms;
1751}
1752
1753static char *bdrv_child_user_desc(BdrvChild *c)
1754{
1755 if (c->role->get_parent_desc) {
1756 return c->role->get_parent_desc(c);
1757 }
1758
1759 return g_strdup("another user");
1760}
1761
1762char *bdrv_perm_names(uint64_t perm)
1763{
1764 struct perm_name {
1765 uint64_t perm;
1766 const char *name;
1767 } permissions[] = {
1768 { BLK_PERM_CONSISTENT_READ, "consistent read" },
1769 { BLK_PERM_WRITE, "write" },
1770 { BLK_PERM_WRITE_UNCHANGED, "write unchanged" },
1771 { BLK_PERM_RESIZE, "resize" },
1772 { BLK_PERM_GRAPH_MOD, "change children" },
1773 { 0, NULL }
1774 };
1775
1776 char *result = g_strdup("");
1777 struct perm_name *p;
1778
1779 for (p = permissions; p->name; p++) {
1780 if (perm & p->perm) {
1781 char *old = result;
1782 result = g_strdup_printf("%s%s%s", old, *old ? ", " : "", p->name);
1783 g_free(old);
1784 }
1785 }
1786
1787 return result;
1788}
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798static int bdrv_check_update_perm(BlockDriverState *bs, BlockReopenQueue *q,
1799 uint64_t new_used_perm,
1800 uint64_t new_shared_perm,
1801 GSList *ignore_children, Error **errp)
1802{
1803 BdrvChild *c;
1804 uint64_t cumulative_perms = new_used_perm;
1805 uint64_t cumulative_shared_perms = new_shared_perm;
1806
1807
1808 assert(new_shared_perm & BLK_PERM_WRITE_UNCHANGED);
1809
1810 QLIST_FOREACH(c, &bs->parents, next_parent) {
1811 if (g_slist_find(ignore_children, c)) {
1812 continue;
1813 }
1814
1815 if ((new_used_perm & c->shared_perm) != new_used_perm) {
1816 char *user = bdrv_child_user_desc(c);
1817 char *perm_names = bdrv_perm_names(new_used_perm & ~c->shared_perm);
1818 error_setg(errp, "Conflicts with use by %s as '%s', which does not "
1819 "allow '%s' on %s",
1820 user, c->name, perm_names, bdrv_get_node_name(c->bs));
1821 g_free(user);
1822 g_free(perm_names);
1823 return -EPERM;
1824 }
1825
1826 if ((c->perm & new_shared_perm) != c->perm) {
1827 char *user = bdrv_child_user_desc(c);
1828 char *perm_names = bdrv_perm_names(c->perm & ~new_shared_perm);
1829 error_setg(errp, "Conflicts with use by %s as '%s', which uses "
1830 "'%s' on %s",
1831 user, c->name, perm_names, bdrv_get_node_name(c->bs));
1832 g_free(user);
1833 g_free(perm_names);
1834 return -EPERM;
1835 }
1836
1837 cumulative_perms |= c->perm;
1838 cumulative_shared_perms &= c->shared_perm;
1839 }
1840
1841 return bdrv_check_perm(bs, q, cumulative_perms, cumulative_shared_perms,
1842 ignore_children, errp);
1843}
1844
1845
1846
1847static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
1848 uint64_t perm, uint64_t shared,
1849 GSList *ignore_children, Error **errp)
1850{
1851 int ret;
1852
1853 ignore_children = g_slist_prepend(g_slist_copy(ignore_children), c);
1854 ret = bdrv_check_update_perm(c->bs, q, perm, shared, ignore_children, errp);
1855 g_slist_free(ignore_children);
1856
1857 return ret;
1858}
1859
1860static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared)
1861{
1862 uint64_t cumulative_perms, cumulative_shared_perms;
1863
1864 c->perm = perm;
1865 c->shared_perm = shared;
1866
1867 bdrv_get_cumulative_perm(c->bs, &cumulative_perms,
1868 &cumulative_shared_perms);
1869 bdrv_set_perm(c->bs, cumulative_perms, cumulative_shared_perms);
1870}
1871
1872static void bdrv_child_abort_perm_update(BdrvChild *c)
1873{
1874 bdrv_abort_perm_update(c->bs);
1875}
1876
1877int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
1878 Error **errp)
1879{
1880 int ret;
1881
1882 ret = bdrv_child_check_perm(c, NULL, perm, shared, NULL, errp);
1883 if (ret < 0) {
1884 bdrv_child_abort_perm_update(c);
1885 return ret;
1886 }
1887
1888 bdrv_child_set_perm(c, perm, shared);
1889
1890 return 0;
1891}
1892
1893#define DEFAULT_PERM_PASSTHROUGH (BLK_PERM_CONSISTENT_READ \
1894 | BLK_PERM_WRITE \
1895 | BLK_PERM_WRITE_UNCHANGED \
1896 | BLK_PERM_RESIZE)
1897#define DEFAULT_PERM_UNCHANGED (BLK_PERM_ALL & ~DEFAULT_PERM_PASSTHROUGH)
1898
1899void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
1900 const BdrvChildRole *role,
1901 BlockReopenQueue *reopen_queue,
1902 uint64_t perm, uint64_t shared,
1903 uint64_t *nperm, uint64_t *nshared)
1904{
1905 if (c == NULL) {
1906 *nperm = perm & DEFAULT_PERM_PASSTHROUGH;
1907 *nshared = (shared & DEFAULT_PERM_PASSTHROUGH) | DEFAULT_PERM_UNCHANGED;
1908 return;
1909 }
1910
1911 *nperm = (perm & DEFAULT_PERM_PASSTHROUGH) |
1912 (c->perm & DEFAULT_PERM_UNCHANGED);
1913 *nshared = (shared & DEFAULT_PERM_PASSTHROUGH) |
1914 (c->shared_perm & DEFAULT_PERM_UNCHANGED);
1915}
1916
1917void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
1918 const BdrvChildRole *role,
1919 BlockReopenQueue *reopen_queue,
1920 uint64_t perm, uint64_t shared,
1921 uint64_t *nperm, uint64_t *nshared)
1922{
1923 bool backing = (role == &child_backing);
1924 assert(role == &child_backing || role == &child_file);
1925
1926 if (!backing) {
1927
1928
1929 bdrv_filter_default_perms(bs, c, role, reopen_queue, perm, shared,
1930 &perm, &shared);
1931
1932
1933 if (bdrv_is_writable(bs, reopen_queue)) {
1934 perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
1935 }
1936
1937
1938
1939 perm |= BLK_PERM_CONSISTENT_READ;
1940 shared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
1941 } else {
1942
1943
1944 perm &= BLK_PERM_CONSISTENT_READ;
1945
1946
1947
1948
1949 if (shared & BLK_PERM_WRITE) {
1950 shared = BLK_PERM_WRITE | BLK_PERM_RESIZE;
1951 } else {
1952 shared = 0;
1953 }
1954
1955 shared |= BLK_PERM_CONSISTENT_READ | BLK_PERM_GRAPH_MOD |
1956 BLK_PERM_WRITE_UNCHANGED;
1957 }
1958
1959 if (bs->open_flags & BDRV_O_INACTIVE) {
1960 shared |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
1961 }
1962
1963 *nperm = perm;
1964 *nshared = shared;
1965}
1966
1967static void bdrv_replace_child_noperm(BdrvChild *child,
1968 BlockDriverState *new_bs)
1969{
1970 BlockDriverState *old_bs = child->bs;
1971
1972 if (old_bs && new_bs) {
1973 assert(bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs));
1974 }
1975 if (old_bs) {
1976 if (old_bs->quiesce_counter && child->role->drained_end) {
1977 child->role->drained_end(child);
1978 }
1979 if (child->role->detach) {
1980 child->role->detach(child);
1981 }
1982 QLIST_REMOVE(child, next_parent);
1983 }
1984
1985 child->bs = new_bs;
1986
1987 if (new_bs) {
1988 QLIST_INSERT_HEAD(&new_bs->parents, child, next_parent);
1989 if (new_bs->quiesce_counter && child->role->drained_begin) {
1990 child->role->drained_begin(child);
1991 }
1992
1993 if (child->role->attach) {
1994 child->role->attach(child);
1995 }
1996 }
1997}
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
2011{
2012 BlockDriverState *old_bs = child->bs;
2013 uint64_t perm, shared_perm;
2014
2015 bdrv_replace_child_noperm(child, new_bs);
2016
2017 if (old_bs) {
2018
2019
2020
2021 bdrv_get_cumulative_perm(old_bs, &perm, &shared_perm);
2022 bdrv_check_perm(old_bs, NULL, perm, shared_perm, NULL, &error_abort);
2023 bdrv_set_perm(old_bs, perm, shared_perm);
2024 }
2025
2026 if (new_bs) {
2027 bdrv_get_cumulative_perm(new_bs, &perm, &shared_perm);
2028 bdrv_set_perm(new_bs, perm, shared_perm);
2029 }
2030}
2031
2032BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
2033 const char *child_name,
2034 const BdrvChildRole *child_role,
2035 uint64_t perm, uint64_t shared_perm,
2036 void *opaque, Error **errp)
2037{
2038 BdrvChild *child;
2039 int ret;
2040
2041 ret = bdrv_check_update_perm(child_bs, NULL, perm, shared_perm, NULL, errp);
2042 if (ret < 0) {
2043 bdrv_abort_perm_update(child_bs);
2044 return NULL;
2045 }
2046
2047 child = g_new(BdrvChild, 1);
2048 *child = (BdrvChild) {
2049 .bs = NULL,
2050 .name = g_strdup(child_name),
2051 .role = child_role,
2052 .perm = perm,
2053 .shared_perm = shared_perm,
2054 .opaque = opaque,
2055 };
2056
2057
2058 bdrv_replace_child(child, child_bs);
2059
2060 return child;
2061}
2062
2063BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
2064 BlockDriverState *child_bs,
2065 const char *child_name,
2066 const BdrvChildRole *child_role,
2067 Error **errp)
2068{
2069 BdrvChild *child;
2070 uint64_t perm, shared_perm;
2071
2072 bdrv_get_cumulative_perm(parent_bs, &perm, &shared_perm);
2073
2074 assert(parent_bs->drv);
2075 assert(bdrv_get_aio_context(parent_bs) == bdrv_get_aio_context(child_bs));
2076 bdrv_child_perm(parent_bs, child_bs, NULL, child_role, NULL,
2077 perm, shared_perm, &perm, &shared_perm);
2078
2079 child = bdrv_root_attach_child(child_bs, child_name, child_role,
2080 perm, shared_perm, parent_bs, errp);
2081 if (child == NULL) {
2082 return NULL;
2083 }
2084
2085 QLIST_INSERT_HEAD(&parent_bs->children, child, next);
2086 return child;
2087}
2088
2089static void bdrv_detach_child(BdrvChild *child)
2090{
2091 if (child->next.le_prev) {
2092 QLIST_REMOVE(child, next);
2093 child->next.le_prev = NULL;
2094 }
2095
2096 bdrv_replace_child(child, NULL);
2097
2098 g_free(child->name);
2099 g_free(child);
2100}
2101
2102void bdrv_root_unref_child(BdrvChild *child)
2103{
2104 BlockDriverState *child_bs;
2105
2106 child_bs = child->bs;
2107 bdrv_detach_child(child);
2108 bdrv_unref(child_bs);
2109}
2110
2111void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child)
2112{
2113 if (child == NULL) {
2114 return;
2115 }
2116
2117 if (child->bs->inherits_from == parent) {
2118 BdrvChild *c;
2119
2120
2121
2122 QLIST_FOREACH(c, &parent->children, next) {
2123 if (c != child && c->bs == child->bs) {
2124 break;
2125 }
2126 }
2127 if (c == NULL) {
2128 child->bs->inherits_from = NULL;
2129 }
2130 }
2131
2132 bdrv_root_unref_child(child);
2133}
2134
2135
2136static void bdrv_parent_cb_change_media(BlockDriverState *bs, bool load)
2137{
2138 BdrvChild *c;
2139 QLIST_FOREACH(c, &bs->parents, next_parent) {
2140 if (c->role->change_media) {
2141 c->role->change_media(c, load);
2142 }
2143 }
2144}
2145
2146static void bdrv_parent_cb_resize(BlockDriverState *bs)
2147{
2148 BdrvChild *c;
2149 QLIST_FOREACH(c, &bs->parents, next_parent) {
2150 if (c->role->resize) {
2151 c->role->resize(c);
2152 }
2153 }
2154}
2155
2156
2157
2158
2159
2160void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
2161 Error **errp)
2162{
2163 if (backing_hd) {
2164 bdrv_ref(backing_hd);
2165 }
2166
2167 if (bs->backing) {
2168 bdrv_unref_child(bs, bs->backing);
2169 }
2170
2171 if (!backing_hd) {
2172 bs->backing = NULL;
2173 goto out;
2174 }
2175
2176 bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_backing,
2177 errp);
2178 if (!bs->backing) {
2179 bdrv_unref(backing_hd);
2180 }
2181
2182 bdrv_refresh_filename(bs);
2183
2184out:
2185 bdrv_refresh_limits(bs, NULL);
2186}
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
2199 const char *bdref_key, Error **errp)
2200{
2201 char *backing_filename = g_malloc0(PATH_MAX);
2202 char *bdref_key_dot;
2203 const char *reference = NULL;
2204 int ret = 0;
2205 BlockDriverState *backing_hd;
2206 QDict *options;
2207 QDict *tmp_parent_options = NULL;
2208 Error *local_err = NULL;
2209
2210 if (bs->backing != NULL) {
2211 goto free_exit;
2212 }
2213
2214
2215 if (parent_options == NULL) {
2216 tmp_parent_options = qdict_new();
2217 parent_options = tmp_parent_options;
2218 }
2219
2220 bs->open_flags &= ~BDRV_O_NO_BACKING;
2221
2222 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
2223 qdict_extract_subqdict(parent_options, &options, bdref_key_dot);
2224 g_free(bdref_key_dot);
2225
2226
2227
2228
2229
2230
2231
2232
2233 reference = qdict_get_try_str(parent_options, bdref_key);
2234 if (reference || qdict_haskey(options, "file.filename")) {
2235 backing_filename[0] = '\0';
2236 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
2237 QDECREF(options);
2238 goto free_exit;
2239 } else {
2240 bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
2241 &local_err);
2242 if (local_err) {
2243 ret = -EINVAL;
2244 error_propagate(errp, local_err);
2245 QDECREF(options);
2246 goto free_exit;
2247 }
2248 }
2249
2250 if (!bs->drv || !bs->drv->supports_backing) {
2251 ret = -EINVAL;
2252 error_setg(errp, "Driver doesn't support backing files");
2253 QDECREF(options);
2254 goto free_exit;
2255 }
2256
2257 if (!reference &&
2258 bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
2259 qdict_put_str(options, "driver", bs->backing_format);
2260 }
2261
2262 backing_hd = bdrv_open_inherit(*backing_filename ? backing_filename : NULL,
2263 reference, options, 0, bs, &child_backing,
2264 errp);
2265 if (!backing_hd) {
2266 bs->open_flags |= BDRV_O_NO_BACKING;
2267 error_prepend(errp, "Could not open backing file: ");
2268 ret = -EINVAL;
2269 goto free_exit;
2270 }
2271 bdrv_set_aio_context(backing_hd, bdrv_get_aio_context(bs));
2272
2273
2274
2275 bdrv_set_backing_hd(bs, backing_hd, &local_err);
2276 bdrv_unref(backing_hd);
2277 if (local_err) {
2278 error_propagate(errp, local_err);
2279 ret = -EINVAL;
2280 goto free_exit;
2281 }
2282
2283 qdict_del(parent_options, bdref_key);
2284
2285free_exit:
2286 g_free(backing_filename);
2287 QDECREF(tmp_parent_options);
2288 return ret;
2289}
2290
2291static BlockDriverState *
2292bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
2293 BlockDriverState *parent, const BdrvChildRole *child_role,
2294 bool allow_none, Error **errp)
2295{
2296 BlockDriverState *bs = NULL;
2297 QDict *image_options;
2298 char *bdref_key_dot;
2299 const char *reference;
2300
2301 assert(child_role != NULL);
2302
2303 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
2304 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
2305 g_free(bdref_key_dot);
2306
2307
2308
2309
2310
2311
2312
2313
2314 reference = qdict_get_try_str(options, bdref_key);
2315 if (!filename && !reference && !qdict_size(image_options)) {
2316 if (!allow_none) {
2317 error_setg(errp, "A block device must be specified for \"%s\"",
2318 bdref_key);
2319 }
2320 QDECREF(image_options);
2321 goto done;
2322 }
2323
2324 bs = bdrv_open_inherit(filename, reference, image_options, 0,
2325 parent, child_role, errp);
2326 if (!bs) {
2327 goto done;
2328 }
2329
2330done:
2331 qdict_del(options, bdref_key);
2332 return bs;
2333}
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349BdrvChild *bdrv_open_child(const char *filename,
2350 QDict *options, const char *bdref_key,
2351 BlockDriverState *parent,
2352 const BdrvChildRole *child_role,
2353 bool allow_none, Error **errp)
2354{
2355 BdrvChild *c;
2356 BlockDriverState *bs;
2357
2358 bs = bdrv_open_child_bs(filename, options, bdref_key, parent, child_role,
2359 allow_none, errp);
2360 if (bs == NULL) {
2361 return NULL;
2362 }
2363
2364 c = bdrv_attach_child(parent, bs, bdref_key, child_role, errp);
2365 if (!c) {
2366 bdrv_unref(bs);
2367 return NULL;
2368 }
2369
2370 return c;
2371}
2372
2373static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
2374 int flags,
2375 QDict *snapshot_options,
2376 Error **errp)
2377{
2378
2379 char *tmp_filename = g_malloc0(PATH_MAX + 1);
2380 int64_t total_size;
2381 QemuOpts *opts = NULL;
2382 BlockDriverState *bs_snapshot = NULL;
2383 Error *local_err = NULL;
2384 int ret;
2385
2386
2387
2388
2389
2390 total_size = bdrv_getlength(bs);
2391 if (total_size < 0) {
2392 error_setg_errno(errp, -total_size, "Could not get image size");
2393 goto out;
2394 }
2395
2396
2397 ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
2398 if (ret < 0) {
2399 error_setg_errno(errp, -ret, "Could not get temporary filename");
2400 goto out;
2401 }
2402
2403 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
2404 &error_abort);
2405 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
2406 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, errp);
2407 qemu_opts_del(opts);
2408 if (ret < 0) {
2409 error_prepend(errp, "Could not create temporary overlay '%s': ",
2410 tmp_filename);
2411 goto out;
2412 }
2413
2414
2415 qdict_put_str(snapshot_options, "file.driver", "file");
2416 qdict_put_str(snapshot_options, "file.filename", tmp_filename);
2417 qdict_put_str(snapshot_options, "driver", "qcow2");
2418
2419 bs_snapshot = bdrv_open(NULL, NULL, snapshot_options, flags, errp);
2420 snapshot_options = NULL;
2421 if (!bs_snapshot) {
2422 goto out;
2423 }
2424
2425
2426
2427
2428
2429 bdrv_ref(bs_snapshot);
2430 bdrv_append(bs_snapshot, bs, &local_err);
2431 if (local_err) {
2432 error_propagate(errp, local_err);
2433 bs_snapshot = NULL;
2434 goto out;
2435 }
2436
2437out:
2438 QDECREF(snapshot_options);
2439 g_free(tmp_filename);
2440 return bs_snapshot;
2441}
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458static BlockDriverState *bdrv_open_inherit(const char *filename,
2459 const char *reference,
2460 QDict *options, int flags,
2461 BlockDriverState *parent,
2462 const BdrvChildRole *child_role,
2463 Error **errp)
2464{
2465 int ret;
2466 BlockBackend *file = NULL;
2467 BlockDriverState *bs;
2468 BlockDriver *drv = NULL;
2469 const char *drvname;
2470 const char *backing;
2471 Error *local_err = NULL;
2472 QDict *snapshot_options = NULL;
2473 int snapshot_flags = 0;
2474
2475 assert(!child_role || !flags);
2476 assert(!child_role == !parent);
2477
2478 if (reference) {
2479 bool options_non_empty = options ? qdict_size(options) : false;
2480 QDECREF(options);
2481
2482 if (filename || options_non_empty) {
2483 error_setg(errp, "Cannot reference an existing block device with "
2484 "additional options or a new filename");
2485 return NULL;
2486 }
2487
2488 bs = bdrv_lookup_bs(reference, reference, errp);
2489 if (!bs) {
2490 return NULL;
2491 }
2492
2493 bdrv_ref(bs);
2494 return bs;
2495 }
2496
2497 bs = bdrv_new();
2498
2499
2500 if (options == NULL) {
2501 options = qdict_new();
2502 }
2503
2504
2505 parse_json_protocol(options, &filename, &local_err);
2506 if (local_err) {
2507 goto fail;
2508 }
2509
2510 bs->explicit_options = qdict_clone_shallow(options);
2511
2512 if (child_role) {
2513 bs->inherits_from = parent;
2514 child_role->inherit_options(&flags, options,
2515 parent->open_flags, parent->options);
2516 }
2517
2518 ret = bdrv_fill_options(&options, filename, &flags, &local_err);
2519 if (local_err) {
2520 goto fail;
2521 }
2522
2523
2524
2525
2526
2527
2528
2529
2530 if (g_strcmp0(qdict_get_try_str(options, BDRV_OPT_READ_ONLY), "on") &&
2531 !qdict_get_try_bool(options, BDRV_OPT_READ_ONLY, false)) {
2532 flags |= (BDRV_O_RDWR | BDRV_O_ALLOW_RDWR);
2533 } else {
2534 flags &= ~BDRV_O_RDWR;
2535 }
2536
2537 if (flags & BDRV_O_SNAPSHOT) {
2538 snapshot_options = qdict_new();
2539 bdrv_temp_snapshot_options(&snapshot_flags, snapshot_options,
2540 flags, options);
2541
2542 qdict_del(options, BDRV_OPT_READ_ONLY);
2543 bdrv_backing_options(&flags, options, flags, options);
2544 }
2545
2546 bs->open_flags = flags;
2547 bs->options = options;
2548 options = qdict_clone_shallow(options);
2549
2550
2551
2552 drvname = qdict_get_try_str(options, "driver");
2553 if (drvname) {
2554 drv = bdrv_find_format(drvname);
2555 if (!drv) {
2556 error_setg(errp, "Unknown driver: '%s'", drvname);
2557 goto fail;
2558 }
2559 }
2560
2561 assert(drvname || !(flags & BDRV_O_PROTOCOL));
2562
2563
2564 backing = qdict_get_try_str(options, "backing");
2565 if (backing && *backing == '\0') {
2566 flags |= BDRV_O_NO_BACKING;
2567 qdict_del(options, "backing");
2568 }
2569
2570
2571
2572
2573 if ((flags & BDRV_O_PROTOCOL) == 0) {
2574 BlockDriverState *file_bs;
2575
2576 file_bs = bdrv_open_child_bs(filename, options, "file", bs,
2577 &child_file, true, &local_err);
2578 if (local_err) {
2579 goto fail;
2580 }
2581 if (file_bs != NULL) {
2582
2583
2584
2585 file = blk_new(0, BLK_PERM_ALL);
2586 blk_insert_bs(file, file_bs, &local_err);
2587 bdrv_unref(file_bs);
2588 if (local_err) {
2589 goto fail;
2590 }
2591
2592 qdict_put_str(options, "file", bdrv_get_node_name(file_bs));
2593 }
2594 }
2595
2596
2597 bs->probed = !drv;
2598 if (!drv && file) {
2599 ret = find_image_format(file, filename, &drv, &local_err);
2600 if (ret < 0) {
2601 goto fail;
2602 }
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614 qdict_put_str(bs->options, "driver", drv->format_name);
2615 qdict_put_str(options, "driver", drv->format_name);
2616 } else if (!drv) {
2617 error_setg(errp, "Must specify either driver or file");
2618 goto fail;
2619 }
2620
2621
2622 assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
2623
2624
2625 assert(!(flags & BDRV_O_PROTOCOL) || !file);
2626
2627
2628 ret = bdrv_open_common(bs, file, options, &local_err);
2629 if (ret < 0) {
2630 goto fail;
2631 }
2632
2633 if (file) {
2634 blk_unref(file);
2635 file = NULL;
2636 }
2637
2638
2639 if ((flags & BDRV_O_NO_BACKING) == 0) {
2640 ret = bdrv_open_backing_file(bs, options, "backing", &local_err);
2641 if (ret < 0) {
2642 goto close_and_fail;
2643 }
2644 }
2645
2646 bdrv_refresh_filename(bs);
2647
2648
2649 if (qdict_size(options) != 0) {
2650 const QDictEntry *entry = qdict_first(options);
2651 if (flags & BDRV_O_PROTOCOL) {
2652 error_setg(errp, "Block protocol '%s' doesn't support the option "
2653 "'%s'", drv->format_name, entry->key);
2654 } else {
2655 error_setg(errp,
2656 "Block format '%s' does not support the option '%s'",
2657 drv->format_name, entry->key);
2658 }
2659
2660 goto close_and_fail;
2661 }
2662
2663 bdrv_parent_cb_change_media(bs, true);
2664
2665 QDECREF(options);
2666
2667
2668
2669 if (snapshot_flags) {
2670 BlockDriverState *snapshot_bs;
2671 snapshot_bs = bdrv_append_temp_snapshot(bs, snapshot_flags,
2672 snapshot_options, &local_err);
2673 snapshot_options = NULL;
2674 if (local_err) {
2675 goto close_and_fail;
2676 }
2677
2678
2679
2680
2681 bdrv_unref(bs);
2682 bs = snapshot_bs;
2683 }
2684
2685 return bs;
2686
2687fail:
2688 blk_unref(file);
2689 QDECREF(snapshot_options);
2690 QDECREF(bs->explicit_options);
2691 QDECREF(bs->options);
2692 QDECREF(options);
2693 bs->options = NULL;
2694 bs->explicit_options = NULL;
2695 bdrv_unref(bs);
2696 error_propagate(errp, local_err);
2697 return NULL;
2698
2699close_and_fail:
2700 bdrv_unref(bs);
2701 QDECREF(snapshot_options);
2702 QDECREF(options);
2703 error_propagate(errp, local_err);
2704 return NULL;
2705}
2706
2707BlockDriverState *bdrv_open(const char *filename, const char *reference,
2708 QDict *options, int flags, Error **errp)
2709{
2710 return bdrv_open_inherit(filename, reference, options, flags, NULL,
2711 NULL, errp);
2712}
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735static BlockReopenQueue *bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
2736 BlockDriverState *bs,
2737 QDict *options,
2738 int flags,
2739 const BdrvChildRole *role,
2740 QDict *parent_options,
2741 int parent_flags)
2742{
2743 assert(bs != NULL);
2744
2745 BlockReopenQueueEntry *bs_entry;
2746 BdrvChild *child;
2747 QDict *old_options, *explicit_options;
2748
2749 if (bs_queue == NULL) {
2750 bs_queue = g_new0(BlockReopenQueue, 1);
2751 QSIMPLEQ_INIT(bs_queue);
2752 }
2753
2754 if (!options) {
2755 options = qdict_new();
2756 }
2757
2758
2759 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
2760 if (bs == bs_entry->state.bs) {
2761 break;
2762 }
2763 }
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774 if (!parent_options) {
2775
2776
2777
2778
2779
2780
2781 update_options_from_flags(options, flags);
2782 }
2783
2784
2785 if (bs_entry) {
2786 old_options = qdict_clone_shallow(bs_entry->state.explicit_options);
2787 } else {
2788 old_options = qdict_clone_shallow(bs->explicit_options);
2789 }
2790 bdrv_join_options(bs, options, old_options);
2791 QDECREF(old_options);
2792
2793 explicit_options = qdict_clone_shallow(options);
2794
2795
2796 if (parent_options) {
2797 assert(!flags);
2798 role->inherit_options(&flags, options, parent_flags, parent_options);
2799 }
2800
2801
2802 old_options = qdict_clone_shallow(bs->options);
2803 bdrv_join_options(bs, options, old_options);
2804 QDECREF(old_options);
2805
2806
2807 flags &= ~BDRV_O_PROTOCOL;
2808 if (flags & BDRV_O_RDWR) {
2809 flags |= BDRV_O_ALLOW_RDWR;
2810 }
2811
2812 if (!bs_entry) {
2813 bs_entry = g_new0(BlockReopenQueueEntry, 1);
2814 QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
2815 } else {
2816 QDECREF(bs_entry->state.options);
2817 QDECREF(bs_entry->state.explicit_options);
2818 }
2819
2820 bs_entry->state.bs = bs;
2821 bs_entry->state.options = options;
2822 bs_entry->state.explicit_options = explicit_options;
2823 bs_entry->state.flags = flags;
2824
2825
2826 bs_entry->state.perm = UINT64_MAX;
2827 bs_entry->state.shared_perm = 0;
2828
2829 QLIST_FOREACH(child, &bs->children, next) {
2830 QDict *new_child_options;
2831 char *child_key_dot;
2832
2833
2834
2835
2836 if (child->bs->inherits_from != bs) {
2837 continue;
2838 }
2839
2840 child_key_dot = g_strdup_printf("%s.", child->name);
2841 qdict_extract_subqdict(options, &new_child_options, child_key_dot);
2842 g_free(child_key_dot);
2843
2844 bdrv_reopen_queue_child(bs_queue, child->bs, new_child_options, 0,
2845 child->role, options, flags);
2846 }
2847
2848 return bs_queue;
2849}
2850
2851BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
2852 BlockDriverState *bs,
2853 QDict *options, int flags)
2854{
2855 return bdrv_reopen_queue_child(bs_queue, bs, options, flags,
2856 NULL, NULL, 0);
2857}
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue, Error **errp)
2875{
2876 int ret = -1;
2877 BlockReopenQueueEntry *bs_entry, *next;
2878 Error *local_err = NULL;
2879
2880 assert(bs_queue != NULL);
2881
2882 aio_context_release(ctx);
2883 bdrv_drain_all_begin();
2884 aio_context_acquire(ctx);
2885
2886 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
2887 if (bdrv_reopen_prepare(&bs_entry->state, bs_queue, &local_err)) {
2888 error_propagate(errp, local_err);
2889 goto cleanup;
2890 }
2891 bs_entry->prepared = true;
2892 }
2893
2894
2895
2896
2897 QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
2898 bdrv_reopen_commit(&bs_entry->state);
2899 }
2900
2901 ret = 0;
2902
2903cleanup:
2904 QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
2905 if (ret && bs_entry->prepared) {
2906 bdrv_reopen_abort(&bs_entry->state);
2907 } else if (ret) {
2908 QDECREF(bs_entry->state.explicit_options);
2909 }
2910 QDECREF(bs_entry->state.options);
2911 g_free(bs_entry);
2912 }
2913 g_free(bs_queue);
2914
2915 bdrv_drain_all_end();
2916
2917 return ret;
2918}
2919
2920
2921
2922int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
2923{
2924 int ret = -1;
2925 Error *local_err = NULL;
2926 BlockReopenQueue *queue = bdrv_reopen_queue(NULL, bs, NULL, bdrv_flags);
2927
2928 ret = bdrv_reopen_multiple(bdrv_get_aio_context(bs), queue, &local_err);
2929 if (local_err != NULL) {
2930 error_propagate(errp, local_err);
2931 }
2932 return ret;
2933}
2934
2935static BlockReopenQueueEntry *find_parent_in_reopen_queue(BlockReopenQueue *q,
2936 BdrvChild *c)
2937{
2938 BlockReopenQueueEntry *entry;
2939
2940 QSIMPLEQ_FOREACH(entry, q, entry) {
2941 BlockDriverState *bs = entry->state.bs;
2942 BdrvChild *child;
2943
2944 QLIST_FOREACH(child, &bs->children, next) {
2945 if (child == c) {
2946 return entry;
2947 }
2948 }
2949 }
2950
2951 return NULL;
2952}
2953
2954static void bdrv_reopen_perm(BlockReopenQueue *q, BlockDriverState *bs,
2955 uint64_t *perm, uint64_t *shared)
2956{
2957 BdrvChild *c;
2958 BlockReopenQueueEntry *parent;
2959 uint64_t cumulative_perms = 0;
2960 uint64_t cumulative_shared_perms = BLK_PERM_ALL;
2961
2962 QLIST_FOREACH(c, &bs->parents, next_parent) {
2963 parent = find_parent_in_reopen_queue(q, c);
2964 if (!parent) {
2965 cumulative_perms |= c->perm;
2966 cumulative_shared_perms &= c->shared_perm;
2967 } else {
2968 uint64_t nperm, nshared;
2969
2970 bdrv_child_perm(parent->state.bs, bs, c, c->role, q,
2971 parent->state.perm, parent->state.shared_perm,
2972 &nperm, &nshared);
2973
2974 cumulative_perms |= nperm;
2975 cumulative_shared_perms &= nshared;
2976 }
2977 }
2978 *perm = cumulative_perms;
2979 *shared = cumulative_shared_perms;
2980}
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
3000 Error **errp)
3001{
3002 int ret = -1;
3003 Error *local_err = NULL;
3004 BlockDriver *drv;
3005 QemuOpts *opts;
3006 const char *value;
3007 bool read_only;
3008
3009 assert(reopen_state != NULL);
3010 assert(reopen_state->bs->drv != NULL);
3011 drv = reopen_state->bs->drv;
3012
3013
3014 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
3015 qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
3016 if (local_err) {
3017 error_propagate(errp, local_err);
3018 ret = -EINVAL;
3019 goto error;
3020 }
3021
3022 update_flags_from_options(&reopen_state->flags, opts);
3023
3024
3025
3026 value = qemu_opt_get(opts, "node-name");
3027 if (value) {
3028 qdict_put_str(reopen_state->options, "node-name", value);
3029 }
3030
3031 value = qemu_opt_get(opts, "driver");
3032 if (value) {
3033 qdict_put_str(reopen_state->options, "driver", value);
3034 }
3035
3036
3037
3038
3039 read_only = !(reopen_state->flags & BDRV_O_RDWR);
3040 ret = bdrv_can_set_read_only(reopen_state->bs, read_only, true, &local_err);
3041 if (local_err) {
3042 error_propagate(errp, local_err);
3043 goto error;
3044 }
3045
3046
3047 bdrv_reopen_perm(queue, reopen_state->bs,
3048 &reopen_state->perm, &reopen_state->shared_perm);
3049
3050 ret = bdrv_flush(reopen_state->bs);
3051 if (ret) {
3052 error_setg_errno(errp, -ret, "Error flushing drive");
3053 goto error;
3054 }
3055
3056 if (drv->bdrv_reopen_prepare) {
3057 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
3058 if (ret) {
3059 if (local_err != NULL) {
3060 error_propagate(errp, local_err);
3061 } else {
3062 error_setg(errp, "failed while preparing to reopen image '%s'",
3063 reopen_state->bs->filename);
3064 }
3065 goto error;
3066 }
3067 } else {
3068
3069
3070 error_setg(errp, "Block format '%s' used by node '%s' "
3071 "does not support reopening files", drv->format_name,
3072 bdrv_get_device_or_node_name(reopen_state->bs));
3073 ret = -1;
3074 goto error;
3075 }
3076
3077
3078
3079
3080 if (qdict_size(reopen_state->options)) {
3081 const QDictEntry *entry = qdict_first(reopen_state->options);
3082
3083 do {
3084 QObject *new = entry->value;
3085 QObject *old = qdict_get(reopen_state->bs->options, entry->key);
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103 if (!qobject_is_equal(new, old)) {
3104 error_setg(errp, "Cannot change the option '%s'", entry->key);
3105 ret = -EINVAL;
3106 goto error;
3107 }
3108 } while ((entry = qdict_next(reopen_state->options, entry)));
3109 }
3110
3111 ret = bdrv_check_perm(reopen_state->bs, queue, reopen_state->perm,
3112 reopen_state->shared_perm, NULL, errp);
3113 if (ret < 0) {
3114 goto error;
3115 }
3116
3117 ret = 0;
3118
3119error:
3120 qemu_opts_del(opts);
3121 return ret;
3122}
3123
3124
3125
3126
3127
3128
3129void bdrv_reopen_commit(BDRVReopenState *reopen_state)
3130{
3131 BlockDriver *drv;
3132 BlockDriverState *bs;
3133 bool old_can_write, new_can_write;
3134
3135 assert(reopen_state != NULL);
3136 bs = reopen_state->bs;
3137 drv = bs->drv;
3138 assert(drv != NULL);
3139
3140 old_can_write =
3141 !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE);
3142
3143
3144 if (drv->bdrv_reopen_commit) {
3145 drv->bdrv_reopen_commit(reopen_state);
3146 }
3147
3148
3149 QDECREF(bs->explicit_options);
3150
3151 bs->explicit_options = reopen_state->explicit_options;
3152 bs->open_flags = reopen_state->flags;
3153 bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
3154
3155 bdrv_refresh_limits(bs, NULL);
3156
3157 bdrv_set_perm(reopen_state->bs, reopen_state->perm,
3158 reopen_state->shared_perm);
3159
3160 new_can_write =
3161 !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE);
3162 if (!old_can_write && new_can_write && drv->bdrv_reopen_bitmaps_rw) {
3163 Error *local_err = NULL;
3164 if (drv->bdrv_reopen_bitmaps_rw(bs, &local_err) < 0) {
3165
3166
3167
3168
3169 error_reportf_err(local_err,
3170 "%s: Failed to make dirty bitmaps writable: ",
3171 bdrv_get_node_name(bs));
3172 }
3173 }
3174}
3175
3176
3177
3178
3179
3180void bdrv_reopen_abort(BDRVReopenState *reopen_state)
3181{
3182 BlockDriver *drv;
3183
3184 assert(reopen_state != NULL);
3185 drv = reopen_state->bs->drv;
3186 assert(drv != NULL);
3187
3188 if (drv->bdrv_reopen_abort) {
3189 drv->bdrv_reopen_abort(reopen_state);
3190 }
3191
3192 QDECREF(reopen_state->explicit_options);
3193
3194 bdrv_abort_perm_update(reopen_state->bs);
3195}
3196
3197
3198static void bdrv_close(BlockDriverState *bs)
3199{
3200 BdrvAioNotifier *ban, *ban_next;
3201 BdrvChild *child, *next;
3202
3203 assert(!bs->job);
3204 assert(!bs->refcnt);
3205
3206 bdrv_drained_begin(bs);
3207 bdrv_flush(bs);
3208 bdrv_drain(bs);
3209
3210 if (bs->drv) {
3211 bs->drv->bdrv_close(bs);
3212 bs->drv = NULL;
3213 }
3214
3215 bdrv_set_backing_hd(bs, NULL, &error_abort);
3216
3217 if (bs->file != NULL) {
3218 bdrv_unref_child(bs, bs->file);
3219 bs->file = NULL;
3220 }
3221
3222 QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
3223
3224
3225 if (child->bs->inherits_from == bs) {
3226 child->bs->inherits_from = NULL;
3227 }
3228 bdrv_detach_child(child);
3229 }
3230
3231 g_free(bs->opaque);
3232 bs->opaque = NULL;
3233 atomic_set(&bs->copy_on_read, 0);
3234 bs->backing_file[0] = '\0';
3235 bs->backing_format[0] = '\0';
3236 bs->total_sectors = 0;
3237 bs->encrypted = false;
3238 bs->sg = false;
3239 QDECREF(bs->options);
3240 QDECREF(bs->explicit_options);
3241 bs->options = NULL;
3242 bs->explicit_options = NULL;
3243 QDECREF(bs->full_open_options);
3244 bs->full_open_options = NULL;
3245
3246 bdrv_release_named_dirty_bitmaps(bs);
3247 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
3248
3249 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
3250 g_free(ban);
3251 }
3252 QLIST_INIT(&bs->aio_notifiers);
3253 bdrv_drained_end(bs);
3254}
3255
3256void bdrv_close_all(void)
3257{
3258 block_job_cancel_sync_all();
3259 nbd_export_close_all();
3260
3261
3262
3263 bdrv_drain_all();
3264
3265 blk_remove_all_bs();
3266 blockdev_close_all_bdrv_states();
3267
3268 assert(QTAILQ_EMPTY(&all_bdrv_states));
3269}
3270
3271static bool should_update_child(BdrvChild *c, BlockDriverState *to)
3272{
3273 BdrvChild *to_c;
3274
3275 if (c->role->stay_at_node) {
3276 return false;
3277 }
3278
3279 if (c->role == &child_backing) {
3280
3281
3282
3283 QLIST_FOREACH(to_c, &to->children, next) {
3284 if (to_c == c) {
3285 break;
3286 }
3287 }
3288 if (to_c) {
3289 return false;
3290 }
3291 }
3292
3293 return true;
3294}
3295
3296void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
3297 Error **errp)
3298{
3299 BdrvChild *c, *next;
3300 GSList *list = NULL, *p;
3301 uint64_t old_perm, old_shared;
3302 uint64_t perm = 0, shared = BLK_PERM_ALL;
3303 int ret;
3304
3305 assert(!atomic_read(&from->in_flight));
3306 assert(!atomic_read(&to->in_flight));
3307
3308
3309
3310 bdrv_ref(from);
3311
3312
3313 QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) {
3314 if (!should_update_child(c, to)) {
3315 continue;
3316 }
3317 list = g_slist_prepend(list, c);
3318 perm |= c->perm;
3319 shared &= c->shared_perm;
3320 }
3321
3322
3323
3324 ret = bdrv_check_update_perm(to, NULL, perm, shared, list, errp);
3325 if (ret < 0) {
3326 bdrv_abort_perm_update(to);
3327 goto out;
3328 }
3329
3330
3331
3332
3333 for (p = list; p != NULL; p = p->next) {
3334 c = p->data;
3335
3336 bdrv_ref(to);
3337 bdrv_replace_child_noperm(c, to);
3338 bdrv_unref(from);
3339 }
3340
3341 bdrv_get_cumulative_perm(to, &old_perm, &old_shared);
3342 bdrv_set_perm(to, old_perm | perm, old_shared | shared);
3343
3344out:
3345 g_slist_free(list);
3346 bdrv_unref(from);
3347}
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
3366 Error **errp)
3367{
3368 Error *local_err = NULL;
3369
3370 bdrv_set_backing_hd(bs_new, bs_top, &local_err);
3371 if (local_err) {
3372 error_propagate(errp, local_err);
3373 goto out;
3374 }
3375
3376 bdrv_replace_node(bs_top, bs_new, &local_err);
3377 if (local_err) {
3378 error_propagate(errp, local_err);
3379 bdrv_set_backing_hd(bs_new, NULL, &error_abort);
3380 goto out;
3381 }
3382
3383
3384
3385out:
3386 bdrv_unref(bs_new);
3387}
3388
3389static void bdrv_delete(BlockDriverState *bs)
3390{
3391 assert(!bs->job);
3392 assert(bdrv_op_blocker_is_empty(bs));
3393 assert(!bs->refcnt);
3394
3395 bdrv_close(bs);
3396
3397
3398 if (bs->node_name[0] != '\0') {
3399 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
3400 }
3401 QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
3402
3403 g_free(bs);
3404}
3405
3406
3407
3408
3409
3410
3411
3412
3413int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix)
3414{
3415 if (bs->drv == NULL) {
3416 return -ENOMEDIUM;
3417 }
3418 if (bs->drv->bdrv_check == NULL) {
3419 return -ENOTSUP;
3420 }
3421
3422 memset(res, 0, sizeof(*res));
3423 return bs->drv->bdrv_check(bs, res, fix);
3424}
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434int bdrv_change_backing_file(BlockDriverState *bs,
3435 const char *backing_file, const char *backing_fmt)
3436{
3437 BlockDriver *drv = bs->drv;
3438 int ret;
3439
3440 if (!drv) {
3441 return -ENOMEDIUM;
3442 }
3443
3444
3445 if (backing_fmt && !backing_file) {
3446 return -EINVAL;
3447 }
3448
3449 if (drv->bdrv_change_backing_file != NULL) {
3450 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
3451 } else {
3452 ret = -ENOTSUP;
3453 }
3454
3455 if (ret == 0) {
3456 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
3457 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
3458 }
3459 return ret;
3460}
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
3473 BlockDriverState *bs)
3474{
3475 while (active && bs != backing_bs(active)) {
3476 active = backing_bs(active);
3477 }
3478
3479 return active;
3480}
3481
3482
3483BlockDriverState *bdrv_find_base(BlockDriverState *bs)
3484{
3485 return bdrv_find_overlay(bs, NULL);
3486}
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
3518 const char *backing_file_str)
3519{
3520 BdrvChild *c, *next;
3521 Error *local_err = NULL;
3522 int ret = -EIO;
3523
3524 bdrv_ref(top);
3525
3526 if (!top->drv || !base->drv) {
3527 goto exit;
3528 }
3529
3530
3531 if (!bdrv_chain_contains(top, base)) {
3532 goto exit;
3533 }
3534
3535
3536
3537
3538 backing_file_str = backing_file_str ? backing_file_str : base->filename;
3539
3540 QLIST_FOREACH_SAFE(c, &top->parents, next_parent, next) {
3541
3542 GSList *ignore_children = g_slist_prepend(NULL, c);
3543 bdrv_check_update_perm(base, NULL, c->perm, c->shared_perm,
3544 ignore_children, &local_err);
3545 if (local_err) {
3546 ret = -EPERM;
3547 error_report_err(local_err);
3548 goto exit;
3549 }
3550 g_slist_free(ignore_children);
3551
3552
3553 if (c->role->update_filename) {
3554 ret = c->role->update_filename(c, base, backing_file_str,
3555 &local_err);
3556 if (ret < 0) {
3557 bdrv_abort_perm_update(base);
3558 error_report_err(local_err);
3559 goto exit;
3560 }
3561 }
3562
3563
3564
3565 bdrv_ref(base);
3566 bdrv_replace_child(c, base);
3567 bdrv_unref(top);
3568 }
3569
3570 ret = 0;
3571exit:
3572 bdrv_unref(top);
3573 return ret;
3574}
3575
3576
3577
3578
3579int bdrv_truncate(BdrvChild *child, int64_t offset, PreallocMode prealloc,
3580 Error **errp)
3581{
3582 BlockDriverState *bs = child->bs;
3583 BlockDriver *drv = bs->drv;
3584 int ret;
3585
3586 assert(child->perm & BLK_PERM_RESIZE);
3587
3588
3589 if (!drv) {
3590 error_setg(errp, "No medium inserted");
3591 return -ENOMEDIUM;
3592 }
3593 if (!drv->bdrv_truncate) {
3594 if (bs->file && drv->is_filter) {
3595 return bdrv_truncate(bs->file, offset, prealloc, errp);
3596 }
3597 error_setg(errp, "Image format driver does not support resize");
3598 return -ENOTSUP;
3599 }
3600 if (bs->read_only) {
3601 error_setg(errp, "Image is read-only");
3602 return -EACCES;
3603 }
3604
3605 assert(!(bs->open_flags & BDRV_O_INACTIVE));
3606
3607 ret = drv->bdrv_truncate(bs, offset, prealloc, errp);
3608 if (ret < 0) {
3609 return ret;
3610 }
3611 ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
3612 if (ret < 0) {
3613 error_setg_errno(errp, -ret, "Could not refresh total sector count");
3614 } else {
3615 offset = bs->total_sectors * BDRV_SECTOR_SIZE;
3616 }
3617 bdrv_dirty_bitmap_truncate(bs, offset);
3618 bdrv_parent_cb_resize(bs);
3619 atomic_inc(&bs->write_gen);
3620 return ret;
3621}
3622
3623
3624
3625
3626
3627int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
3628{
3629 BlockDriver *drv = bs->drv;
3630 if (!drv) {
3631 return -ENOMEDIUM;
3632 }
3633 if (drv->bdrv_get_allocated_file_size) {
3634 return drv->bdrv_get_allocated_file_size(bs);
3635 }
3636 if (bs->file) {
3637 return bdrv_get_allocated_file_size(bs->file->bs);
3638 }
3639 return -ENOTSUP;
3640}
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
3666 BlockDriverState *in_bs, Error **errp)
3667{
3668 if (!drv->bdrv_measure) {
3669 error_setg(errp, "Block driver '%s' does not support size measurement",
3670 drv->format_name);
3671 return NULL;
3672 }
3673
3674 return drv->bdrv_measure(opts, in_bs, errp);
3675}
3676
3677
3678
3679
3680int64_t bdrv_nb_sectors(BlockDriverState *bs)
3681{
3682 BlockDriver *drv = bs->drv;
3683
3684 if (!drv)
3685 return -ENOMEDIUM;
3686
3687 if (drv->has_variable_length) {
3688 int ret = refresh_total_sectors(bs, bs->total_sectors);
3689 if (ret < 0) {
3690 return ret;
3691 }
3692 }
3693 return bs->total_sectors;
3694}
3695
3696
3697
3698
3699
3700int64_t bdrv_getlength(BlockDriverState *bs)
3701{
3702 int64_t ret = bdrv_nb_sectors(bs);
3703
3704 ret = ret > INT64_MAX / BDRV_SECTOR_SIZE ? -EFBIG : ret;
3705 return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
3706}
3707
3708
3709void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
3710{
3711 int64_t nb_sectors = bdrv_nb_sectors(bs);
3712
3713 *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
3714}
3715
3716bool bdrv_is_sg(BlockDriverState *bs)
3717{
3718 return bs->sg;
3719}
3720
3721bool bdrv_is_encrypted(BlockDriverState *bs)
3722{
3723 if (bs->backing && bs->backing->bs->encrypted) {
3724 return true;
3725 }
3726 return bs->encrypted;
3727}
3728
3729const char *bdrv_get_format_name(BlockDriverState *bs)
3730{
3731 return bs->drv ? bs->drv->format_name : NULL;
3732}
3733
3734static int qsort_strcmp(const void *a, const void *b)
3735{
3736 return strcmp(*(char *const *)a, *(char *const *)b);
3737}
3738
3739void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
3740 void *opaque)
3741{
3742 BlockDriver *drv;
3743 int count = 0;
3744 int i;
3745 const char **formats = NULL;
3746
3747 QLIST_FOREACH(drv, &bdrv_drivers, list) {
3748 if (drv->format_name) {
3749 bool found = false;
3750 int i = count;
3751 while (formats && i && !found) {
3752 found = !strcmp(formats[--i], drv->format_name);
3753 }
3754
3755 if (!found) {
3756 formats = g_renew(const char *, formats, count + 1);
3757 formats[count++] = drv->format_name;
3758 }
3759 }
3760 }
3761
3762 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); i++) {
3763 const char *format_name = block_driver_modules[i].format_name;
3764
3765 if (format_name) {
3766 bool found = false;
3767 int j = count;
3768
3769 while (formats && j && !found) {
3770 found = !strcmp(formats[--j], format_name);
3771 }
3772
3773 if (!found) {
3774 formats = g_renew(const char *, formats, count + 1);
3775 formats[count++] = format_name;
3776 }
3777 }
3778 }
3779
3780 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
3781
3782 for (i = 0; i < count; i++) {
3783 it(opaque, formats[i]);
3784 }
3785
3786 g_free(formats);
3787}
3788
3789
3790BlockDriverState *bdrv_find_node(const char *node_name)
3791{
3792 BlockDriverState *bs;
3793
3794 assert(node_name);
3795
3796 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
3797 if (!strcmp(node_name, bs->node_name)) {
3798 return bs;
3799 }
3800 }
3801 return NULL;
3802}
3803
3804
3805BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
3806{
3807 BlockDeviceInfoList *list, *entry;
3808 BlockDriverState *bs;
3809
3810 list = NULL;
3811 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
3812 BlockDeviceInfo *info = bdrv_block_device_info(NULL, bs, errp);
3813 if (!info) {
3814 qapi_free_BlockDeviceInfoList(list);
3815 return NULL;
3816 }
3817 entry = g_malloc0(sizeof(*entry));
3818 entry->value = info;
3819 entry->next = list;
3820 list = entry;
3821 }
3822
3823 return list;
3824}
3825
3826BlockDriverState *bdrv_lookup_bs(const char *device,
3827 const char *node_name,
3828 Error **errp)
3829{
3830 BlockBackend *blk;
3831 BlockDriverState *bs;
3832
3833 if (device) {
3834 blk = blk_by_name(device);
3835
3836 if (blk) {
3837 bs = blk_bs(blk);
3838 if (!bs) {
3839 error_setg(errp, "Device '%s' has no medium", device);
3840 }
3841
3842 return bs;
3843 }
3844 }
3845
3846 if (node_name) {
3847 bs = bdrv_find_node(node_name);
3848
3849 if (bs) {
3850 return bs;
3851 }
3852 }
3853
3854 error_setg(errp, "Cannot find device=%s nor node_name=%s",
3855 device ? device : "",
3856 node_name ? node_name : "");
3857 return NULL;
3858}
3859
3860
3861
3862bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
3863{
3864 while (top && top != base) {
3865 top = backing_bs(top);
3866 }
3867
3868 return top != NULL;
3869}
3870
3871BlockDriverState *bdrv_next_node(BlockDriverState *bs)
3872{
3873 if (!bs) {
3874 return QTAILQ_FIRST(&graph_bdrv_states);
3875 }
3876 return QTAILQ_NEXT(bs, node_list);
3877}
3878
3879const char *bdrv_get_node_name(const BlockDriverState *bs)
3880{
3881 return bs->node_name;
3882}
3883
3884const char *bdrv_get_parent_name(const BlockDriverState *bs)
3885{
3886 BdrvChild *c;
3887 const char *name;
3888
3889
3890 QLIST_FOREACH(c, &bs->parents, next_parent) {
3891 if (c->role->get_name) {
3892 name = c->role->get_name(c);
3893 if (name && *name) {
3894 return name;
3895 }
3896 }
3897 }
3898
3899 return NULL;
3900}
3901
3902
3903const char *bdrv_get_device_name(const BlockDriverState *bs)
3904{
3905 return bdrv_get_parent_name(bs) ?: "";
3906}
3907
3908
3909
3910
3911
3912const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
3913{
3914 return bdrv_get_parent_name(bs) ?: bs->node_name;
3915}
3916
3917int bdrv_get_flags(BlockDriverState *bs)
3918{
3919 return bs->open_flags;
3920}
3921
3922int bdrv_has_zero_init_1(BlockDriverState *bs)
3923{
3924 return 1;
3925}
3926
3927int bdrv_has_zero_init(BlockDriverState *bs)
3928{
3929 if (!bs->drv) {
3930 return 0;
3931 }
3932
3933
3934
3935 if (bs->backing) {
3936 return 0;
3937 }
3938 if (bs->drv->bdrv_has_zero_init) {
3939 return bs->drv->bdrv_has_zero_init(bs);
3940 }
3941 if (bs->file && bs->drv->is_filter) {
3942 return bdrv_has_zero_init(bs->file->bs);
3943 }
3944
3945
3946 return 0;
3947}
3948
3949bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs)
3950{
3951 BlockDriverInfo bdi;
3952
3953 if (bs->backing) {
3954 return false;
3955 }
3956
3957 if (bdrv_get_info(bs, &bdi) == 0) {
3958 return bdi.unallocated_blocks_are_zero;
3959 }
3960
3961 return false;
3962}
3963
3964bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
3965{
3966 BlockDriverInfo bdi;
3967
3968 if (!(bs->open_flags & BDRV_O_UNMAP)) {
3969 return false;
3970 }
3971
3972 if (bdrv_get_info(bs, &bdi) == 0) {
3973 return bdi.can_write_zeroes_with_unmap;
3974 }
3975
3976 return false;
3977}
3978
3979const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
3980{
3981 if (bs->backing && bs->backing->bs->encrypted)
3982 return bs->backing_file;
3983 else if (bs->encrypted)
3984 return bs->filename;
3985 else
3986 return NULL;
3987}
3988
3989void bdrv_get_backing_filename(BlockDriverState *bs,
3990 char *filename, int filename_size)
3991{
3992 pstrcpy(filename, filename_size, bs->backing_file);
3993}
3994
3995int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
3996{
3997 BlockDriver *drv = bs->drv;
3998
3999 if (!drv) {
4000 return -ENOMEDIUM;
4001 }
4002 if (!drv->bdrv_get_info) {
4003 if (bs->file && drv->is_filter) {
4004 return bdrv_get_info(bs->file->bs, bdi);
4005 }
4006 return -ENOTSUP;
4007 }
4008 memset(bdi, 0, sizeof(*bdi));
4009 return drv->bdrv_get_info(bs, bdi);
4010}
4011
4012ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
4013{
4014 BlockDriver *drv = bs->drv;
4015 if (drv && drv->bdrv_get_specific_info) {
4016 return drv->bdrv_get_specific_info(bs);
4017 }
4018 return NULL;
4019}
4020
4021void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event)
4022{
4023 if (!bs || !bs->drv || !bs->drv->bdrv_debug_event) {
4024 return;
4025 }
4026
4027 bs->drv->bdrv_debug_event(bs, event);
4028}
4029
4030int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
4031 const char *tag)
4032{
4033 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
4034 bs = bs->file ? bs->file->bs : NULL;
4035 }
4036
4037 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
4038 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
4039 }
4040
4041 return -ENOTSUP;
4042}
4043
4044int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
4045{
4046 while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
4047 bs = bs->file ? bs->file->bs : NULL;
4048 }
4049
4050 if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
4051 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
4052 }
4053
4054 return -ENOTSUP;
4055}
4056
4057int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
4058{
4059 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
4060 bs = bs->file ? bs->file->bs : NULL;
4061 }
4062
4063 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
4064 return bs->drv->bdrv_debug_resume(bs, tag);
4065 }
4066
4067 return -ENOTSUP;
4068}
4069
4070bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
4071{
4072 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
4073 bs = bs->file ? bs->file->bs : NULL;
4074 }
4075
4076 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
4077 return bs->drv->bdrv_debug_is_suspended(bs, tag);
4078 }
4079
4080 return false;
4081}
4082
4083
4084
4085
4086
4087BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
4088 const char *backing_file)
4089{
4090 char *filename_full = NULL;
4091 char *backing_file_full = NULL;
4092 char *filename_tmp = NULL;
4093 int is_protocol = 0;
4094 BlockDriverState *curr_bs = NULL;
4095 BlockDriverState *retval = NULL;
4096 Error *local_error = NULL;
4097
4098 if (!bs || !bs->drv || !backing_file) {
4099 return NULL;
4100 }
4101
4102 filename_full = g_malloc(PATH_MAX);
4103 backing_file_full = g_malloc(PATH_MAX);
4104 filename_tmp = g_malloc(PATH_MAX);
4105
4106 is_protocol = path_has_protocol(backing_file);
4107
4108 for (curr_bs = bs; curr_bs->backing; curr_bs = curr_bs->backing->bs) {
4109
4110
4111
4112 if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
4113 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
4114 retval = curr_bs->backing->bs;
4115 break;
4116 }
4117
4118 bdrv_get_full_backing_filename(curr_bs, backing_file_full, PATH_MAX,
4119 &local_error);
4120 if (local_error == NULL) {
4121 if (strcmp(backing_file, backing_file_full) == 0) {
4122 retval = curr_bs->backing->bs;
4123 break;
4124 }
4125 } else {
4126 error_free(local_error);
4127 local_error = NULL;
4128 }
4129 } else {
4130
4131
4132 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
4133 backing_file);
4134
4135
4136 if (!realpath(filename_tmp, filename_full)) {
4137 continue;
4138 }
4139
4140
4141
4142 path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
4143 curr_bs->backing_file);
4144
4145 if (!realpath(filename_tmp, backing_file_full)) {
4146 continue;
4147 }
4148
4149 if (strcmp(backing_file_full, filename_full) == 0) {
4150 retval = curr_bs->backing->bs;
4151 break;
4152 }
4153 }
4154 }
4155
4156 g_free(filename_full);
4157 g_free(backing_file_full);
4158 g_free(filename_tmp);
4159 return retval;
4160}
4161
4162void bdrv_init(void)
4163{
4164 module_call_init(MODULE_INIT_BLOCK);
4165}
4166
4167void bdrv_init_with_whitelist(void)
4168{
4169 use_bdrv_whitelist = 1;
4170 bdrv_init();
4171}
4172
4173void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
4174{
4175 BdrvChild *child, *parent;
4176 uint64_t perm, shared_perm;
4177 Error *local_err = NULL;
4178 int ret;
4179
4180 if (!bs->drv) {
4181 return;
4182 }
4183
4184 if (!(bs->open_flags & BDRV_O_INACTIVE)) {
4185 return;
4186 }
4187
4188 QLIST_FOREACH(child, &bs->children, next) {
4189 bdrv_invalidate_cache(child->bs, &local_err);
4190 if (local_err) {
4191 error_propagate(errp, local_err);
4192 return;
4193 }
4194 }
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209 bs->open_flags &= ~BDRV_O_INACTIVE;
4210 bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
4211 ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, &local_err);
4212 if (ret < 0) {
4213 bs->open_flags |= BDRV_O_INACTIVE;
4214 error_propagate(errp, local_err);
4215 return;
4216 }
4217 bdrv_set_perm(bs, perm, shared_perm);
4218
4219 if (bs->drv->bdrv_invalidate_cache) {
4220 bs->drv->bdrv_invalidate_cache(bs, &local_err);
4221 if (local_err) {
4222 bs->open_flags |= BDRV_O_INACTIVE;
4223 error_propagate(errp, local_err);
4224 return;
4225 }
4226 }
4227
4228 ret = refresh_total_sectors(bs, bs->total_sectors);
4229 if (ret < 0) {
4230 bs->open_flags |= BDRV_O_INACTIVE;
4231 error_setg_errno(errp, -ret, "Could not refresh total sector count");
4232 return;
4233 }
4234
4235 QLIST_FOREACH(parent, &bs->parents, next_parent) {
4236 if (parent->role->activate) {
4237 parent->role->activate(parent, &local_err);
4238 if (local_err) {
4239 error_propagate(errp, local_err);
4240 return;
4241 }
4242 }
4243 }
4244}
4245
4246void bdrv_invalidate_cache_all(Error **errp)
4247{
4248 BlockDriverState *bs;
4249 Error *local_err = NULL;
4250 BdrvNextIterator it;
4251
4252 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
4253 AioContext *aio_context = bdrv_get_aio_context(bs);
4254
4255 aio_context_acquire(aio_context);
4256 bdrv_invalidate_cache(bs, &local_err);
4257 aio_context_release(aio_context);
4258 if (local_err) {
4259 error_propagate(errp, local_err);
4260 bdrv_next_cleanup(&it);
4261 return;
4262 }
4263 }
4264}
4265
4266static int bdrv_inactivate_recurse(BlockDriverState *bs,
4267 bool setting_flag)
4268{
4269 BdrvChild *child, *parent;
4270 int ret;
4271
4272 if (!bs->drv) {
4273 return -ENOMEDIUM;
4274 }
4275
4276 if (!setting_flag && bs->drv->bdrv_inactivate) {
4277 ret = bs->drv->bdrv_inactivate(bs);
4278 if (ret < 0) {
4279 return ret;
4280 }
4281 }
4282
4283 if (setting_flag && !(bs->open_flags & BDRV_O_INACTIVE)) {
4284 uint64_t perm, shared_perm;
4285
4286 QLIST_FOREACH(parent, &bs->parents, next_parent) {
4287 if (parent->role->inactivate) {
4288 ret = parent->role->inactivate(parent);
4289 if (ret < 0) {
4290 return ret;
4291 }
4292 }
4293 }
4294
4295 bs->open_flags |= BDRV_O_INACTIVE;
4296
4297
4298 bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
4299 bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, &error_abort);
4300 bdrv_set_perm(bs, perm, shared_perm);
4301 }
4302
4303 QLIST_FOREACH(child, &bs->children, next) {
4304 ret = bdrv_inactivate_recurse(child->bs, setting_flag);
4305 if (ret < 0) {
4306 return ret;
4307 }
4308 }
4309
4310
4311
4312 bdrv_release_persistent_dirty_bitmaps(bs);
4313
4314 return 0;
4315}
4316
4317int bdrv_inactivate_all(void)
4318{
4319 BlockDriverState *bs = NULL;
4320 BdrvNextIterator it;
4321 int ret = 0;
4322 int pass;
4323
4324 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
4325 aio_context_acquire(bdrv_get_aio_context(bs));
4326 }
4327
4328
4329
4330
4331
4332 for (pass = 0; pass < 2; pass++) {
4333 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
4334 ret = bdrv_inactivate_recurse(bs, pass);
4335 if (ret < 0) {
4336 bdrv_next_cleanup(&it);
4337 goto out;
4338 }
4339 }
4340 }
4341
4342out:
4343 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
4344 aio_context_release(bdrv_get_aio_context(bs));
4345 }
4346
4347 return ret;
4348}
4349
4350
4351
4352
4353
4354
4355
4356bool bdrv_is_inserted(BlockDriverState *bs)
4357{
4358 BlockDriver *drv = bs->drv;
4359 BdrvChild *child;
4360
4361 if (!drv) {
4362 return false;
4363 }
4364 if (drv->bdrv_is_inserted) {
4365 return drv->bdrv_is_inserted(bs);
4366 }
4367 QLIST_FOREACH(child, &bs->children, next) {
4368 if (!bdrv_is_inserted(child->bs)) {
4369 return false;
4370 }
4371 }
4372 return true;
4373}
4374
4375
4376
4377
4378void bdrv_eject(BlockDriverState *bs, bool eject_flag)
4379{
4380 BlockDriver *drv = bs->drv;
4381
4382 if (drv && drv->bdrv_eject) {
4383 drv->bdrv_eject(bs, eject_flag);
4384 }
4385}
4386
4387
4388
4389
4390
4391void bdrv_lock_medium(BlockDriverState *bs, bool locked)
4392{
4393 BlockDriver *drv = bs->drv;
4394
4395 trace_bdrv_lock_medium(bs, locked);
4396
4397 if (drv && drv->bdrv_lock_medium) {
4398 drv->bdrv_lock_medium(bs, locked);
4399 }
4400}
4401
4402
4403void bdrv_ref(BlockDriverState *bs)
4404{
4405 bs->refcnt++;
4406}
4407
4408
4409
4410
4411void bdrv_unref(BlockDriverState *bs)
4412{
4413 if (!bs) {
4414 return;
4415 }
4416 assert(bs->refcnt > 0);
4417 if (--bs->refcnt == 0) {
4418 bdrv_delete(bs);
4419 }
4420}
4421
4422struct BdrvOpBlocker {
4423 Error *reason;
4424 QLIST_ENTRY(BdrvOpBlocker) list;
4425};
4426
4427bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
4428{
4429 BdrvOpBlocker *blocker;
4430 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
4431 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
4432 blocker = QLIST_FIRST(&bs->op_blockers[op]);
4433 error_propagate(errp, error_copy(blocker->reason));
4434 error_prepend(errp, "Node '%s' is busy: ",
4435 bdrv_get_device_or_node_name(bs));
4436 return true;
4437 }
4438 return false;
4439}
4440
4441void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
4442{
4443 BdrvOpBlocker *blocker;
4444 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
4445
4446 blocker = g_new0(BdrvOpBlocker, 1);
4447 blocker->reason = reason;
4448 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
4449}
4450
4451void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
4452{
4453 BdrvOpBlocker *blocker, *next;
4454 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
4455 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
4456 if (blocker->reason == reason) {
4457 QLIST_REMOVE(blocker, list);
4458 g_free(blocker);
4459 }
4460 }
4461}
4462
4463void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
4464{
4465 int i;
4466 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
4467 bdrv_op_block(bs, i, reason);
4468 }
4469}
4470
4471void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
4472{
4473 int i;
4474 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
4475 bdrv_op_unblock(bs, i, reason);
4476 }
4477}
4478
4479bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
4480{
4481 int i;
4482
4483 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
4484 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
4485 return false;
4486 }
4487 }
4488 return true;
4489}
4490
4491void bdrv_img_create(const char *filename, const char *fmt,
4492 const char *base_filename, const char *base_fmt,
4493 char *options, uint64_t img_size, int flags, bool quiet,
4494 Error **errp)
4495{
4496 QemuOptsList *create_opts = NULL;
4497 QemuOpts *opts = NULL;
4498 const char *backing_fmt, *backing_file;
4499 int64_t size;
4500 BlockDriver *drv, *proto_drv;
4501 Error *local_err = NULL;
4502 int ret = 0;
4503
4504
4505 drv = bdrv_find_format(fmt);
4506 if (!drv) {
4507 error_setg(errp, "Unknown file format '%s'", fmt);
4508 return;
4509 }
4510
4511 proto_drv = bdrv_find_protocol(filename, true, errp);
4512 if (!proto_drv) {
4513 return;
4514 }
4515
4516 if (!drv->create_opts) {
4517 error_setg(errp, "Format driver '%s' does not support image creation",
4518 drv->format_name);
4519 return;
4520 }
4521
4522 if (!proto_drv->create_opts) {
4523 error_setg(errp, "Protocol driver '%s' does not support image creation",
4524 proto_drv->format_name);
4525 return;
4526 }
4527
4528 create_opts = qemu_opts_append(create_opts, drv->create_opts);
4529 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
4530
4531
4532 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
4533 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
4534
4535
4536 if (options) {
4537 qemu_opts_do_parse(opts, options, NULL, &local_err);
4538 if (local_err) {
4539 error_report_err(local_err);
4540 local_err = NULL;
4541 error_setg(errp, "Invalid options for file format '%s'", fmt);
4542 goto out;
4543 }
4544 }
4545
4546 if (base_filename) {
4547 qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
4548 if (local_err) {
4549 error_setg(errp, "Backing file not supported for file format '%s'",
4550 fmt);
4551 goto out;
4552 }
4553 }
4554
4555 if (base_fmt) {
4556 qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
4557 if (local_err) {
4558 error_setg(errp, "Backing file format not supported for file "
4559 "format '%s'", fmt);
4560 goto out;
4561 }
4562 }
4563
4564 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
4565 if (backing_file) {
4566 if (!strcmp(filename, backing_file)) {
4567 error_setg(errp, "Error: Trying to create an image with the "
4568 "same filename as the backing file");
4569 goto out;
4570 }
4571 }
4572
4573 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
4574
4575
4576
4577 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, img_size);
4578 if (backing_file && !(flags & BDRV_O_NO_BACKING)) {
4579 BlockDriverState *bs;
4580 char *full_backing = g_new0(char, PATH_MAX);
4581 int back_flags;
4582 QDict *backing_options = NULL;
4583
4584 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
4585 full_backing, PATH_MAX,
4586 &local_err);
4587 if (local_err) {
4588 g_free(full_backing);
4589 goto out;
4590 }
4591
4592
4593 back_flags = flags;
4594 back_flags &= ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
4595
4596 backing_options = qdict_new();
4597 if (backing_fmt) {
4598 qdict_put_str(backing_options, "driver", backing_fmt);
4599 }
4600 qdict_put_bool(backing_options, BDRV_OPT_FORCE_SHARE, true);
4601
4602 bs = bdrv_open(full_backing, NULL, backing_options, back_flags,
4603 &local_err);
4604 g_free(full_backing);
4605 if (!bs && size != -1) {
4606
4607 warn_reportf_err(local_err,
4608 "Could not verify backing image. "
4609 "This may become an error in future versions.\n");
4610 local_err = NULL;
4611 } else if (!bs) {
4612
4613 error_append_hint(&local_err,
4614 "Could not open backing image to determine size.\n");
4615 goto out;
4616 } else {
4617 if (size == -1) {
4618
4619 size = bdrv_getlength(bs);
4620 if (size < 0) {
4621 error_setg_errno(errp, -size, "Could not get size of '%s'",
4622 backing_file);
4623 bdrv_unref(bs);
4624 goto out;
4625 }
4626 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
4627 }
4628 bdrv_unref(bs);
4629 }
4630 }
4631
4632 if (size == -1) {
4633 error_setg(errp, "Image creation needs a size parameter");
4634 goto out;
4635 }
4636
4637 if (!quiet) {
4638 printf("Formatting '%s', fmt=%s ", filename, fmt);
4639 qemu_opts_print(opts, " ");
4640 puts("");
4641 }
4642
4643 ret = bdrv_create(drv, filename, opts, &local_err);
4644
4645 if (ret == -EFBIG) {
4646
4647
4648
4649 const char *cluster_size_hint = "";
4650 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
4651 cluster_size_hint = " (try using a larger cluster size)";
4652 }
4653 error_setg(errp, "The image size is too large for file format '%s'"
4654 "%s", fmt, cluster_size_hint);
4655 error_free(local_err);
4656 local_err = NULL;
4657 }
4658
4659out:
4660 qemu_opts_del(opts);
4661 qemu_opts_free(create_opts);
4662 error_propagate(errp, local_err);
4663}
4664
4665AioContext *bdrv_get_aio_context(BlockDriverState *bs)
4666{
4667 return bs->aio_context;
4668}
4669
4670void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co)
4671{
4672 aio_co_enter(bdrv_get_aio_context(bs), co);
4673}
4674
4675static void bdrv_do_remove_aio_context_notifier(BdrvAioNotifier *ban)
4676{
4677 QLIST_REMOVE(ban, list);
4678 g_free(ban);
4679}
4680
4681void bdrv_detach_aio_context(BlockDriverState *bs)
4682{
4683 BdrvAioNotifier *baf, *baf_tmp;
4684 BdrvChild *child;
4685
4686 if (!bs->drv) {
4687 return;
4688 }
4689
4690 assert(!bs->walking_aio_notifiers);
4691 bs->walking_aio_notifiers = true;
4692 QLIST_FOREACH_SAFE(baf, &bs->aio_notifiers, list, baf_tmp) {
4693 if (baf->deleted) {
4694 bdrv_do_remove_aio_context_notifier(baf);
4695 } else {
4696 baf->detach_aio_context(baf->opaque);
4697 }
4698 }
4699
4700
4701
4702 bs->walking_aio_notifiers = false;
4703
4704 if (bs->drv->bdrv_detach_aio_context) {
4705 bs->drv->bdrv_detach_aio_context(bs);
4706 }
4707 QLIST_FOREACH(child, &bs->children, next) {
4708 bdrv_detach_aio_context(child->bs);
4709 }
4710
4711 bs->aio_context = NULL;
4712}
4713
4714void bdrv_attach_aio_context(BlockDriverState *bs,
4715 AioContext *new_context)
4716{
4717 BdrvAioNotifier *ban, *ban_tmp;
4718 BdrvChild *child;
4719
4720 if (!bs->drv) {
4721 return;
4722 }
4723
4724 bs->aio_context = new_context;
4725
4726 QLIST_FOREACH(child, &bs->children, next) {
4727 bdrv_attach_aio_context(child->bs, new_context);
4728 }
4729 if (bs->drv->bdrv_attach_aio_context) {
4730 bs->drv->bdrv_attach_aio_context(bs, new_context);
4731 }
4732
4733 assert(!bs->walking_aio_notifiers);
4734 bs->walking_aio_notifiers = true;
4735 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_tmp) {
4736 if (ban->deleted) {
4737 bdrv_do_remove_aio_context_notifier(ban);
4738 } else {
4739 ban->attached_aio_context(new_context, ban->opaque);
4740 }
4741 }
4742 bs->walking_aio_notifiers = false;
4743}
4744
4745void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
4746{
4747 AioContext *ctx = bdrv_get_aio_context(bs);
4748
4749 aio_disable_external(ctx);
4750 bdrv_parent_drained_begin(bs);
4751 bdrv_drain(bs);
4752
4753 while (aio_poll(ctx, false)) {
4754
4755 }
4756
4757 bdrv_detach_aio_context(bs);
4758
4759
4760
4761
4762 aio_context_acquire(new_context);
4763 bdrv_attach_aio_context(bs, new_context);
4764 bdrv_parent_drained_end(bs);
4765 aio_enable_external(ctx);
4766 aio_context_release(new_context);
4767}
4768
4769void bdrv_add_aio_context_notifier(BlockDriverState *bs,
4770 void (*attached_aio_context)(AioContext *new_context, void *opaque),
4771 void (*detach_aio_context)(void *opaque), void *opaque)
4772{
4773 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
4774 *ban = (BdrvAioNotifier){
4775 .attached_aio_context = attached_aio_context,
4776 .detach_aio_context = detach_aio_context,
4777 .opaque = opaque
4778 };
4779
4780 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
4781}
4782
4783void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
4784 void (*attached_aio_context)(AioContext *,
4785 void *),
4786 void (*detach_aio_context)(void *),
4787 void *opaque)
4788{
4789 BdrvAioNotifier *ban, *ban_next;
4790
4791 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
4792 if (ban->attached_aio_context == attached_aio_context &&
4793 ban->detach_aio_context == detach_aio_context &&
4794 ban->opaque == opaque &&
4795 ban->deleted == false)
4796 {
4797 if (bs->walking_aio_notifiers) {
4798 ban->deleted = true;
4799 } else {
4800 bdrv_do_remove_aio_context_notifier(ban);
4801 }
4802 return;
4803 }
4804 }
4805
4806 abort();
4807}
4808
4809int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
4810 BlockDriverAmendStatusCB *status_cb, void *cb_opaque)
4811{
4812 if (!bs->drv) {
4813 return -ENOMEDIUM;
4814 }
4815 if (!bs->drv->bdrv_amend_options) {
4816 return -ENOTSUP;
4817 }
4818 return bs->drv->bdrv_amend_options(bs, opts, status_cb, cb_opaque);
4819}
4820
4821
4822
4823
4824
4825
4826bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
4827 BlockDriverState *candidate)
4828{
4829
4830 if (!bs || !bs->drv) {
4831 return false;
4832 }
4833
4834
4835
4836
4837 if (!bs->drv->is_filter) {
4838 return bs == candidate;
4839 }
4840
4841
4842
4843
4844
4845 if (bs->drv->bdrv_recurse_is_first_non_filter) {
4846 return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
4847 }
4848
4849
4850
4851 return false;
4852}
4853
4854
4855
4856
4857
4858bool bdrv_is_first_non_filter(BlockDriverState *candidate)
4859{
4860 BlockDriverState *bs;
4861 BdrvNextIterator it;
4862
4863
4864 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
4865 bool perm;
4866
4867
4868 perm = bdrv_recurse_is_first_non_filter(bs, candidate);
4869
4870
4871 if (perm) {
4872 bdrv_next_cleanup(&it);
4873 return true;
4874 }
4875 }
4876
4877 return false;
4878}
4879
4880BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
4881 const char *node_name, Error **errp)
4882{
4883 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
4884 AioContext *aio_context;
4885
4886 if (!to_replace_bs) {
4887 error_setg(errp, "Node name '%s' not found", node_name);
4888 return NULL;
4889 }
4890
4891 aio_context = bdrv_get_aio_context(to_replace_bs);
4892 aio_context_acquire(aio_context);
4893
4894 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
4895 to_replace_bs = NULL;
4896 goto out;
4897 }
4898
4899
4900
4901
4902
4903
4904 if (!bdrv_recurse_is_first_non_filter(parent_bs, to_replace_bs)) {
4905 error_setg(errp, "Only top most non filter can be replaced");
4906 to_replace_bs = NULL;
4907 goto out;
4908 }
4909
4910out:
4911 aio_context_release(aio_context);
4912 return to_replace_bs;
4913}
4914
4915static bool append_open_options(QDict *d, BlockDriverState *bs)
4916{
4917 const QDictEntry *entry;
4918 QemuOptDesc *desc;
4919 BdrvChild *child;
4920 bool found_any = false;
4921 const char *p;
4922
4923 for (entry = qdict_first(bs->options); entry;
4924 entry = qdict_next(bs->options, entry))
4925 {
4926
4927 QLIST_FOREACH(child, &bs->children, next) {
4928 if (strstart(qdict_entry_key(entry), child->name, &p)
4929 && (!*p || *p == '.'))
4930 {
4931 break;
4932 }
4933 }
4934 if (child) {
4935 continue;
4936 }
4937
4938
4939 for (desc = bdrv_runtime_opts.desc; desc->name; desc++) {
4940 if (!strcmp(qdict_entry_key(entry), desc->name)) {
4941 break;
4942 }
4943 }
4944 if (desc->name) {
4945 continue;
4946 }
4947
4948 qobject_incref(qdict_entry_value(entry));
4949 qdict_put_obj(d, qdict_entry_key(entry), qdict_entry_value(entry));
4950 found_any = true;
4951 }
4952
4953 return found_any;
4954}
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968void bdrv_refresh_filename(BlockDriverState *bs)
4969{
4970 BlockDriver *drv = bs->drv;
4971 QDict *opts;
4972
4973 if (!drv) {
4974 return;
4975 }
4976
4977
4978
4979 if (bs->file) {
4980 bdrv_refresh_filename(bs->file->bs);
4981 }
4982
4983 if (drv->bdrv_refresh_filename) {
4984
4985
4986 bs->exact_filename[0] = '\0';
4987 if (bs->full_open_options) {
4988 QDECREF(bs->full_open_options);
4989 bs->full_open_options = NULL;
4990 }
4991
4992 opts = qdict_new();
4993 append_open_options(opts, bs);
4994 drv->bdrv_refresh_filename(bs, opts);
4995 QDECREF(opts);
4996 } else if (bs->file) {
4997
4998 bool has_open_options;
4999
5000 bs->exact_filename[0] = '\0';
5001 if (bs->full_open_options) {
5002 QDECREF(bs->full_open_options);
5003 bs->full_open_options = NULL;
5004 }
5005
5006 opts = qdict_new();
5007 has_open_options = append_open_options(opts, bs);
5008
5009
5010
5011 if (bs->file->bs->exact_filename[0] && !has_open_options) {
5012 strcpy(bs->exact_filename, bs->file->bs->exact_filename);
5013 }
5014
5015
5016
5017
5018
5019 if (bs->file->bs->full_open_options) {
5020 qdict_put_str(opts, "driver", drv->format_name);
5021 QINCREF(bs->file->bs->full_open_options);
5022 qdict_put(opts, "file", bs->file->bs->full_open_options);
5023
5024 bs->full_open_options = opts;
5025 } else {
5026 QDECREF(opts);
5027 }
5028 } else if (!bs->full_open_options && qdict_size(bs->options)) {
5029
5030
5031
5032
5033
5034
5035
5036 opts = qdict_new();
5037 append_open_options(opts, bs);
5038 qdict_put_str(opts, "driver", drv->format_name);
5039
5040 if (bs->exact_filename[0]) {
5041
5042
5043
5044
5045
5046
5047
5048 qdict_put_str(opts, "filename", bs->exact_filename);
5049 }
5050
5051 bs->full_open_options = opts;
5052 }
5053
5054 if (bs->exact_filename[0]) {
5055 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
5056 } else if (bs->full_open_options) {
5057 QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
5058 snprintf(bs->filename, sizeof(bs->filename), "json:%s",
5059 qstring_get_str(json));
5060 QDECREF(json);
5061 }
5062}
5063
5064
5065
5066
5067
5068void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs,
5069 Error **errp)
5070{
5071
5072 if (!parent_bs->drv || !parent_bs->drv->bdrv_add_child) {
5073 error_setg(errp, "The node %s does not support adding a child",
5074 bdrv_get_device_or_node_name(parent_bs));
5075 return;
5076 }
5077
5078 if (!QLIST_EMPTY(&child_bs->parents)) {
5079 error_setg(errp, "The node %s already has a parent",
5080 child_bs->node_name);
5081 return;
5082 }
5083
5084 parent_bs->drv->bdrv_add_child(parent_bs, child_bs, errp);
5085}
5086
5087void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child, Error **errp)
5088{
5089 BdrvChild *tmp;
5090
5091 if (!parent_bs->drv || !parent_bs->drv->bdrv_del_child) {
5092 error_setg(errp, "The node %s does not support removing a child",
5093 bdrv_get_device_or_node_name(parent_bs));
5094 return;
5095 }
5096
5097 QLIST_FOREACH(tmp, &parent_bs->children, next) {
5098 if (tmp == child) {
5099 break;
5100 }
5101 }
5102
5103 if (!tmp) {
5104 error_setg(errp, "The node %s does not have a child named %s",
5105 bdrv_get_device_or_node_name(parent_bs),
5106 bdrv_get_device_or_node_name(child->bs));
5107 return;
5108 }
5109
5110 parent_bs->drv->bdrv_del_child(parent_bs, child, errp);
5111}
5112
5113bool bdrv_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
5114 uint32_t granularity, Error **errp)
5115{
5116 BlockDriver *drv = bs->drv;
5117
5118 if (!drv) {
5119 error_setg_errno(errp, ENOMEDIUM,
5120 "Can't store persistent bitmaps to %s",
5121 bdrv_get_device_or_node_name(bs));
5122 return false;
5123 }
5124
5125 if (!drv->bdrv_can_store_new_dirty_bitmap) {
5126 error_setg_errno(errp, ENOTSUP,
5127 "Can't store persistent bitmaps to %s",
5128 bdrv_get_device_or_node_name(bs));
5129 return false;
5130 }
5131
5132 return drv->bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp);
5133}
5134