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