1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "qemu/osdep.h"
27#include "block/trace.h"
28#include "block/block_int.h"
29#include "block/blockjob.h"
30#include "block/dirty-bitmap.h"
31#include "block/fuse.h"
32#include "block/nbd.h"
33#include "block/qdict.h"
34#include "qemu/error-report.h"
35#include "block/module_block.h"
36#include "qemu/main-loop.h"
37#include "qemu/module.h"
38#include "qapi/error.h"
39#include "qapi/qmp/qdict.h"
40#include "qapi/qmp/qjson.h"
41#include "qapi/qmp/qnull.h"
42#include "qapi/qmp/qstring.h"
43#include "qapi/qobject-output-visitor.h"
44#include "qapi/qapi-visit-block-core.h"
45#include "sysemu/block-backend.h"
46#include "qemu/notify.h"
47#include "qemu/option.h"
48#include "qemu/coroutine.h"
49#include "block/qapi.h"
50#include "qemu/timer.h"
51#include "qemu/cutils.h"
52#include "qemu/id.h"
53#include "qemu/range.h"
54#include "qemu/rcu.h"
55#include "block/coroutines.h"
56
57#ifdef CONFIG_BSD
58#include <sys/ioctl.h>
59#include <sys/queue.h>
60#if defined(HAVE_SYS_DISK_H)
61#include <sys/disk.h>
62#endif
63#endif
64
65#ifdef _WIN32
66#include <windows.h>
67#endif
68
69#define NOT_DONE 0x7fffffff
70
71
72static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
73 QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
74
75
76static QTAILQ_HEAD(, BlockDriverState) all_bdrv_states =
77 QTAILQ_HEAD_INITIALIZER(all_bdrv_states);
78
79
80static QLIST_HEAD(, BlockDriver) bdrv_drivers =
81 QLIST_HEAD_INITIALIZER(bdrv_drivers);
82
83static BlockDriverState *bdrv_open_inherit(const char *filename,
84 const char *reference,
85 QDict *options, int flags,
86 BlockDriverState *parent,
87 const BdrvChildClass *child_class,
88 BdrvChildRole child_role,
89 Error **errp);
90
91static bool bdrv_recurse_has_child(BlockDriverState *bs,
92 BlockDriverState *child);
93
94static void bdrv_replace_child_noperm(BdrvChild *child,
95 BlockDriverState *new_bs);
96static void bdrv_remove_child(BdrvChild *child, Transaction *tran);
97
98static int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
99 BlockReopenQueue *queue,
100 Transaction *change_child_tran, Error **errp);
101static void bdrv_reopen_commit(BDRVReopenState *reopen_state);
102static void bdrv_reopen_abort(BDRVReopenState *reopen_state);
103
104static bool bdrv_backing_overridden(BlockDriverState *bs);
105
106static bool bdrv_change_aio_context(BlockDriverState *bs, AioContext *ctx,
107 GHashTable *visited, Transaction *tran,
108 Error **errp);
109
110
111static int use_bdrv_whitelist;
112
113#ifdef _WIN32
114static int is_windows_drive_prefix(const char *filename)
115{
116 return (((filename[0] >= 'a' && filename[0] <= 'z') ||
117 (filename[0] >= 'A' && filename[0] <= 'Z')) &&
118 filename[1] == ':');
119}
120
121int is_windows_drive(const char *filename)
122{
123 if (is_windows_drive_prefix(filename) &&
124 filename[2] == '\0')
125 return 1;
126 if (strstart(filename, "\\\\.\\", NULL) ||
127 strstart(filename, "//./", NULL))
128 return 1;
129 return 0;
130}
131#endif
132
133size_t bdrv_opt_mem_align(BlockDriverState *bs)
134{
135 if (!bs || !bs->drv) {
136
137 return MAX(4096, qemu_real_host_page_size());
138 }
139 IO_CODE();
140
141 return bs->bl.opt_mem_alignment;
142}
143
144size_t bdrv_min_mem_align(BlockDriverState *bs)
145{
146 if (!bs || !bs->drv) {
147
148 return MAX(4096, qemu_real_host_page_size());
149 }
150 IO_CODE();
151
152 return bs->bl.min_mem_alignment;
153}
154
155
156int path_has_protocol(const char *path)
157{
158 const char *p;
159
160#ifdef _WIN32
161 if (is_windows_drive(path) ||
162 is_windows_drive_prefix(path)) {
163 return 0;
164 }
165 p = path + strcspn(path, ":/\\");
166#else
167 p = path + strcspn(path, ":/");
168#endif
169
170 return *p == ':';
171}
172
173int path_is_absolute(const char *path)
174{
175#ifdef _WIN32
176
177 if (is_windows_drive(path) || is_windows_drive_prefix(path)) {
178 return 1;
179 }
180 return (*path == '/' || *path == '\\');
181#else
182 return (*path == '/');
183#endif
184}
185
186
187
188
189char *path_combine(const char *base_path, const char *filename)
190{
191 const char *protocol_stripped = NULL;
192 const char *p, *p1;
193 char *result;
194 int len;
195
196 if (path_is_absolute(filename)) {
197 return g_strdup(filename);
198 }
199
200 if (path_has_protocol(base_path)) {
201 protocol_stripped = strchr(base_path, ':');
202 if (protocol_stripped) {
203 protocol_stripped++;
204 }
205 }
206 p = protocol_stripped ?: base_path;
207
208 p1 = strrchr(base_path, '/');
209#ifdef _WIN32
210 {
211 const char *p2;
212 p2 = strrchr(base_path, '\\');
213 if (!p1 || p2 > p1) {
214 p1 = p2;
215 }
216 }
217#endif
218 if (p1) {
219 p1++;
220 } else {
221 p1 = base_path;
222 }
223 if (p1 > p) {
224 p = p1;
225 }
226 len = p - base_path;
227
228 result = g_malloc(len + strlen(filename) + 1);
229 memcpy(result, base_path, len);
230 strcpy(result + len, filename);
231
232 return result;
233}
234
235
236
237
238
239
240void bdrv_parse_filename_strip_prefix(const char *filename, const char *prefix,
241 QDict *options)
242{
243 if (strstart(filename, prefix, &filename)) {
244
245
246 if (path_has_protocol(filename)) {
247 GString *fat_filename;
248
249
250
251 assert(!path_is_absolute(filename));
252
253
254
255 fat_filename = g_string_new("./");
256 g_string_append(fat_filename, filename);
257
258 assert(!path_has_protocol(fat_filename->str));
259
260 qdict_put(options, "filename",
261 qstring_from_gstring(fat_filename));
262 } else {
263
264
265 qdict_put_str(options, "filename", filename);
266 }
267 }
268}
269
270
271
272
273
274bool bdrv_is_read_only(BlockDriverState *bs)
275{
276 IO_CODE();
277 return !(bs->open_flags & BDRV_O_RDWR);
278}
279
280static int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
281 bool ignore_allow_rdw, Error **errp)
282{
283 IO_CODE();
284
285
286 if (bs->copy_on_read && read_only) {
287 error_setg(errp, "Can't set node '%s' to r/o with copy-on-read enabled",
288 bdrv_get_device_or_node_name(bs));
289 return -EINVAL;
290 }
291
292
293 if (!read_only && !(bs->open_flags & BDRV_O_ALLOW_RDWR) &&
294 !ignore_allow_rdw)
295 {
296 error_setg(errp, "Node '%s' is read only",
297 bdrv_get_device_or_node_name(bs));
298 return -EPERM;
299 }
300
301 return 0;
302}
303
304
305
306
307
308
309
310
311
312
313
314int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
315 Error **errp)
316{
317 int ret = 0;
318 IO_CODE();
319
320 if (!(bs->open_flags & BDRV_O_RDWR)) {
321 return 0;
322 }
323 if (!(bs->open_flags & BDRV_O_AUTO_RDONLY)) {
324 goto fail;
325 }
326
327 ret = bdrv_can_set_read_only(bs, true, false, NULL);
328 if (ret < 0) {
329 goto fail;
330 }
331
332 bs->open_flags &= ~BDRV_O_RDWR;
333
334 return 0;
335
336fail:
337 error_setg(errp, "%s", errmsg ?: "Image is read-only");
338 return -EACCES;
339}
340
341
342
343
344
345
346
347
348
349
350char *bdrv_get_full_backing_filename_from_filename(const char *backed,
351 const char *backing,
352 Error **errp)
353{
354 if (backing[0] == '\0') {
355 return NULL;
356 } else if (path_has_protocol(backing) || path_is_absolute(backing)) {
357 return g_strdup(backing);
358 } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
359 error_setg(errp, "Cannot use relative backing file names for '%s'",
360 backed);
361 return NULL;
362 } else {
363 return path_combine(backed, backing);
364 }
365}
366
367
368
369
370
371
372static char *bdrv_make_absolute_filename(BlockDriverState *relative_to,
373 const char *filename, Error **errp)
374{
375 char *dir, *full_name;
376
377 if (!filename || filename[0] == '\0') {
378 return NULL;
379 } else if (path_has_protocol(filename) || path_is_absolute(filename)) {
380 return g_strdup(filename);
381 }
382
383 dir = bdrv_dirname(relative_to, errp);
384 if (!dir) {
385 return NULL;
386 }
387
388 full_name = g_strconcat(dir, filename, NULL);
389 g_free(dir);
390 return full_name;
391}
392
393char *bdrv_get_full_backing_filename(BlockDriverState *bs, Error **errp)
394{
395 GLOBAL_STATE_CODE();
396 return bdrv_make_absolute_filename(bs, bs->backing_file, errp);
397}
398
399void bdrv_register(BlockDriver *bdrv)
400{
401 assert(bdrv->format_name);
402 GLOBAL_STATE_CODE();
403 QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
404}
405
406BlockDriverState *bdrv_new(void)
407{
408 BlockDriverState *bs;
409 int i;
410
411 GLOBAL_STATE_CODE();
412
413 bs = g_new0(BlockDriverState, 1);
414 QLIST_INIT(&bs->dirty_bitmaps);
415 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
416 QLIST_INIT(&bs->op_blockers[i]);
417 }
418 qemu_co_mutex_init(&bs->reqs_lock);
419 qemu_mutex_init(&bs->dirty_bitmap_mutex);
420 bs->refcnt = 1;
421 bs->aio_context = qemu_get_aio_context();
422
423 qemu_co_queue_init(&bs->flush_queue);
424
425 qemu_co_mutex_init(&bs->bsc_modify_lock);
426 bs->block_status_cache = g_new0(BdrvBlockStatusCache, 1);
427
428 for (i = 0; i < bdrv_drain_all_count; i++) {
429 bdrv_drained_begin(bs);
430 }
431
432 QTAILQ_INSERT_TAIL(&all_bdrv_states, bs, bs_list);
433
434 return bs;
435}
436
437static BlockDriver *bdrv_do_find_format(const char *format_name)
438{
439 BlockDriver *drv1;
440 GLOBAL_STATE_CODE();
441
442 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
443 if (!strcmp(drv1->format_name, format_name)) {
444 return drv1;
445 }
446 }
447
448 return NULL;
449}
450
451BlockDriver *bdrv_find_format(const char *format_name)
452{
453 BlockDriver *drv1;
454 int i;
455
456 GLOBAL_STATE_CODE();
457
458 drv1 = bdrv_do_find_format(format_name);
459 if (drv1) {
460 return drv1;
461 }
462
463
464 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); ++i) {
465 if (!strcmp(block_driver_modules[i].format_name, format_name)) {
466 Error *local_err = NULL;
467 int rv = block_module_load(block_driver_modules[i].library_name,
468 &local_err);
469 if (rv > 0) {
470 return bdrv_do_find_format(format_name);
471 } else if (rv < 0) {
472 error_report_err(local_err);
473 }
474 break;
475 }
476 }
477 return NULL;
478}
479
480static int bdrv_format_is_whitelisted(const char *format_name, bool read_only)
481{
482 static const char *whitelist_rw[] = {
483 CONFIG_BDRV_RW_WHITELIST
484 NULL
485 };
486 static const char *whitelist_ro[] = {
487 CONFIG_BDRV_RO_WHITELIST
488 NULL
489 };
490 const char **p;
491
492 if (!whitelist_rw[0] && !whitelist_ro[0]) {
493 return 1;
494 }
495
496 for (p = whitelist_rw; *p; p++) {
497 if (!strcmp(format_name, *p)) {
498 return 1;
499 }
500 }
501 if (read_only) {
502 for (p = whitelist_ro; *p; p++) {
503 if (!strcmp(format_name, *p)) {
504 return 1;
505 }
506 }
507 }
508 return 0;
509}
510
511int bdrv_is_whitelisted(BlockDriver *drv, bool read_only)
512{
513 GLOBAL_STATE_CODE();
514 return bdrv_format_is_whitelisted(drv->format_name, read_only);
515}
516
517bool bdrv_uses_whitelist(void)
518{
519 return use_bdrv_whitelist;
520}
521
522typedef struct CreateCo {
523 BlockDriver *drv;
524 char *filename;
525 QemuOpts *opts;
526 int ret;
527 Error *err;
528} CreateCo;
529
530int coroutine_fn bdrv_co_create(BlockDriver *drv, const char *filename,
531 QemuOpts *opts, Error **errp)
532{
533 int ret;
534 GLOBAL_STATE_CODE();
535 ERRP_GUARD();
536 assert_bdrv_graph_readable();
537
538 if (!drv->bdrv_co_create_opts) {
539 error_setg(errp, "Driver '%s' does not support image creation",
540 drv->format_name);
541 return -ENOTSUP;
542 }
543
544 ret = drv->bdrv_co_create_opts(drv, filename, opts, errp);
545 if (ret < 0 && !*errp) {
546 error_setg_errno(errp, -ret, "Could not create image");
547 }
548
549 return ret;
550}
551
552
553
554
555
556
557
558
559static int64_t create_file_fallback_truncate(BlockBackend *blk,
560 int64_t minimum_size, Error **errp)
561{
562 Error *local_err = NULL;
563 int64_t size;
564 int ret;
565
566 GLOBAL_STATE_CODE();
567
568 ret = blk_truncate(blk, minimum_size, false, PREALLOC_MODE_OFF, 0,
569 &local_err);
570 if (ret < 0 && ret != -ENOTSUP) {
571 error_propagate(errp, local_err);
572 return ret;
573 }
574
575 size = blk_getlength(blk);
576 if (size < 0) {
577 error_free(local_err);
578 error_setg_errno(errp, -size,
579 "Failed to inquire the new image file's length");
580 return size;
581 }
582
583 if (size < minimum_size) {
584
585 error_propagate(errp, local_err);
586 return -ENOTSUP;
587 }
588
589 error_free(local_err);
590 local_err = NULL;
591
592 return size;
593}
594
595
596
597
598
599static int coroutine_fn
600create_file_fallback_zero_first_sector(BlockBackend *blk,
601 int64_t current_size,
602 Error **errp)
603{
604 int64_t bytes_to_clear;
605 int ret;
606
607 GLOBAL_STATE_CODE();
608
609 bytes_to_clear = MIN(current_size, BDRV_SECTOR_SIZE);
610 if (bytes_to_clear) {
611 ret = blk_co_pwrite_zeroes(blk, 0, bytes_to_clear, BDRV_REQ_MAY_UNMAP);
612 if (ret < 0) {
613 error_setg_errno(errp, -ret,
614 "Failed to clear the new image's first sector");
615 return ret;
616 }
617 }
618
619 return 0;
620}
621
622
623
624
625
626
627int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
628 const char *filename,
629 QemuOpts *opts,
630 Error **errp)
631{
632 BlockBackend *blk;
633 QDict *options;
634 int64_t size = 0;
635 char *buf = NULL;
636 PreallocMode prealloc;
637 Error *local_err = NULL;
638 int ret;
639
640 GLOBAL_STATE_CODE();
641
642 size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
643 buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
644 prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
645 PREALLOC_MODE_OFF, &local_err);
646 g_free(buf);
647 if (local_err) {
648 error_propagate(errp, local_err);
649 return -EINVAL;
650 }
651
652 if (prealloc != PREALLOC_MODE_OFF) {
653 error_setg(errp, "Unsupported preallocation mode '%s'",
654 PreallocMode_str(prealloc));
655 return -ENOTSUP;
656 }
657
658 options = qdict_new();
659 qdict_put_str(options, "driver", drv->format_name);
660
661 blk = blk_co_new_open(filename, NULL, options,
662 BDRV_O_RDWR | BDRV_O_RESIZE, errp);
663 if (!blk) {
664 error_prepend(errp, "Protocol driver '%s' does not support image "
665 "creation, and opening the image failed: ",
666 drv->format_name);
667 return -EINVAL;
668 }
669
670 size = create_file_fallback_truncate(blk, size, errp);
671 if (size < 0) {
672 ret = size;
673 goto out;
674 }
675
676 ret = create_file_fallback_zero_first_sector(blk, size, errp);
677 if (ret < 0) {
678 goto out;
679 }
680
681 ret = 0;
682out:
683 blk_co_unref(blk);
684 return ret;
685}
686
687int coroutine_fn bdrv_co_create_file(const char *filename, QemuOpts *opts,
688 Error **errp)
689{
690 QemuOpts *protocol_opts;
691 BlockDriver *drv;
692 QDict *qdict;
693 int ret;
694
695 GLOBAL_STATE_CODE();
696
697 drv = bdrv_find_protocol(filename, true, errp);
698 if (drv == NULL) {
699 return -ENOENT;
700 }
701
702 if (!drv->create_opts) {
703 error_setg(errp, "Driver '%s' does not support image creation",
704 drv->format_name);
705 return -ENOTSUP;
706 }
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722 qdict = qemu_opts_to_qdict(opts, NULL);
723 protocol_opts = qemu_opts_from_qdict(drv->create_opts, qdict, errp);
724 if (protocol_opts == NULL) {
725 ret = -EINVAL;
726 goto out;
727 }
728
729 ret = bdrv_co_create(drv, filename, protocol_opts, errp);
730out:
731 qemu_opts_del(protocol_opts);
732 qobject_unref(qdict);
733 return ret;
734}
735
736int coroutine_fn bdrv_co_delete_file(BlockDriverState *bs, Error **errp)
737{
738 Error *local_err = NULL;
739 int ret;
740
741 IO_CODE();
742 assert(bs != NULL);
743 assert_bdrv_graph_readable();
744
745 if (!bs->drv) {
746 error_setg(errp, "Block node '%s' is not opened", bs->filename);
747 return -ENOMEDIUM;
748 }
749
750 if (!bs->drv->bdrv_co_delete_file) {
751 error_setg(errp, "Driver '%s' does not support image deletion",
752 bs->drv->format_name);
753 return -ENOTSUP;
754 }
755
756 ret = bs->drv->bdrv_co_delete_file(bs, &local_err);
757 if (ret < 0) {
758 error_propagate(errp, local_err);
759 }
760
761 return ret;
762}
763
764void coroutine_fn bdrv_co_delete_file_noerr(BlockDriverState *bs)
765{
766 Error *local_err = NULL;
767 int ret;
768 IO_CODE();
769
770 if (!bs) {
771 return;
772 }
773
774 ret = bdrv_co_delete_file(bs, &local_err);
775
776
777
778
779
780 if (ret == -ENOTSUP) {
781 error_free(local_err);
782 } else if (ret < 0) {
783 error_report_err(local_err);
784 }
785}
786
787
788
789
790
791
792
793int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
794{
795 BlockDriver *drv = bs->drv;
796 BlockDriverState *filtered = bdrv_filter_bs(bs);
797 GLOBAL_STATE_CODE();
798
799 if (drv && drv->bdrv_probe_blocksizes) {
800 return drv->bdrv_probe_blocksizes(bs, bsz);
801 } else if (filtered) {
802 return bdrv_probe_blocksizes(filtered, bsz);
803 }
804
805 return -ENOTSUP;
806}
807
808
809
810
811
812
813
814int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo)
815{
816 BlockDriver *drv = bs->drv;
817 BlockDriverState *filtered = bdrv_filter_bs(bs);
818 GLOBAL_STATE_CODE();
819
820 if (drv && drv->bdrv_probe_geometry) {
821 return drv->bdrv_probe_geometry(bs, geo);
822 } else if (filtered) {
823 return bdrv_probe_geometry(filtered, geo);
824 }
825
826 return -ENOTSUP;
827}
828
829
830
831
832
833
834
835
836
837char *create_tmp_file(Error **errp)
838{
839 int fd;
840 const char *tmpdir;
841 g_autofree char *filename = NULL;
842
843 tmpdir = g_get_tmp_dir();
844#ifndef _WIN32
845
846
847
848
849
850
851
852 if (!g_strcmp0(tmpdir, "/tmp")) {
853 tmpdir = "/var/tmp";
854 }
855#endif
856
857 filename = g_strdup_printf("%s/vl.XXXXXX", tmpdir);
858 fd = g_mkstemp(filename);
859 if (fd < 0) {
860 error_setg_errno(errp, errno, "Could not open temporary file '%s'",
861 filename);
862 return NULL;
863 }
864 close(fd);
865
866 return g_steal_pointer(&filename);
867}
868
869
870
871
872
873static BlockDriver *find_hdev_driver(const char *filename)
874{
875 int score_max = 0, score;
876 BlockDriver *drv = NULL, *d;
877 GLOBAL_STATE_CODE();
878
879 QLIST_FOREACH(d, &bdrv_drivers, list) {
880 if (d->bdrv_probe_device) {
881 score = d->bdrv_probe_device(filename);
882 if (score > score_max) {
883 score_max = score;
884 drv = d;
885 }
886 }
887 }
888
889 return drv;
890}
891
892static BlockDriver *bdrv_do_find_protocol(const char *protocol)
893{
894 BlockDriver *drv1;
895 GLOBAL_STATE_CODE();
896
897 QLIST_FOREACH(drv1, &bdrv_drivers, list) {
898 if (drv1->protocol_name && !strcmp(drv1->protocol_name, protocol)) {
899 return drv1;
900 }
901 }
902
903 return NULL;
904}
905
906BlockDriver *bdrv_find_protocol(const char *filename,
907 bool allow_protocol_prefix,
908 Error **errp)
909{
910 BlockDriver *drv1;
911 char protocol[128];
912 int len;
913 const char *p;
914 int i;
915
916 GLOBAL_STATE_CODE();
917
918
919
920
921
922
923
924
925
926 drv1 = find_hdev_driver(filename);
927 if (drv1) {
928 return drv1;
929 }
930
931 if (!path_has_protocol(filename) || !allow_protocol_prefix) {
932 return &bdrv_file;
933 }
934
935 p = strchr(filename, ':');
936 assert(p != NULL);
937 len = p - filename;
938 if (len > sizeof(protocol) - 1)
939 len = sizeof(protocol) - 1;
940 memcpy(protocol, filename, len);
941 protocol[len] = '\0';
942
943 drv1 = bdrv_do_find_protocol(protocol);
944 if (drv1) {
945 return drv1;
946 }
947
948 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); ++i) {
949 if (block_driver_modules[i].protocol_name &&
950 !strcmp(block_driver_modules[i].protocol_name, protocol)) {
951 int rv = block_module_load(block_driver_modules[i].library_name, errp);
952 if (rv > 0) {
953 drv1 = bdrv_do_find_protocol(protocol);
954 } else if (rv < 0) {
955 return NULL;
956 }
957 break;
958 }
959 }
960
961 if (!drv1) {
962 error_setg(errp, "Unknown protocol '%s'", protocol);
963 }
964 return drv1;
965}
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
982 const char *filename)
983{
984 int score_max = 0, score;
985 BlockDriver *drv = NULL, *d;
986 IO_CODE();
987
988 QLIST_FOREACH(d, &bdrv_drivers, list) {
989 if (d->bdrv_probe) {
990 score = d->bdrv_probe(buf, buf_size, filename);
991 if (score > score_max) {
992 score_max = score;
993 drv = d;
994 }
995 }
996 }
997
998 return drv;
999}
1000
1001static int find_image_format(BlockBackend *file, const char *filename,
1002 BlockDriver **pdrv, Error **errp)
1003{
1004 BlockDriver *drv;
1005 uint8_t buf[BLOCK_PROBE_BUF_SIZE];
1006 int ret = 0;
1007
1008 GLOBAL_STATE_CODE();
1009
1010
1011 if (blk_is_sg(file) || !blk_is_inserted(file) || blk_getlength(file) == 0) {
1012 *pdrv = &bdrv_raw;
1013 return ret;
1014 }
1015
1016 ret = blk_pread(file, 0, sizeof(buf), buf, 0);
1017 if (ret < 0) {
1018 error_setg_errno(errp, -ret, "Could not read image for determining its "
1019 "format");
1020 *pdrv = NULL;
1021 return ret;
1022 }
1023
1024 drv = bdrv_probe_all(buf, sizeof(buf), filename);
1025 if (!drv) {
1026 error_setg(errp, "Could not determine image format: No compatible "
1027 "driver found");
1028 *pdrv = NULL;
1029 return -ENOENT;
1030 }
1031
1032 *pdrv = drv;
1033 return 0;
1034}
1035
1036
1037
1038
1039
1040int coroutine_fn bdrv_co_refresh_total_sectors(BlockDriverState *bs,
1041 int64_t hint)
1042{
1043 BlockDriver *drv = bs->drv;
1044 IO_CODE();
1045 assert_bdrv_graph_readable();
1046
1047 if (!drv) {
1048 return -ENOMEDIUM;
1049 }
1050
1051
1052 if (bdrv_is_sg(bs))
1053 return 0;
1054
1055
1056 if (drv->bdrv_co_getlength) {
1057 int64_t length = drv->bdrv_co_getlength(bs);
1058 if (length < 0) {
1059 return length;
1060 }
1061 hint = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE);
1062 }
1063
1064 bs->total_sectors = hint;
1065
1066 if (bs->total_sectors * BDRV_SECTOR_SIZE > BDRV_MAX_LENGTH) {
1067 return -EFBIG;
1068 }
1069
1070 return 0;
1071}
1072
1073
1074
1075
1076
1077static void bdrv_join_options(BlockDriverState *bs, QDict *options,
1078 QDict *old_options)
1079{
1080 GLOBAL_STATE_CODE();
1081 if (bs->drv && bs->drv->bdrv_join_options) {
1082 bs->drv->bdrv_join_options(options, old_options);
1083 } else {
1084 qdict_join(options, old_options, false);
1085 }
1086}
1087
1088static BlockdevDetectZeroesOptions bdrv_parse_detect_zeroes(QemuOpts *opts,
1089 int open_flags,
1090 Error **errp)
1091{
1092 Error *local_err = NULL;
1093 char *value = qemu_opt_get_del(opts, "detect-zeroes");
1094 BlockdevDetectZeroesOptions detect_zeroes =
1095 qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup, value,
1096 BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF, &local_err);
1097 GLOBAL_STATE_CODE();
1098 g_free(value);
1099 if (local_err) {
1100 error_propagate(errp, local_err);
1101 return detect_zeroes;
1102 }
1103
1104 if (detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
1105 !(open_flags & BDRV_O_UNMAP))
1106 {
1107 error_setg(errp, "setting detect-zeroes to unmap is not allowed "
1108 "without setting discard operation to unmap");
1109 }
1110
1111 return detect_zeroes;
1112}
1113
1114
1115
1116
1117
1118
1119int bdrv_parse_aio(const char *mode, int *flags)
1120{
1121 if (!strcmp(mode, "threads")) {
1122
1123 } else if (!strcmp(mode, "native")) {
1124 *flags |= BDRV_O_NATIVE_AIO;
1125#ifdef CONFIG_LINUX_IO_URING
1126 } else if (!strcmp(mode, "io_uring")) {
1127 *flags |= BDRV_O_IO_URING;
1128#endif
1129 } else {
1130 return -1;
1131 }
1132
1133 return 0;
1134}
1135
1136
1137
1138
1139
1140
1141int bdrv_parse_discard_flags(const char *mode, int *flags)
1142{
1143 *flags &= ~BDRV_O_UNMAP;
1144
1145 if (!strcmp(mode, "off") || !strcmp(mode, "ignore")) {
1146
1147 } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {
1148 *flags |= BDRV_O_UNMAP;
1149 } else {
1150 return -1;
1151 }
1152
1153 return 0;
1154}
1155
1156
1157
1158
1159
1160
1161int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough)
1162{
1163 *flags &= ~BDRV_O_CACHE_MASK;
1164
1165 if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
1166 *writethrough = false;
1167 *flags |= BDRV_O_NOCACHE;
1168 } else if (!strcmp(mode, "directsync")) {
1169 *writethrough = true;
1170 *flags |= BDRV_O_NOCACHE;
1171 } else if (!strcmp(mode, "writeback")) {
1172 *writethrough = false;
1173 } else if (!strcmp(mode, "unsafe")) {
1174 *writethrough = false;
1175 *flags |= BDRV_O_NO_FLUSH;
1176 } else if (!strcmp(mode, "writethrough")) {
1177 *writethrough = true;
1178 } else {
1179 return -1;
1180 }
1181
1182 return 0;
1183}
1184
1185static char *bdrv_child_get_parent_desc(BdrvChild *c)
1186{
1187 BlockDriverState *parent = c->opaque;
1188 return g_strdup_printf("node '%s'", bdrv_get_node_name(parent));
1189}
1190
1191static void bdrv_child_cb_drained_begin(BdrvChild *child)
1192{
1193 BlockDriverState *bs = child->opaque;
1194 bdrv_do_drained_begin_quiesce(bs, NULL);
1195}
1196
1197static bool bdrv_child_cb_drained_poll(BdrvChild *child)
1198{
1199 BlockDriverState *bs = child->opaque;
1200 return bdrv_drain_poll(bs, NULL, false);
1201}
1202
1203static void bdrv_child_cb_drained_end(BdrvChild *child)
1204{
1205 BlockDriverState *bs = child->opaque;
1206 bdrv_drained_end(bs);
1207}
1208
1209static int bdrv_child_cb_inactivate(BdrvChild *child)
1210{
1211 BlockDriverState *bs = child->opaque;
1212 GLOBAL_STATE_CODE();
1213 assert(bs->open_flags & BDRV_O_INACTIVE);
1214 return 0;
1215}
1216
1217static bool bdrv_child_cb_change_aio_ctx(BdrvChild *child, AioContext *ctx,
1218 GHashTable *visited, Transaction *tran,
1219 Error **errp)
1220{
1221 BlockDriverState *bs = child->opaque;
1222 return bdrv_change_aio_context(bs, ctx, visited, tran, errp);
1223}
1224
1225
1226
1227
1228
1229
1230static void bdrv_temp_snapshot_options(int *child_flags, QDict *child_options,
1231 int parent_flags, QDict *parent_options)
1232{
1233 GLOBAL_STATE_CODE();
1234 *child_flags = (parent_flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY;
1235
1236
1237 qdict_set_default_str(child_options, BDRV_OPT_CACHE_DIRECT, "off");
1238 qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
1239
1240
1241 qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
1242 qdict_copy_default(child_options, parent_options, BDRV_OPT_DISCARD);
1243
1244
1245
1246 *child_flags &= ~BDRV_O_NATIVE_AIO;
1247}
1248
1249static void bdrv_backing_attach(BdrvChild *c)
1250{
1251 BlockDriverState *parent = c->opaque;
1252 BlockDriverState *backing_hd = c->bs;
1253
1254 GLOBAL_STATE_CODE();
1255 assert(!parent->backing_blocker);
1256 error_setg(&parent->backing_blocker,
1257 "node is used as backing hd of '%s'",
1258 bdrv_get_device_or_node_name(parent));
1259
1260 bdrv_refresh_filename(backing_hd);
1261
1262 parent->open_flags &= ~BDRV_O_NO_BACKING;
1263
1264 bdrv_op_block_all(backing_hd, parent->backing_blocker);
1265
1266 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET,
1267 parent->backing_blocker);
1268 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_STREAM,
1269 parent->backing_blocker);
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_SOURCE,
1284 parent->backing_blocker);
1285 bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_TARGET,
1286 parent->backing_blocker);
1287}
1288
1289static void bdrv_backing_detach(BdrvChild *c)
1290{
1291 BlockDriverState *parent = c->opaque;
1292
1293 GLOBAL_STATE_CODE();
1294 assert(parent->backing_blocker);
1295 bdrv_op_unblock_all(c->bs, parent->backing_blocker);
1296 error_free(parent->backing_blocker);
1297 parent->backing_blocker = NULL;
1298}
1299
1300static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base,
1301 const char *filename, Error **errp)
1302{
1303 BlockDriverState *parent = c->opaque;
1304 bool read_only = bdrv_is_read_only(parent);
1305 int ret;
1306 GLOBAL_STATE_CODE();
1307
1308 if (read_only) {
1309 ret = bdrv_reopen_set_read_only(parent, false, errp);
1310 if (ret < 0) {
1311 return ret;
1312 }
1313 }
1314
1315 ret = bdrv_change_backing_file(parent, filename,
1316 base->drv ? base->drv->format_name : "",
1317 false);
1318 if (ret < 0) {
1319 error_setg_errno(errp, -ret, "Could not update backing file link");
1320 }
1321
1322 if (read_only) {
1323 bdrv_reopen_set_read_only(parent, true, NULL);
1324 }
1325
1326 return ret;
1327}
1328
1329
1330
1331
1332
1333static void bdrv_inherited_options(BdrvChildRole role, bool parent_is_format,
1334 int *child_flags, QDict *child_options,
1335 int parent_flags, QDict *parent_options)
1336{
1337 int flags = parent_flags;
1338 GLOBAL_STATE_CODE();
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353 if (!parent_is_format &&
1354 (role & BDRV_CHILD_DATA) &&
1355 !(role & (BDRV_CHILD_METADATA | BDRV_CHILD_FILTERED)))
1356 {
1357 flags &= ~BDRV_O_PROTOCOL;
1358 }
1359
1360
1361
1362
1363
1364
1365 if ((parent_is_format && !(role & BDRV_CHILD_COW)) ||
1366 (role & BDRV_CHILD_METADATA))
1367 {
1368 flags |= BDRV_O_PROTOCOL;
1369 }
1370
1371
1372
1373
1374
1375 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
1376 qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
1377 qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE);
1378
1379 if (role & BDRV_CHILD_COW) {
1380
1381 qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
1382 qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off");
1383 } else {
1384
1385 qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
1386 qdict_copy_default(child_options, parent_options,
1387 BDRV_OPT_AUTO_READ_ONLY);
1388 }
1389
1390
1391
1392
1393
1394
1395 qdict_set_default_str(child_options, BDRV_OPT_DISCARD, "unmap");
1396
1397
1398 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
1399
1400 if (role & BDRV_CHILD_METADATA) {
1401 flags &= ~BDRV_O_NO_IO;
1402 }
1403 if (role & BDRV_CHILD_COW) {
1404 flags &= ~BDRV_O_TEMPORARY;
1405 }
1406
1407 *child_flags = flags;
1408}
1409
1410static void GRAPH_WRLOCK bdrv_child_cb_attach(BdrvChild *child)
1411{
1412 BlockDriverState *bs = child->opaque;
1413
1414 assert_bdrv_graph_writable();
1415 QLIST_INSERT_HEAD(&bs->children, child, next);
1416 if (bs->drv->is_filter || (child->role & BDRV_CHILD_FILTERED)) {
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426 assert(!(child->role & BDRV_CHILD_COW));
1427 if (child->role & BDRV_CHILD_PRIMARY) {
1428 assert(child->role & BDRV_CHILD_FILTERED);
1429 assert(!bs->backing);
1430 assert(!bs->file);
1431
1432 if (bs->drv->filtered_child_is_backing) {
1433 bs->backing = child;
1434 } else {
1435 bs->file = child;
1436 }
1437 } else {
1438 assert(!(child->role & BDRV_CHILD_FILTERED));
1439 }
1440 } else if (child->role & BDRV_CHILD_COW) {
1441 assert(bs->drv->supports_backing);
1442 assert(!(child->role & BDRV_CHILD_PRIMARY));
1443 assert(!bs->backing);
1444 bs->backing = child;
1445 bdrv_backing_attach(child);
1446 } else if (child->role & BDRV_CHILD_PRIMARY) {
1447 assert(!bs->file);
1448 bs->file = child;
1449 }
1450}
1451
1452static void GRAPH_WRLOCK bdrv_child_cb_detach(BdrvChild *child)
1453{
1454 BlockDriverState *bs = child->opaque;
1455
1456 if (child->role & BDRV_CHILD_COW) {
1457 bdrv_backing_detach(child);
1458 }
1459
1460 assert_bdrv_graph_writable();
1461 QLIST_REMOVE(child, next);
1462 if (child == bs->backing) {
1463 assert(child != bs->file);
1464 bs->backing = NULL;
1465 } else if (child == bs->file) {
1466 bs->file = NULL;
1467 }
1468}
1469
1470static int bdrv_child_cb_update_filename(BdrvChild *c, BlockDriverState *base,
1471 const char *filename, Error **errp)
1472{
1473 if (c->role & BDRV_CHILD_COW) {
1474 return bdrv_backing_update_filename(c, base, filename, errp);
1475 }
1476 return 0;
1477}
1478
1479AioContext *child_of_bds_get_parent_aio_context(BdrvChild *c)
1480{
1481 BlockDriverState *bs = c->opaque;
1482 IO_CODE();
1483
1484 return bdrv_get_aio_context(bs);
1485}
1486
1487const BdrvChildClass child_of_bds = {
1488 .parent_is_bds = true,
1489 .get_parent_desc = bdrv_child_get_parent_desc,
1490 .inherit_options = bdrv_inherited_options,
1491 .drained_begin = bdrv_child_cb_drained_begin,
1492 .drained_poll = bdrv_child_cb_drained_poll,
1493 .drained_end = bdrv_child_cb_drained_end,
1494 .attach = bdrv_child_cb_attach,
1495 .detach = bdrv_child_cb_detach,
1496 .inactivate = bdrv_child_cb_inactivate,
1497 .change_aio_ctx = bdrv_child_cb_change_aio_ctx,
1498 .update_filename = bdrv_child_cb_update_filename,
1499 .get_parent_aio_context = child_of_bds_get_parent_aio_context,
1500};
1501
1502AioContext *bdrv_child_get_parent_aio_context(BdrvChild *c)
1503{
1504 IO_CODE();
1505 return c->klass->get_parent_aio_context(c);
1506}
1507
1508static int bdrv_open_flags(BlockDriverState *bs, int flags)
1509{
1510 int open_flags = flags;
1511 GLOBAL_STATE_CODE();
1512
1513
1514
1515
1516
1517 open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_PROTOCOL);
1518
1519 return open_flags;
1520}
1521
1522static void update_flags_from_options(int *flags, QemuOpts *opts)
1523{
1524 GLOBAL_STATE_CODE();
1525
1526 *flags &= ~(BDRV_O_CACHE_MASK | BDRV_O_RDWR | BDRV_O_AUTO_RDONLY);
1527
1528 if (qemu_opt_get_bool_del(opts, BDRV_OPT_CACHE_NO_FLUSH, false)) {
1529 *flags |= BDRV_O_NO_FLUSH;
1530 }
1531
1532 if (qemu_opt_get_bool_del(opts, BDRV_OPT_CACHE_DIRECT, false)) {
1533 *flags |= BDRV_O_NOCACHE;
1534 }
1535
1536 if (!qemu_opt_get_bool_del(opts, BDRV_OPT_READ_ONLY, false)) {
1537 *flags |= BDRV_O_RDWR;
1538 }
1539
1540 if (qemu_opt_get_bool_del(opts, BDRV_OPT_AUTO_READ_ONLY, false)) {
1541 *flags |= BDRV_O_AUTO_RDONLY;
1542 }
1543}
1544
1545static void update_options_from_flags(QDict *options, int flags)
1546{
1547 GLOBAL_STATE_CODE();
1548 if (!qdict_haskey(options, BDRV_OPT_CACHE_DIRECT)) {
1549 qdict_put_bool(options, BDRV_OPT_CACHE_DIRECT, flags & BDRV_O_NOCACHE);
1550 }
1551 if (!qdict_haskey(options, BDRV_OPT_CACHE_NO_FLUSH)) {
1552 qdict_put_bool(options, BDRV_OPT_CACHE_NO_FLUSH,
1553 flags & BDRV_O_NO_FLUSH);
1554 }
1555 if (!qdict_haskey(options, BDRV_OPT_READ_ONLY)) {
1556 qdict_put_bool(options, BDRV_OPT_READ_ONLY, !(flags & BDRV_O_RDWR));
1557 }
1558 if (!qdict_haskey(options, BDRV_OPT_AUTO_READ_ONLY)) {
1559 qdict_put_bool(options, BDRV_OPT_AUTO_READ_ONLY,
1560 flags & BDRV_O_AUTO_RDONLY);
1561 }
1562}
1563
1564static void bdrv_assign_node_name(BlockDriverState *bs,
1565 const char *node_name,
1566 Error **errp)
1567{
1568 char *gen_node_name = NULL;
1569 GLOBAL_STATE_CODE();
1570
1571 if (!node_name) {
1572 node_name = gen_node_name = id_generate(ID_BLOCK);
1573 } else if (!id_wellformed(node_name)) {
1574
1575
1576
1577
1578 error_setg(errp, "Invalid node-name: '%s'", node_name);
1579 return;
1580 }
1581
1582
1583 if (blk_by_name(node_name)) {
1584 error_setg(errp, "node-name=%s is conflicting with a device id",
1585 node_name);
1586 goto out;
1587 }
1588
1589
1590 if (bdrv_find_node(node_name)) {
1591 error_setg(errp, "Duplicate nodes with node-name='%s'", node_name);
1592 goto out;
1593 }
1594
1595
1596 if (strlen(node_name) >= sizeof(bs->node_name)) {
1597 error_setg(errp, "Node name too long");
1598 goto out;
1599 }
1600
1601
1602 pstrcpy(bs->node_name, sizeof(bs->node_name), node_name);
1603 QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list);
1604out:
1605 g_free(gen_node_name);
1606}
1607
1608
1609
1610
1611
1612
1613static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv,
1614 const char *node_name, QDict *options,
1615 int open_flags, Error **errp)
1616{
1617 Error *local_err = NULL;
1618 int i, ret;
1619 GLOBAL_STATE_CODE();
1620
1621 bdrv_assign_node_name(bs, node_name, &local_err);
1622 if (local_err) {
1623 error_propagate(errp, local_err);
1624 return -EINVAL;
1625 }
1626
1627 bs->drv = drv;
1628 bs->opaque = g_malloc0(drv->instance_size);
1629
1630 if (drv->bdrv_file_open) {
1631 assert(!drv->bdrv_needs_filename || bs->filename[0]);
1632 ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
1633 } else if (drv->bdrv_open) {
1634 ret = drv->bdrv_open(bs, options, open_flags, &local_err);
1635 } else {
1636 ret = 0;
1637 }
1638
1639 if (ret < 0) {
1640 if (local_err) {
1641 error_propagate(errp, local_err);
1642 } else if (bs->filename[0]) {
1643 error_setg_errno(errp, -ret, "Could not open '%s'", bs->filename);
1644 } else {
1645 error_setg_errno(errp, -ret, "Could not open image");
1646 }
1647 goto open_failed;
1648 }
1649
1650 assert(!(bs->supported_read_flags & ~BDRV_REQ_MASK));
1651 assert(!(bs->supported_write_flags & ~BDRV_REQ_MASK));
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661 bs->supported_read_flags |= BDRV_REQ_REGISTERED_BUF;
1662 bs->supported_write_flags |= BDRV_REQ_REGISTERED_BUF;
1663
1664 ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
1665 if (ret < 0) {
1666 error_setg_errno(errp, -ret, "Could not refresh total sector count");
1667 return ret;
1668 }
1669
1670 bdrv_refresh_limits(bs, NULL, &local_err);
1671 if (local_err) {
1672 error_propagate(errp, local_err);
1673 return -EINVAL;
1674 }
1675
1676 assert(bdrv_opt_mem_align(bs) != 0);
1677 assert(bdrv_min_mem_align(bs) != 0);
1678 assert(is_power_of_2(bs->bl.request_alignment));
1679
1680 for (i = 0; i < bs->quiesce_counter; i++) {
1681 if (drv->bdrv_drain_begin) {
1682 drv->bdrv_drain_begin(bs);
1683 }
1684 }
1685
1686 return 0;
1687open_failed:
1688 bs->drv = NULL;
1689 if (bs->file != NULL) {
1690 bdrv_unref_child(bs, bs->file);
1691 assert(!bs->file);
1692 }
1693 g_free(bs->opaque);
1694 bs->opaque = NULL;
1695 return ret;
1696}
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706BlockDriverState *bdrv_new_open_driver_opts(BlockDriver *drv,
1707 const char *node_name,
1708 QDict *options, int flags,
1709 Error **errp)
1710{
1711 BlockDriverState *bs;
1712 int ret;
1713
1714 GLOBAL_STATE_CODE();
1715
1716 bs = bdrv_new();
1717 bs->open_flags = flags;
1718 bs->options = options ?: qdict_new();
1719 bs->explicit_options = qdict_clone_shallow(bs->options);
1720 bs->opaque = NULL;
1721
1722 update_options_from_flags(bs->options, flags);
1723
1724 ret = bdrv_open_driver(bs, drv, node_name, bs->options, flags, errp);
1725 if (ret < 0) {
1726 qobject_unref(bs->explicit_options);
1727 bs->explicit_options = NULL;
1728 qobject_unref(bs->options);
1729 bs->options = NULL;
1730 bdrv_unref(bs);
1731 return NULL;
1732 }
1733
1734 return bs;
1735}
1736
1737
1738BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
1739 int flags, Error **errp)
1740{
1741 GLOBAL_STATE_CODE();
1742 return bdrv_new_open_driver_opts(drv, node_name, NULL, flags, errp);
1743}
1744
1745QemuOptsList bdrv_runtime_opts = {
1746 .name = "bdrv_common",
1747 .head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
1748 .desc = {
1749 {
1750 .name = "node-name",
1751 .type = QEMU_OPT_STRING,
1752 .help = "Node name of the block device node",
1753 },
1754 {
1755 .name = "driver",
1756 .type = QEMU_OPT_STRING,
1757 .help = "Block driver to use for the node",
1758 },
1759 {
1760 .name = BDRV_OPT_CACHE_DIRECT,
1761 .type = QEMU_OPT_BOOL,
1762 .help = "Bypass software writeback cache on the host",
1763 },
1764 {
1765 .name = BDRV_OPT_CACHE_NO_FLUSH,
1766 .type = QEMU_OPT_BOOL,
1767 .help = "Ignore flush requests",
1768 },
1769 {
1770 .name = BDRV_OPT_READ_ONLY,
1771 .type = QEMU_OPT_BOOL,
1772 .help = "Node is opened in read-only mode",
1773 },
1774 {
1775 .name = BDRV_OPT_AUTO_READ_ONLY,
1776 .type = QEMU_OPT_BOOL,
1777 .help = "Node can become read-only if opening read-write fails",
1778 },
1779 {
1780 .name = "detect-zeroes",
1781 .type = QEMU_OPT_STRING,
1782 .help = "try to optimize zero writes (off, on, unmap)",
1783 },
1784 {
1785 .name = BDRV_OPT_DISCARD,
1786 .type = QEMU_OPT_STRING,
1787 .help = "discard operation (ignore/off, unmap/on)",
1788 },
1789 {
1790 .name = BDRV_OPT_FORCE_SHARE,
1791 .type = QEMU_OPT_BOOL,
1792 .help = "always accept other writers (default: off)",
1793 },
1794 { }
1795 },
1796};
1797
1798QemuOptsList bdrv_create_opts_simple = {
1799 .name = "simple-create-opts",
1800 .head = QTAILQ_HEAD_INITIALIZER(bdrv_create_opts_simple.head),
1801 .desc = {
1802 {
1803 .name = BLOCK_OPT_SIZE,
1804 .type = QEMU_OPT_SIZE,
1805 .help = "Virtual disk size"
1806 },
1807 {
1808 .name = BLOCK_OPT_PREALLOC,
1809 .type = QEMU_OPT_STRING,
1810 .help = "Preallocation mode (allowed values: off)"
1811 },
1812 { }
1813 }
1814};
1815
1816
1817
1818
1819
1820
1821static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
1822 QDict *options, Error **errp)
1823{
1824 int ret, open_flags;
1825 const char *filename;
1826 const char *driver_name = NULL;
1827 const char *node_name = NULL;
1828 const char *discard;
1829 QemuOpts *opts;
1830 BlockDriver *drv;
1831 Error *local_err = NULL;
1832 bool ro;
1833
1834 assert(bs->file == NULL);
1835 assert(options != NULL && bs->options != options);
1836 GLOBAL_STATE_CODE();
1837
1838 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
1839 if (!qemu_opts_absorb_qdict(opts, options, errp)) {
1840 ret = -EINVAL;
1841 goto fail_opts;
1842 }
1843
1844 update_flags_from_options(&bs->open_flags, opts);
1845
1846 driver_name = qemu_opt_get(opts, "driver");
1847 drv = bdrv_find_format(driver_name);
1848 assert(drv != NULL);
1849
1850 bs->force_share = qemu_opt_get_bool(opts, BDRV_OPT_FORCE_SHARE, false);
1851
1852 if (bs->force_share && (bs->open_flags & BDRV_O_RDWR)) {
1853 error_setg(errp,
1854 BDRV_OPT_FORCE_SHARE
1855 "=on can only be used with read-only images");
1856 ret = -EINVAL;
1857 goto fail_opts;
1858 }
1859
1860 if (file != NULL) {
1861 bdrv_refresh_filename(blk_bs(file));
1862 filename = blk_bs(file)->filename;
1863 } else {
1864
1865
1866
1867
1868
1869
1870
1871 filename = qdict_get_try_str(options, "filename");
1872 }
1873
1874 if (drv->bdrv_needs_filename && (!filename || !filename[0])) {
1875 error_setg(errp, "The '%s' block driver requires a file name",
1876 drv->format_name);
1877 ret = -EINVAL;
1878 goto fail_opts;
1879 }
1880
1881 trace_bdrv_open_common(bs, filename ?: "", bs->open_flags,
1882 drv->format_name);
1883
1884 ro = bdrv_is_read_only(bs);
1885
1886 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, ro)) {
1887 if (!ro && bdrv_is_whitelisted(drv, true)) {
1888 ret = bdrv_apply_auto_read_only(bs, NULL, NULL);
1889 } else {
1890 ret = -ENOTSUP;
1891 }
1892 if (ret < 0) {
1893 error_setg(errp,
1894 !ro && bdrv_is_whitelisted(drv, true)
1895 ? "Driver '%s' can only be used for read-only devices"
1896 : "Driver '%s' is not whitelisted",
1897 drv->format_name);
1898 goto fail_opts;
1899 }
1900 }
1901
1902
1903 assert(qatomic_read(&bs->copy_on_read) == 0);
1904
1905 if (bs->open_flags & BDRV_O_COPY_ON_READ) {
1906 if (!ro) {
1907 bdrv_enable_copy_on_read(bs);
1908 } else {
1909 error_setg(errp, "Can't use copy-on-read on read-only device");
1910 ret = -EINVAL;
1911 goto fail_opts;
1912 }
1913 }
1914
1915 discard = qemu_opt_get(opts, BDRV_OPT_DISCARD);
1916 if (discard != NULL) {
1917 if (bdrv_parse_discard_flags(discard, &bs->open_flags) != 0) {
1918 error_setg(errp, "Invalid discard option");
1919 ret = -EINVAL;
1920 goto fail_opts;
1921 }
1922 }
1923
1924 bs->detect_zeroes =
1925 bdrv_parse_detect_zeroes(opts, bs->open_flags, &local_err);
1926 if (local_err) {
1927 error_propagate(errp, local_err);
1928 ret = -EINVAL;
1929 goto fail_opts;
1930 }
1931
1932 if (filename != NULL) {
1933 pstrcpy(bs->filename, sizeof(bs->filename), filename);
1934 } else {
1935 bs->filename[0] = '\0';
1936 }
1937 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename);
1938
1939
1940 open_flags = bdrv_open_flags(bs, bs->open_flags);
1941 node_name = qemu_opt_get(opts, "node-name");
1942
1943 assert(!drv->bdrv_file_open || file == NULL);
1944 ret = bdrv_open_driver(bs, drv, node_name, options, open_flags, errp);
1945 if (ret < 0) {
1946 goto fail_opts;
1947 }
1948
1949 qemu_opts_del(opts);
1950 return 0;
1951
1952fail_opts:
1953 qemu_opts_del(opts);
1954 return ret;
1955}
1956
1957static QDict *parse_json_filename(const char *filename, Error **errp)
1958{
1959 QObject *options_obj;
1960 QDict *options;
1961 int ret;
1962 GLOBAL_STATE_CODE();
1963
1964 ret = strstart(filename, "json:", &filename);
1965 assert(ret);
1966
1967 options_obj = qobject_from_json(filename, errp);
1968 if (!options_obj) {
1969 error_prepend(errp, "Could not parse the JSON options: ");
1970 return NULL;
1971 }
1972
1973 options = qobject_to(QDict, options_obj);
1974 if (!options) {
1975 qobject_unref(options_obj);
1976 error_setg(errp, "Invalid JSON object given");
1977 return NULL;
1978 }
1979
1980 qdict_flatten(options);
1981
1982 return options;
1983}
1984
1985static void parse_json_protocol(QDict *options, const char **pfilename,
1986 Error **errp)
1987{
1988 QDict *json_options;
1989 Error *local_err = NULL;
1990 GLOBAL_STATE_CODE();
1991
1992
1993 if (!*pfilename || !g_str_has_prefix(*pfilename, "json:")) {
1994 return;
1995 }
1996
1997 json_options = parse_json_filename(*pfilename, &local_err);
1998 if (local_err) {
1999 error_propagate(errp, local_err);
2000 return;
2001 }
2002
2003
2004
2005 qdict_join(options, json_options, false);
2006 qobject_unref(json_options);
2007 *pfilename = NULL;
2008}
2009
2010
2011
2012
2013
2014
2015
2016static int bdrv_fill_options(QDict **options, const char *filename,
2017 int *flags, Error **errp)
2018{
2019 const char *drvname;
2020 bool protocol = *flags & BDRV_O_PROTOCOL;
2021 bool parse_filename = false;
2022 BlockDriver *drv = NULL;
2023 Error *local_err = NULL;
2024
2025 GLOBAL_STATE_CODE();
2026
2027
2028
2029
2030
2031
2032
2033
2034 drvname = qdict_get_try_str(*options, "driver");
2035 if (drvname) {
2036 drv = bdrv_find_format(drvname);
2037 if (!drv) {
2038 error_setg(errp, "Unknown driver '%s'", drvname);
2039 return -ENOENT;
2040 }
2041
2042
2043 protocol = drv->bdrv_file_open;
2044 }
2045
2046 if (protocol) {
2047 *flags |= BDRV_O_PROTOCOL;
2048 } else {
2049 *flags &= ~BDRV_O_PROTOCOL;
2050 }
2051
2052
2053 update_options_from_flags(*options, *flags);
2054
2055
2056 if (protocol && filename) {
2057 if (!qdict_haskey(*options, "filename")) {
2058 qdict_put_str(*options, "filename", filename);
2059 parse_filename = true;
2060 } else {
2061 error_setg(errp, "Can't specify 'file' and 'filename' options at "
2062 "the same time");
2063 return -EINVAL;
2064 }
2065 }
2066
2067
2068
2069 filename = qdict_get_try_str(*options, "filename");
2070
2071 if (!drvname && protocol) {
2072 if (filename) {
2073 drv = bdrv_find_protocol(filename, parse_filename, errp);
2074 if (!drv) {
2075 return -EINVAL;
2076 }
2077
2078 drvname = drv->format_name;
2079 qdict_put_str(*options, "driver", drvname);
2080 } else {
2081 error_setg(errp, "Must specify either driver or file");
2082 return -EINVAL;
2083 }
2084 }
2085
2086 assert(drv || !protocol);
2087
2088
2089 if (drv && drv->bdrv_parse_filename && parse_filename) {
2090 drv->bdrv_parse_filename(filename, *options, &local_err);
2091 if (local_err) {
2092 error_propagate(errp, local_err);
2093 return -EINVAL;
2094 }
2095
2096 if (!drv->bdrv_needs_filename) {
2097 qdict_del(*options, "filename");
2098 }
2099 }
2100
2101 return 0;
2102}
2103
2104typedef struct BlockReopenQueueEntry {
2105 bool prepared;
2106 bool perms_checked;
2107 BDRVReopenState state;
2108 QTAILQ_ENTRY(BlockReopenQueueEntry) entry;
2109} BlockReopenQueueEntry;
2110
2111
2112
2113
2114
2115
2116static int bdrv_reopen_get_flags(BlockReopenQueue *q, BlockDriverState *bs)
2117{
2118 BlockReopenQueueEntry *entry;
2119
2120 if (q != NULL) {
2121 QTAILQ_FOREACH(entry, q, entry) {
2122 if (entry->state.bs == bs) {
2123 return entry->state.flags;
2124 }
2125 }
2126 }
2127
2128 return bs->open_flags;
2129}
2130
2131
2132
2133static bool bdrv_is_writable_after_reopen(BlockDriverState *bs,
2134 BlockReopenQueue *q)
2135{
2136 int flags = bdrv_reopen_get_flags(q, bs);
2137
2138 return (flags & (BDRV_O_RDWR | BDRV_O_INACTIVE)) == BDRV_O_RDWR;
2139}
2140
2141
2142
2143
2144
2145
2146bool bdrv_is_writable(BlockDriverState *bs)
2147{
2148 IO_CODE();
2149 return bdrv_is_writable_after_reopen(bs, NULL);
2150}
2151
2152static char *bdrv_child_user_desc(BdrvChild *c)
2153{
2154 GLOBAL_STATE_CODE();
2155 return c->klass->get_parent_desc(c);
2156}
2157
2158
2159
2160
2161
2162static bool bdrv_a_allow_b(BdrvChild *a, BdrvChild *b, Error **errp)
2163{
2164 const char *child_bs_name;
2165 g_autofree char *a_user = NULL;
2166 g_autofree char *b_user = NULL;
2167 g_autofree char *perms = NULL;
2168
2169 assert(a->bs);
2170 assert(a->bs == b->bs);
2171 GLOBAL_STATE_CODE();
2172
2173 if ((b->perm & a->shared_perm) == b->perm) {
2174 return true;
2175 }
2176
2177 child_bs_name = bdrv_get_node_name(b->bs);
2178 a_user = bdrv_child_user_desc(a);
2179 b_user = bdrv_child_user_desc(b);
2180 perms = bdrv_perm_names(b->perm & ~a->shared_perm);
2181
2182 error_setg(errp, "Permission conflict on node '%s': permissions '%s' are "
2183 "both required by %s (uses node '%s' as '%s' child) and "
2184 "unshared by %s (uses node '%s' as '%s' child).",
2185 child_bs_name, perms,
2186 b_user, child_bs_name, b->name,
2187 a_user, child_bs_name, a->name);
2188
2189 return false;
2190}
2191
2192static bool bdrv_parent_perms_conflict(BlockDriverState *bs, Error **errp)
2193{
2194 BdrvChild *a, *b;
2195 GLOBAL_STATE_CODE();
2196
2197
2198
2199
2200
2201
2202 QLIST_FOREACH(a, &bs->parents, next_parent) {
2203 QLIST_FOREACH(b, &bs->parents, next_parent) {
2204 if (a == b) {
2205 continue;
2206 }
2207
2208 if (!bdrv_a_allow_b(a, b, errp)) {
2209 return true;
2210 }
2211 }
2212 }
2213
2214 return false;
2215}
2216
2217static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
2218 BdrvChild *c, BdrvChildRole role,
2219 BlockReopenQueue *reopen_queue,
2220 uint64_t parent_perm, uint64_t parent_shared,
2221 uint64_t *nperm, uint64_t *nshared)
2222{
2223 assert(bs->drv && bs->drv->bdrv_child_perm);
2224 GLOBAL_STATE_CODE();
2225 bs->drv->bdrv_child_perm(bs, c, role, reopen_queue,
2226 parent_perm, parent_shared,
2227 nperm, nshared);
2228
2229 if (child_bs && child_bs->force_share) {
2230 *nshared = BLK_PERM_ALL;
2231 }
2232}
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245static GSList *bdrv_topological_dfs(GSList *list, GHashTable *found,
2246 BlockDriverState *bs)
2247{
2248 BdrvChild *child;
2249 g_autoptr(GHashTable) local_found = NULL;
2250
2251 GLOBAL_STATE_CODE();
2252
2253 if (!found) {
2254 assert(!list);
2255 found = local_found = g_hash_table_new(NULL, NULL);
2256 }
2257
2258 if (g_hash_table_contains(found, bs)) {
2259 return list;
2260 }
2261 g_hash_table_add(found, bs);
2262
2263 QLIST_FOREACH(child, &bs->children, next) {
2264 list = bdrv_topological_dfs(list, found, child->bs);
2265 }
2266
2267 return g_slist_prepend(list, bs);
2268}
2269
2270typedef struct BdrvChildSetPermState {
2271 BdrvChild *child;
2272 uint64_t old_perm;
2273 uint64_t old_shared_perm;
2274} BdrvChildSetPermState;
2275
2276static void bdrv_child_set_perm_abort(void *opaque)
2277{
2278 BdrvChildSetPermState *s = opaque;
2279
2280 GLOBAL_STATE_CODE();
2281
2282 s->child->perm = s->old_perm;
2283 s->child->shared_perm = s->old_shared_perm;
2284}
2285
2286static TransactionActionDrv bdrv_child_set_pem_drv = {
2287 .abort = bdrv_child_set_perm_abort,
2288 .clean = g_free,
2289};
2290
2291static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm,
2292 uint64_t shared, Transaction *tran)
2293{
2294 BdrvChildSetPermState *s = g_new(BdrvChildSetPermState, 1);
2295 GLOBAL_STATE_CODE();
2296
2297 *s = (BdrvChildSetPermState) {
2298 .child = c,
2299 .old_perm = c->perm,
2300 .old_shared_perm = c->shared_perm,
2301 };
2302
2303 c->perm = perm;
2304 c->shared_perm = shared;
2305
2306 tran_add(tran, &bdrv_child_set_pem_drv, s);
2307}
2308
2309static void bdrv_drv_set_perm_commit(void *opaque)
2310{
2311 BlockDriverState *bs = opaque;
2312 uint64_t cumulative_perms, cumulative_shared_perms;
2313 GLOBAL_STATE_CODE();
2314
2315 if (bs->drv->bdrv_set_perm) {
2316 bdrv_get_cumulative_perm(bs, &cumulative_perms,
2317 &cumulative_shared_perms);
2318 bs->drv->bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms);
2319 }
2320}
2321
2322static void bdrv_drv_set_perm_abort(void *opaque)
2323{
2324 BlockDriverState *bs = opaque;
2325 GLOBAL_STATE_CODE();
2326
2327 if (bs->drv->bdrv_abort_perm_update) {
2328 bs->drv->bdrv_abort_perm_update(bs);
2329 }
2330}
2331
2332TransactionActionDrv bdrv_drv_set_perm_drv = {
2333 .abort = bdrv_drv_set_perm_abort,
2334 .commit = bdrv_drv_set_perm_commit,
2335};
2336
2337static int bdrv_drv_set_perm(BlockDriverState *bs, uint64_t perm,
2338 uint64_t shared_perm, Transaction *tran,
2339 Error **errp)
2340{
2341 GLOBAL_STATE_CODE();
2342 if (!bs->drv) {
2343 return 0;
2344 }
2345
2346 if (bs->drv->bdrv_check_perm) {
2347 int ret = bs->drv->bdrv_check_perm(bs, perm, shared_perm, errp);
2348 if (ret < 0) {
2349 return ret;
2350 }
2351 }
2352
2353 if (tran) {
2354 tran_add(tran, &bdrv_drv_set_perm_drv, bs);
2355 }
2356
2357 return 0;
2358}
2359
2360typedef struct BdrvReplaceChildState {
2361 BdrvChild *child;
2362 BlockDriverState *old_bs;
2363} BdrvReplaceChildState;
2364
2365static void bdrv_replace_child_commit(void *opaque)
2366{
2367 BdrvReplaceChildState *s = opaque;
2368 GLOBAL_STATE_CODE();
2369
2370 bdrv_unref(s->old_bs);
2371}
2372
2373static void bdrv_replace_child_abort(void *opaque)
2374{
2375 BdrvReplaceChildState *s = opaque;
2376 BlockDriverState *new_bs = s->child->bs;
2377
2378 GLOBAL_STATE_CODE();
2379
2380 if (!s->child->bs) {
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390 bdrv_parent_drained_begin_single(s->child);
2391 assert(!bdrv_parent_drained_poll_single(s->child));
2392 }
2393 assert(s->child->quiesced_parent);
2394 bdrv_replace_child_noperm(s->child, s->old_bs);
2395 bdrv_unref(new_bs);
2396}
2397
2398static TransactionActionDrv bdrv_replace_child_drv = {
2399 .commit = bdrv_replace_child_commit,
2400 .abort = bdrv_replace_child_abort,
2401 .clean = g_free,
2402};
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414static void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *new_bs,
2415 Transaction *tran)
2416{
2417 BdrvReplaceChildState *s = g_new(BdrvReplaceChildState, 1);
2418
2419 assert(child->quiesced_parent);
2420 assert(!new_bs || new_bs->quiesce_counter);
2421
2422 *s = (BdrvReplaceChildState) {
2423 .child = child,
2424 .old_bs = child->bs,
2425 };
2426 tran_add(tran, &bdrv_replace_child_drv, s);
2427
2428 if (new_bs) {
2429 bdrv_ref(new_bs);
2430 }
2431 bdrv_replace_child_noperm(child, new_bs);
2432
2433}
2434
2435
2436
2437
2438
2439static int bdrv_node_refresh_perm(BlockDriverState *bs, BlockReopenQueue *q,
2440 Transaction *tran, Error **errp)
2441{
2442 BlockDriver *drv = bs->drv;
2443 BdrvChild *c;
2444 int ret;
2445 uint64_t cumulative_perms, cumulative_shared_perms;
2446 GLOBAL_STATE_CODE();
2447
2448 bdrv_get_cumulative_perm(bs, &cumulative_perms, &cumulative_shared_perms);
2449
2450
2451 if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
2452 !bdrv_is_writable_after_reopen(bs, q))
2453 {
2454 if (!bdrv_is_writable_after_reopen(bs, NULL)) {
2455 error_setg(errp, "Block node is read-only");
2456 } else {
2457 error_setg(errp, "Read-only block node '%s' cannot support "
2458 "read-write users", bdrv_get_node_name(bs));
2459 }
2460
2461 return -EPERM;
2462 }
2463
2464
2465
2466
2467
2468
2469 if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
2470 !(cumulative_perms & BLK_PERM_RESIZE))
2471 {
2472 if ((bs->total_sectors * BDRV_SECTOR_SIZE) % bs->bl.request_alignment) {
2473 error_setg(errp, "Cannot get 'write' permission without 'resize': "
2474 "Image size is not a multiple of request "
2475 "alignment");
2476 return -EPERM;
2477 }
2478 }
2479
2480
2481 if (!drv) {
2482 return 0;
2483 }
2484
2485 ret = bdrv_drv_set_perm(bs, cumulative_perms, cumulative_shared_perms, tran,
2486 errp);
2487 if (ret < 0) {
2488 return ret;
2489 }
2490
2491
2492 if (!drv->bdrv_child_perm) {
2493 assert(QLIST_EMPTY(&bs->children));
2494 return 0;
2495 }
2496
2497
2498 QLIST_FOREACH(c, &bs->children, next) {
2499 uint64_t cur_perm, cur_shared;
2500
2501 bdrv_child_perm(bs, c->bs, c, c->role, q,
2502 cumulative_perms, cumulative_shared_perms,
2503 &cur_perm, &cur_shared);
2504 bdrv_child_set_perm(c, cur_perm, cur_shared, tran);
2505 }
2506
2507 return 0;
2508}
2509
2510
2511
2512
2513
2514static int bdrv_do_refresh_perms(GSList *list, BlockReopenQueue *q,
2515 Transaction *tran, Error **errp)
2516{
2517 int ret;
2518 BlockDriverState *bs;
2519 GLOBAL_STATE_CODE();
2520
2521 for ( ; list; list = list->next) {
2522 bs = list->data;
2523
2524 if (bdrv_parent_perms_conflict(bs, errp)) {
2525 return -EINVAL;
2526 }
2527
2528 ret = bdrv_node_refresh_perm(bs, q, tran, errp);
2529 if (ret < 0) {
2530 return ret;
2531 }
2532 }
2533
2534 return 0;
2535}
2536
2537
2538
2539
2540
2541
2542static int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q,
2543 Transaction *tran, Error **errp)
2544{
2545 g_autoptr(GHashTable) found = g_hash_table_new(NULL, NULL);
2546 g_autoptr(GSList) refresh_list = NULL;
2547
2548 for ( ; list; list = list->next) {
2549 refresh_list = bdrv_topological_dfs(refresh_list, found, list->data);
2550 }
2551
2552 return bdrv_do_refresh_perms(refresh_list, q, tran, errp);
2553}
2554
2555void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
2556 uint64_t *shared_perm)
2557{
2558 BdrvChild *c;
2559 uint64_t cumulative_perms = 0;
2560 uint64_t cumulative_shared_perms = BLK_PERM_ALL;
2561
2562 GLOBAL_STATE_CODE();
2563
2564 QLIST_FOREACH(c, &bs->parents, next_parent) {
2565 cumulative_perms |= c->perm;
2566 cumulative_shared_perms &= c->shared_perm;
2567 }
2568
2569 *perm = cumulative_perms;
2570 *shared_perm = cumulative_shared_perms;
2571}
2572
2573char *bdrv_perm_names(uint64_t perm)
2574{
2575 struct perm_name {
2576 uint64_t perm;
2577 const char *name;
2578 } permissions[] = {
2579 { BLK_PERM_CONSISTENT_READ, "consistent read" },
2580 { BLK_PERM_WRITE, "write" },
2581 { BLK_PERM_WRITE_UNCHANGED, "write unchanged" },
2582 { BLK_PERM_RESIZE, "resize" },
2583 { 0, NULL }
2584 };
2585
2586 GString *result = g_string_sized_new(30);
2587 struct perm_name *p;
2588
2589 for (p = permissions; p->name; p++) {
2590 if (perm & p->perm) {
2591 if (result->len > 0) {
2592 g_string_append(result, ", ");
2593 }
2594 g_string_append(result, p->name);
2595 }
2596 }
2597
2598 return g_string_free(result, FALSE);
2599}
2600
2601
2602
2603static int bdrv_refresh_perms(BlockDriverState *bs, Transaction *tran,
2604 Error **errp)
2605{
2606 int ret;
2607 Transaction *local_tran = NULL;
2608 g_autoptr(GSList) list = bdrv_topological_dfs(NULL, NULL, bs);
2609 GLOBAL_STATE_CODE();
2610
2611 if (!tran) {
2612 tran = local_tran = tran_new();
2613 }
2614
2615 ret = bdrv_do_refresh_perms(list, NULL, tran, errp);
2616
2617 if (local_tran) {
2618 tran_finalize(local_tran, ret);
2619 }
2620
2621 return ret;
2622}
2623
2624int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
2625 Error **errp)
2626{
2627 Error *local_err = NULL;
2628 Transaction *tran = tran_new();
2629 int ret;
2630
2631 GLOBAL_STATE_CODE();
2632
2633 bdrv_child_set_perm(c, perm, shared, tran);
2634
2635 ret = bdrv_refresh_perms(c->bs, tran, &local_err);
2636
2637 tran_finalize(tran, ret);
2638
2639 if (ret < 0) {
2640 if ((perm & ~c->perm) || (c->shared_perm & ~shared)) {
2641
2642 error_propagate(errp, local_err);
2643 } else {
2644
2645
2646
2647
2648
2649
2650 error_free(local_err);
2651 ret = 0;
2652 }
2653 }
2654
2655 return ret;
2656}
2657
2658int bdrv_child_refresh_perms(BlockDriverState *bs, BdrvChild *c, Error **errp)
2659{
2660 uint64_t parent_perms, parent_shared;
2661 uint64_t perms, shared;
2662
2663 GLOBAL_STATE_CODE();
2664
2665 bdrv_get_cumulative_perm(bs, &parent_perms, &parent_shared);
2666 bdrv_child_perm(bs, c->bs, c, c->role, NULL,
2667 parent_perms, parent_shared, &perms, &shared);
2668
2669 return bdrv_child_try_set_perm(c, perms, shared, errp);
2670}
2671
2672
2673
2674
2675
2676
2677static void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
2678 BdrvChildRole role,
2679 BlockReopenQueue *reopen_queue,
2680 uint64_t perm, uint64_t shared,
2681 uint64_t *nperm, uint64_t *nshared)
2682{
2683 GLOBAL_STATE_CODE();
2684 *nperm = perm & DEFAULT_PERM_PASSTHROUGH;
2685 *nshared = (shared & DEFAULT_PERM_PASSTHROUGH) | DEFAULT_PERM_UNCHANGED;
2686}
2687
2688static void bdrv_default_perms_for_cow(BlockDriverState *bs, BdrvChild *c,
2689 BdrvChildRole role,
2690 BlockReopenQueue *reopen_queue,
2691 uint64_t perm, uint64_t shared,
2692 uint64_t *nperm, uint64_t *nshared)
2693{
2694 assert(role & BDRV_CHILD_COW);
2695 GLOBAL_STATE_CODE();
2696
2697
2698
2699
2700
2701 perm &= BLK_PERM_CONSISTENT_READ;
2702
2703
2704
2705
2706
2707
2708 if (shared & BLK_PERM_WRITE) {
2709 shared = BLK_PERM_WRITE | BLK_PERM_RESIZE;
2710 } else {
2711 shared = 0;
2712 }
2713
2714 shared |= BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED;
2715
2716 if (bs->open_flags & BDRV_O_INACTIVE) {
2717 shared |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
2718 }
2719
2720 *nperm = perm;
2721 *nshared = shared;
2722}
2723
2724static void bdrv_default_perms_for_storage(BlockDriverState *bs, BdrvChild *c,
2725 BdrvChildRole role,
2726 BlockReopenQueue *reopen_queue,
2727 uint64_t perm, uint64_t shared,
2728 uint64_t *nperm, uint64_t *nshared)
2729{
2730 int flags;
2731
2732 GLOBAL_STATE_CODE();
2733 assert(role & (BDRV_CHILD_METADATA | BDRV_CHILD_DATA));
2734
2735 flags = bdrv_reopen_get_flags(reopen_queue, bs);
2736
2737
2738
2739
2740
2741 bdrv_filter_default_perms(bs, c, role, reopen_queue,
2742 perm, shared, &perm, &shared);
2743
2744 if (role & BDRV_CHILD_METADATA) {
2745
2746 if (bdrv_is_writable_after_reopen(bs, reopen_queue)) {
2747 perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
2748 }
2749
2750
2751
2752
2753
2754
2755 if (!(flags & BDRV_O_NO_IO)) {
2756 perm |= BLK_PERM_CONSISTENT_READ;
2757 }
2758 shared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
2759 }
2760
2761 if (role & BDRV_CHILD_DATA) {
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776 shared &= ~BLK_PERM_RESIZE;
2777
2778
2779
2780
2781
2782
2783 if (perm & BLK_PERM_WRITE_UNCHANGED) {
2784 perm |= BLK_PERM_WRITE;
2785 }
2786
2787
2788
2789
2790
2791 if (perm & BLK_PERM_WRITE) {
2792 perm |= BLK_PERM_RESIZE;
2793 }
2794 }
2795
2796 if (bs->open_flags & BDRV_O_INACTIVE) {
2797 shared |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
2798 }
2799
2800 *nperm = perm;
2801 *nshared = shared;
2802}
2803
2804void bdrv_default_perms(BlockDriverState *bs, BdrvChild *c,
2805 BdrvChildRole role, BlockReopenQueue *reopen_queue,
2806 uint64_t perm, uint64_t shared,
2807 uint64_t *nperm, uint64_t *nshared)
2808{
2809 GLOBAL_STATE_CODE();
2810 if (role & BDRV_CHILD_FILTERED) {
2811 assert(!(role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA |
2812 BDRV_CHILD_COW)));
2813 bdrv_filter_default_perms(bs, c, role, reopen_queue,
2814 perm, shared, nperm, nshared);
2815 } else if (role & BDRV_CHILD_COW) {
2816 assert(!(role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA)));
2817 bdrv_default_perms_for_cow(bs, c, role, reopen_queue,
2818 perm, shared, nperm, nshared);
2819 } else if (role & (BDRV_CHILD_METADATA | BDRV_CHILD_DATA)) {
2820 bdrv_default_perms_for_storage(bs, c, role, reopen_queue,
2821 perm, shared, nperm, nshared);
2822 } else {
2823 g_assert_not_reached();
2824 }
2825}
2826
2827uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm)
2828{
2829 static const uint64_t permissions[] = {
2830 [BLOCK_PERMISSION_CONSISTENT_READ] = BLK_PERM_CONSISTENT_READ,
2831 [BLOCK_PERMISSION_WRITE] = BLK_PERM_WRITE,
2832 [BLOCK_PERMISSION_WRITE_UNCHANGED] = BLK_PERM_WRITE_UNCHANGED,
2833 [BLOCK_PERMISSION_RESIZE] = BLK_PERM_RESIZE,
2834 };
2835
2836 QEMU_BUILD_BUG_ON(ARRAY_SIZE(permissions) != BLOCK_PERMISSION__MAX);
2837 QEMU_BUILD_BUG_ON(1UL << ARRAY_SIZE(permissions) != BLK_PERM_ALL + 1);
2838
2839 assert(qapi_perm < BLOCK_PERMISSION__MAX);
2840
2841 return permissions[qapi_perm];
2842}
2843
2844
2845
2846
2847
2848
2849
2850static void bdrv_replace_child_noperm(BdrvChild *child,
2851 BlockDriverState *new_bs)
2852{
2853 BlockDriverState *old_bs = child->bs;
2854 int new_bs_quiesce_counter;
2855
2856 assert(!child->frozen);
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878 assert(!new_bs || child->quiesced_parent);
2879 assert(old_bs != new_bs);
2880 GLOBAL_STATE_CODE();
2881
2882 if (old_bs && new_bs) {
2883 assert(bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs));
2884 }
2885
2886
2887 bdrv_graph_wrlock();
2888 if (old_bs) {
2889 if (child->klass->detach) {
2890 child->klass->detach(child);
2891 }
2892 QLIST_REMOVE(child, next_parent);
2893 }
2894
2895 child->bs = new_bs;
2896
2897 if (new_bs) {
2898 QLIST_INSERT_HEAD(&new_bs->parents, child, next_parent);
2899 if (child->klass->attach) {
2900 child->klass->attach(child);
2901 }
2902 }
2903 bdrv_graph_wrunlock();
2904
2905
2906
2907
2908
2909
2910 new_bs_quiesce_counter = (new_bs ? new_bs->quiesce_counter : 0);
2911 if (!new_bs_quiesce_counter && child->quiesced_parent) {
2912 bdrv_parent_drained_end_single(child);
2913 }
2914}
2915
2916
2917
2918
2919
2920
2921
2922static void bdrv_child_free(BdrvChild *child)
2923{
2924 assert(!child->bs);
2925 GLOBAL_STATE_CODE();
2926 assert(!child->next.le_prev);
2927
2928 g_free(child->name);
2929 g_free(child);
2930}
2931
2932typedef struct BdrvAttachChildCommonState {
2933 BdrvChild *child;
2934 AioContext *old_parent_ctx;
2935 AioContext *old_child_ctx;
2936} BdrvAttachChildCommonState;
2937
2938static void bdrv_attach_child_common_abort(void *opaque)
2939{
2940 BdrvAttachChildCommonState *s = opaque;
2941 BlockDriverState *bs = s->child->bs;
2942
2943 GLOBAL_STATE_CODE();
2944 bdrv_replace_child_noperm(s->child, NULL);
2945
2946 if (bdrv_get_aio_context(bs) != s->old_child_ctx) {
2947 bdrv_try_change_aio_context(bs, s->old_child_ctx, NULL, &error_abort);
2948 }
2949
2950 if (bdrv_child_get_parent_aio_context(s->child) != s->old_parent_ctx) {
2951 Transaction *tran;
2952 GHashTable *visited;
2953 bool ret;
2954
2955 tran = tran_new();
2956
2957
2958 visited = g_hash_table_new(NULL, NULL);
2959 ret = s->child->klass->change_aio_ctx(s->child, s->old_parent_ctx,
2960 visited, tran, &error_abort);
2961 g_hash_table_destroy(visited);
2962
2963
2964 assert(ret == true);
2965 tran_commit(tran);
2966 }
2967
2968 bdrv_unref(bs);
2969 bdrv_child_free(s->child);
2970}
2971
2972static TransactionActionDrv bdrv_attach_child_common_drv = {
2973 .abort = bdrv_attach_child_common_abort,
2974 .clean = g_free,
2975};
2976
2977
2978
2979
2980
2981
2982
2983
2984static BdrvChild *bdrv_attach_child_common(BlockDriverState *child_bs,
2985 const char *child_name,
2986 const BdrvChildClass *child_class,
2987 BdrvChildRole child_role,
2988 uint64_t perm, uint64_t shared_perm,
2989 void *opaque,
2990 Transaction *tran, Error **errp)
2991{
2992 BdrvChild *new_child;
2993 AioContext *parent_ctx;
2994 AioContext *child_ctx = bdrv_get_aio_context(child_bs);
2995
2996 assert(child_class->get_parent_desc);
2997 GLOBAL_STATE_CODE();
2998
2999 new_child = g_new(BdrvChild, 1);
3000 *new_child = (BdrvChild) {
3001 .bs = NULL,
3002 .name = g_strdup(child_name),
3003 .klass = child_class,
3004 .role = child_role,
3005 .perm = perm,
3006 .shared_perm = shared_perm,
3007 .opaque = opaque,
3008 };
3009
3010
3011
3012
3013
3014
3015 parent_ctx = bdrv_child_get_parent_aio_context(new_child);
3016 if (child_ctx != parent_ctx) {
3017 Error *local_err = NULL;
3018 int ret = bdrv_try_change_aio_context(child_bs, parent_ctx, NULL,
3019 &local_err);
3020
3021 if (ret < 0 && child_class->change_aio_ctx) {
3022 Transaction *tran = tran_new();
3023 GHashTable *visited = g_hash_table_new(NULL, NULL);
3024 bool ret_child;
3025
3026 g_hash_table_add(visited, new_child);
3027 ret_child = child_class->change_aio_ctx(new_child, child_ctx,
3028 visited, tran, NULL);
3029 if (ret_child == true) {
3030 error_free(local_err);
3031 ret = 0;
3032 }
3033 tran_finalize(tran, ret_child == true ? 0 : -1);
3034 g_hash_table_destroy(visited);
3035 }
3036
3037 if (ret < 0) {
3038 error_propagate(errp, local_err);
3039 bdrv_child_free(new_child);
3040 return NULL;
3041 }
3042 }
3043
3044 bdrv_ref(child_bs);
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062 bdrv_parent_drained_begin_single(new_child);
3063 bdrv_replace_child_noperm(new_child, child_bs);
3064
3065 BdrvAttachChildCommonState *s = g_new(BdrvAttachChildCommonState, 1);
3066 *s = (BdrvAttachChildCommonState) {
3067 .child = new_child,
3068 .old_parent_ctx = parent_ctx,
3069 .old_child_ctx = child_ctx,
3070 };
3071 tran_add(tran, &bdrv_attach_child_common_drv, s);
3072
3073 return new_child;
3074}
3075
3076
3077
3078
3079static BdrvChild *bdrv_attach_child_noperm(BlockDriverState *parent_bs,
3080 BlockDriverState *child_bs,
3081 const char *child_name,
3082 const BdrvChildClass *child_class,
3083 BdrvChildRole child_role,
3084 Transaction *tran,
3085 Error **errp)
3086{
3087 uint64_t perm, shared_perm;
3088
3089 assert(parent_bs->drv);
3090 GLOBAL_STATE_CODE();
3091
3092 if (bdrv_recurse_has_child(child_bs, parent_bs)) {
3093 error_setg(errp, "Making '%s' a %s child of '%s' would create a cycle",
3094 child_bs->node_name, child_name, parent_bs->node_name);
3095 return NULL;
3096 }
3097
3098 bdrv_get_cumulative_perm(parent_bs, &perm, &shared_perm);
3099 bdrv_child_perm(parent_bs, child_bs, NULL, child_role, NULL,
3100 perm, shared_perm, &perm, &shared_perm);
3101
3102 return bdrv_attach_child_common(child_bs, child_name, child_class,
3103 child_role, perm, shared_perm, parent_bs,
3104 tran, errp);
3105}
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
3118 const char *child_name,
3119 const BdrvChildClass *child_class,
3120 BdrvChildRole child_role,
3121 uint64_t perm, uint64_t shared_perm,
3122 void *opaque, Error **errp)
3123{
3124 int ret;
3125 BdrvChild *child;
3126 Transaction *tran = tran_new();
3127
3128 GLOBAL_STATE_CODE();
3129
3130 child = bdrv_attach_child_common(child_bs, child_name, child_class,
3131 child_role, perm, shared_perm, opaque,
3132 tran, errp);
3133 if (!child) {
3134 ret = -EINVAL;
3135 goto out;
3136 }
3137
3138 ret = bdrv_refresh_perms(child_bs, tran, errp);
3139
3140out:
3141 tran_finalize(tran, ret);
3142
3143 bdrv_unref(child_bs);
3144
3145 return ret < 0 ? NULL : child;
3146}
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
3160 BlockDriverState *child_bs,
3161 const char *child_name,
3162 const BdrvChildClass *child_class,
3163 BdrvChildRole child_role,
3164 Error **errp)
3165{
3166 int ret;
3167 BdrvChild *child;
3168 Transaction *tran = tran_new();
3169
3170 GLOBAL_STATE_CODE();
3171
3172 child = bdrv_attach_child_noperm(parent_bs, child_bs, child_name,
3173 child_class, child_role, tran, errp);
3174 if (!child) {
3175 ret = -EINVAL;
3176 goto out;
3177 }
3178
3179 ret = bdrv_refresh_perms(parent_bs, tran, errp);
3180 if (ret < 0) {
3181 goto out;
3182 }
3183
3184out:
3185 tran_finalize(tran, ret);
3186
3187 bdrv_unref(child_bs);
3188
3189 return ret < 0 ? NULL : child;
3190}
3191
3192
3193void bdrv_root_unref_child(BdrvChild *child)
3194{
3195 BlockDriverState *child_bs = child->bs;
3196
3197 GLOBAL_STATE_CODE();
3198 bdrv_replace_child_noperm(child, NULL);
3199 bdrv_child_free(child);
3200
3201 if (child_bs) {
3202
3203
3204
3205
3206
3207 bdrv_refresh_perms(child_bs, NULL, NULL);
3208
3209
3210
3211
3212
3213 bdrv_try_change_aio_context(child_bs, qemu_get_aio_context(), NULL,
3214 NULL);
3215 }
3216
3217 bdrv_unref(child_bs);
3218}
3219
3220typedef struct BdrvSetInheritsFrom {
3221 BlockDriverState *bs;
3222 BlockDriverState *old_inherits_from;
3223} BdrvSetInheritsFrom;
3224
3225static void bdrv_set_inherits_from_abort(void *opaque)
3226{
3227 BdrvSetInheritsFrom *s = opaque;
3228
3229 s->bs->inherits_from = s->old_inherits_from;
3230}
3231
3232static TransactionActionDrv bdrv_set_inherits_from_drv = {
3233 .abort = bdrv_set_inherits_from_abort,
3234 .clean = g_free,
3235};
3236
3237
3238static void bdrv_set_inherits_from(BlockDriverState *bs,
3239 BlockDriverState *new_inherits_from,
3240 Transaction *tran)
3241{
3242 if (tran) {
3243 BdrvSetInheritsFrom *s = g_new(BdrvSetInheritsFrom, 1);
3244
3245 *s = (BdrvSetInheritsFrom) {
3246 .bs = bs,
3247 .old_inherits_from = bs->inherits_from,
3248 };
3249
3250 tran_add(tran, &bdrv_set_inherits_from_drv, s);
3251 }
3252
3253 bs->inherits_from = new_inherits_from;
3254}
3255
3256
3257
3258
3259
3260
3261static void bdrv_unset_inherits_from(BlockDriverState *root, BdrvChild *child,
3262 Transaction *tran)
3263{
3264 BdrvChild *c;
3265
3266 if (child->bs->inherits_from == root) {
3267
3268
3269
3270
3271 QLIST_FOREACH(c, &root->children, next) {
3272 if (c != child && c->bs == child->bs) {
3273 break;
3274 }
3275 }
3276 if (c == NULL) {
3277 bdrv_set_inherits_from(child->bs, NULL, tran);
3278 }
3279 }
3280
3281 QLIST_FOREACH(c, &child->bs->children, next) {
3282 bdrv_unset_inherits_from(root, c, tran);
3283 }
3284}
3285
3286
3287void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child)
3288{
3289 GLOBAL_STATE_CODE();
3290 if (child == NULL) {
3291 return;
3292 }
3293
3294 bdrv_unset_inherits_from(parent, child, NULL);
3295 bdrv_root_unref_child(child);
3296}
3297
3298
3299static void bdrv_parent_cb_change_media(BlockDriverState *bs, bool load)
3300{
3301 BdrvChild *c;
3302 GLOBAL_STATE_CODE();
3303 QLIST_FOREACH(c, &bs->parents, next_parent) {
3304 if (c->klass->change_media) {
3305 c->klass->change_media(c, load);
3306 }
3307 }
3308}
3309
3310
3311
3312static bool bdrv_inherits_from_recursive(BlockDriverState *child,
3313 BlockDriverState *parent)
3314{
3315 while (child && child != parent) {
3316 child = child->inherits_from;
3317 }
3318
3319 return child != NULL;
3320}
3321
3322
3323
3324
3325
3326
3327static BdrvChildRole bdrv_backing_role(BlockDriverState *bs)
3328{
3329 if (bs->drv && bs->drv->is_filter) {
3330 return BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY;
3331 } else {
3332 return BDRV_CHILD_COW;
3333 }
3334}
3335
3336
3337
3338
3339
3340
3341
3342static int bdrv_set_file_or_backing_noperm(BlockDriverState *parent_bs,
3343 BlockDriverState *child_bs,
3344 bool is_backing,
3345 Transaction *tran, Error **errp)
3346{
3347 bool update_inherits_from =
3348 bdrv_inherits_from_recursive(child_bs, parent_bs);
3349 BdrvChild *child = is_backing ? parent_bs->backing : parent_bs->file;
3350 BdrvChildRole role;
3351
3352 GLOBAL_STATE_CODE();
3353
3354 if (!parent_bs->drv) {
3355
3356
3357
3358
3359
3360 error_setg(errp, "Node corrupted");
3361 return -EINVAL;
3362 }
3363
3364 if (child && child->frozen) {
3365 error_setg(errp, "Cannot change frozen '%s' link from '%s' to '%s'",
3366 child->name, parent_bs->node_name, child->bs->node_name);
3367 return -EPERM;
3368 }
3369
3370 if (is_backing && !parent_bs->drv->is_filter &&
3371 !parent_bs->drv->supports_backing)
3372 {
3373 error_setg(errp, "Driver '%s' of node '%s' does not support backing "
3374 "files", parent_bs->drv->format_name, parent_bs->node_name);
3375 return -EINVAL;
3376 }
3377
3378 if (parent_bs->drv->is_filter) {
3379 role = BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY;
3380 } else if (is_backing) {
3381 role = BDRV_CHILD_COW;
3382 } else {
3383
3384
3385
3386
3387 if (!child) {
3388 error_setg(errp, "Cannot set file child to format node without "
3389 "file child");
3390 return -EINVAL;
3391 }
3392 role = child->role;
3393 }
3394
3395 if (child) {
3396 bdrv_unset_inherits_from(parent_bs, child, tran);
3397 bdrv_remove_child(child, tran);
3398 }
3399
3400 if (!child_bs) {
3401 goto out;
3402 }
3403
3404 child = bdrv_attach_child_noperm(parent_bs, child_bs,
3405 is_backing ? "backing" : "file",
3406 &child_of_bds, role,
3407 tran, errp);
3408 if (!child) {
3409 return -EINVAL;
3410 }
3411
3412
3413
3414
3415
3416
3417 if (update_inherits_from) {
3418 bdrv_set_inherits_from(child_bs, parent_bs, tran);
3419 }
3420
3421out:
3422 bdrv_refresh_limits(parent_bs, tran, NULL);
3423
3424 return 0;
3425}
3426
3427static int bdrv_set_backing_noperm(BlockDriverState *bs,
3428 BlockDriverState *backing_hd,
3429 Transaction *tran, Error **errp)
3430{
3431 GLOBAL_STATE_CODE();
3432 return bdrv_set_file_or_backing_noperm(bs, backing_hd, true, tran, errp);
3433}
3434
3435int bdrv_set_backing_hd_drained(BlockDriverState *bs,
3436 BlockDriverState *backing_hd,
3437 Error **errp)
3438{
3439 int ret;
3440 Transaction *tran = tran_new();
3441
3442 GLOBAL_STATE_CODE();
3443 assert(bs->quiesce_counter > 0);
3444
3445 ret = bdrv_set_backing_noperm(bs, backing_hd, tran, errp);
3446 if (ret < 0) {
3447 goto out;
3448 }
3449
3450 ret = bdrv_refresh_perms(bs, tran, errp);
3451out:
3452 tran_finalize(tran, ret);
3453 return ret;
3454}
3455
3456int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
3457 Error **errp)
3458{
3459 int ret;
3460 GLOBAL_STATE_CODE();
3461
3462 bdrv_drained_begin(bs);
3463 ret = bdrv_set_backing_hd_drained(bs, backing_hd, errp);
3464 bdrv_drained_end(bs);
3465
3466 return ret;
3467}
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
3480 const char *bdref_key, Error **errp)
3481{
3482 char *backing_filename = NULL;
3483 char *bdref_key_dot;
3484 const char *reference = NULL;
3485 int ret = 0;
3486 bool implicit_backing = false;
3487 BlockDriverState *backing_hd;
3488 QDict *options;
3489 QDict *tmp_parent_options = NULL;
3490 Error *local_err = NULL;
3491
3492 GLOBAL_STATE_CODE();
3493
3494 if (bs->backing != NULL) {
3495 goto free_exit;
3496 }
3497
3498
3499 if (parent_options == NULL) {
3500 tmp_parent_options = qdict_new();
3501 parent_options = tmp_parent_options;
3502 }
3503
3504 bs->open_flags &= ~BDRV_O_NO_BACKING;
3505
3506 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
3507 qdict_extract_subqdict(parent_options, &options, bdref_key_dot);
3508 g_free(bdref_key_dot);
3509
3510
3511
3512
3513
3514
3515
3516
3517 reference = qdict_get_try_str(parent_options, bdref_key);
3518 if (reference || qdict_haskey(options, "file.filename")) {
3519
3520 } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
3521 qobject_unref(options);
3522 goto free_exit;
3523 } else {
3524 if (qdict_size(options) == 0) {
3525
3526
3527
3528
3529
3530
3531 implicit_backing = !strcmp(bs->auto_backing_file, bs->backing_file);
3532 }
3533
3534 backing_filename = bdrv_get_full_backing_filename(bs, &local_err);
3535 if (local_err) {
3536 ret = -EINVAL;
3537 error_propagate(errp, local_err);
3538 qobject_unref(options);
3539 goto free_exit;
3540 }
3541 }
3542
3543 if (!bs->drv || !bs->drv->supports_backing) {
3544 ret = -EINVAL;
3545 error_setg(errp, "Driver doesn't support backing files");
3546 qobject_unref(options);
3547 goto free_exit;
3548 }
3549
3550 if (!reference &&
3551 bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
3552 qdict_put_str(options, "driver", bs->backing_format);
3553 }
3554
3555 backing_hd = bdrv_open_inherit(backing_filename, reference, options, 0, bs,
3556 &child_of_bds, bdrv_backing_role(bs), errp);
3557 if (!backing_hd) {
3558 bs->open_flags |= BDRV_O_NO_BACKING;
3559 error_prepend(errp, "Could not open backing file: ");
3560 ret = -EINVAL;
3561 goto free_exit;
3562 }
3563
3564 if (implicit_backing) {
3565 bdrv_refresh_filename(backing_hd);
3566 pstrcpy(bs->auto_backing_file, sizeof(bs->auto_backing_file),
3567 backing_hd->filename);
3568 }
3569
3570
3571
3572 ret = bdrv_set_backing_hd(bs, backing_hd, errp);
3573 bdrv_unref(backing_hd);
3574 if (ret < 0) {
3575 goto free_exit;
3576 }
3577
3578 qdict_del(parent_options, bdref_key);
3579
3580free_exit:
3581 g_free(backing_filename);
3582 qobject_unref(tmp_parent_options);
3583 return ret;
3584}
3585
3586static BlockDriverState *
3587bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
3588 BlockDriverState *parent, const BdrvChildClass *child_class,
3589 BdrvChildRole child_role, bool allow_none, Error **errp)
3590{
3591 BlockDriverState *bs = NULL;
3592 QDict *image_options;
3593 char *bdref_key_dot;
3594 const char *reference;
3595
3596 assert(child_class != NULL);
3597
3598 bdref_key_dot = g_strdup_printf("%s.", bdref_key);
3599 qdict_extract_subqdict(options, &image_options, bdref_key_dot);
3600 g_free(bdref_key_dot);
3601
3602
3603
3604
3605
3606
3607
3608
3609 reference = qdict_get_try_str(options, bdref_key);
3610 if (!filename && !reference && !qdict_size(image_options)) {
3611 if (!allow_none) {
3612 error_setg(errp, "A block device must be specified for \"%s\"",
3613 bdref_key);
3614 }
3615 qobject_unref(image_options);
3616 goto done;
3617 }
3618
3619 bs = bdrv_open_inherit(filename, reference, image_options, 0,
3620 parent, child_class, child_role, errp);
3621 if (!bs) {
3622 goto done;
3623 }
3624
3625done:
3626 qdict_del(options, bdref_key);
3627 return bs;
3628}
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644BdrvChild *bdrv_open_child(const char *filename,
3645 QDict *options, const char *bdref_key,
3646 BlockDriverState *parent,
3647 const BdrvChildClass *child_class,
3648 BdrvChildRole child_role,
3649 bool allow_none, Error **errp)
3650{
3651 BlockDriverState *bs;
3652
3653 GLOBAL_STATE_CODE();
3654
3655 bs = bdrv_open_child_bs(filename, options, bdref_key, parent, child_class,
3656 child_role, allow_none, errp);
3657 if (bs == NULL) {
3658 return NULL;
3659 }
3660
3661 return bdrv_attach_child(parent, bs, bdref_key, child_class, child_role,
3662 errp);
3663}
3664
3665
3666
3667
3668int bdrv_open_file_child(const char *filename,
3669 QDict *options, const char *bdref_key,
3670 BlockDriverState *parent, Error **errp)
3671{
3672 BdrvChildRole role;
3673
3674
3675 assert(!parent->drv->filtered_child_is_backing);
3676 role = parent->drv->is_filter ?
3677 (BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY) : BDRV_CHILD_IMAGE;
3678
3679 if (!bdrv_open_child(filename, options, bdref_key, parent,
3680 &child_of_bds, role, false, errp))
3681 {
3682 return -EINVAL;
3683 }
3684
3685 return 0;
3686}
3687
3688
3689
3690
3691
3692BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp)
3693{
3694 BlockDriverState *bs = NULL;
3695 QObject *obj = NULL;
3696 QDict *qdict = NULL;
3697 const char *reference = NULL;
3698 Visitor *v = NULL;
3699
3700 GLOBAL_STATE_CODE();
3701
3702 if (ref->type == QTYPE_QSTRING) {
3703 reference = ref->u.reference;
3704 } else {
3705 BlockdevOptions *options = &ref->u.definition;
3706 assert(ref->type == QTYPE_QDICT);
3707
3708 v = qobject_output_visitor_new(&obj);
3709 visit_type_BlockdevOptions(v, NULL, &options, &error_abort);
3710 visit_complete(v, &obj);
3711
3712 qdict = qobject_to(QDict, obj);
3713 qdict_flatten(qdict);
3714
3715
3716
3717
3718 qdict_set_default_str(qdict, BDRV_OPT_CACHE_DIRECT, "off");
3719 qdict_set_default_str(qdict, BDRV_OPT_CACHE_NO_FLUSH, "off");
3720 qdict_set_default_str(qdict, BDRV_OPT_READ_ONLY, "off");
3721 qdict_set_default_str(qdict, BDRV_OPT_AUTO_READ_ONLY, "off");
3722
3723 }
3724
3725 bs = bdrv_open_inherit(NULL, reference, qdict, 0, NULL, NULL, 0, errp);
3726 obj = NULL;
3727 qobject_unref(obj);
3728 visit_free(v);
3729 return bs;
3730}
3731
3732static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
3733 int flags,
3734 QDict *snapshot_options,
3735 Error **errp)
3736{
3737 g_autofree char *tmp_filename = NULL;
3738 int64_t total_size;
3739 QemuOpts *opts = NULL;
3740 BlockDriverState *bs_snapshot = NULL;
3741 int ret;
3742
3743 GLOBAL_STATE_CODE();
3744
3745
3746
3747
3748
3749 total_size = bdrv_getlength(bs);
3750 if (total_size < 0) {
3751 error_setg_errno(errp, -total_size, "Could not get image size");
3752 goto out;
3753 }
3754
3755
3756 tmp_filename = create_tmp_file(errp);
3757 if (!tmp_filename) {
3758 goto out;
3759 }
3760
3761 opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0,
3762 &error_abort);
3763 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
3764 ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, errp);
3765 qemu_opts_del(opts);
3766 if (ret < 0) {
3767 error_prepend(errp, "Could not create temporary overlay '%s': ",
3768 tmp_filename);
3769 goto out;
3770 }
3771
3772
3773 qdict_put_str(snapshot_options, "file.driver", "file");
3774 qdict_put_str(snapshot_options, "file.filename", tmp_filename);
3775 qdict_put_str(snapshot_options, "driver", "qcow2");
3776
3777 bs_snapshot = bdrv_open(NULL, NULL, snapshot_options, flags, errp);
3778 snapshot_options = NULL;
3779 if (!bs_snapshot) {
3780 goto out;
3781 }
3782
3783 ret = bdrv_append(bs_snapshot, bs, errp);
3784 if (ret < 0) {
3785 bs_snapshot = NULL;
3786 goto out;
3787 }
3788
3789out:
3790 qobject_unref(snapshot_options);
3791 return bs_snapshot;
3792}
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813static BlockDriverState * no_coroutine_fn
3814bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
3815 int flags, BlockDriverState *parent,
3816 const BdrvChildClass *child_class, BdrvChildRole child_role,
3817 Error **errp)
3818{
3819 int ret;
3820 BlockBackend *file = NULL;
3821 BlockDriverState *bs;
3822 BlockDriver *drv = NULL;
3823 BdrvChild *child;
3824 const char *drvname;
3825 const char *backing;
3826 Error *local_err = NULL;
3827 QDict *snapshot_options = NULL;
3828 int snapshot_flags = 0;
3829
3830 assert(!child_class || !flags);
3831 assert(!child_class == !parent);
3832 GLOBAL_STATE_CODE();
3833 assert(!qemu_in_coroutine());
3834
3835 if (reference) {
3836 bool options_non_empty = options ? qdict_size(options) : false;
3837 qobject_unref(options);
3838
3839 if (filename || options_non_empty) {
3840 error_setg(errp, "Cannot reference an existing block device with "
3841 "additional options or a new filename");
3842 return NULL;
3843 }
3844
3845 bs = bdrv_lookup_bs(reference, reference, errp);
3846 if (!bs) {
3847 return NULL;
3848 }
3849
3850 bdrv_ref(bs);
3851 return bs;
3852 }
3853
3854 bs = bdrv_new();
3855
3856
3857 if (options == NULL) {
3858 options = qdict_new();
3859 }
3860
3861
3862 parse_json_protocol(options, &filename, &local_err);
3863 if (local_err) {
3864 goto fail;
3865 }
3866
3867 bs->explicit_options = qdict_clone_shallow(options);
3868
3869 if (child_class) {
3870 bool parent_is_format;
3871
3872 if (parent->drv) {
3873 parent_is_format = parent->drv->is_format;
3874 } else {
3875
3876
3877
3878
3879
3880 parent_is_format = true;
3881 }
3882
3883 bs->inherits_from = parent;
3884 child_class->inherit_options(child_role, parent_is_format,
3885 &flags, options,
3886 parent->open_flags, parent->options);
3887 }
3888
3889 ret = bdrv_fill_options(&options, filename, &flags, &local_err);
3890 if (ret < 0) {
3891 goto fail;
3892 }
3893
3894
3895
3896
3897
3898
3899
3900
3901 if (g_strcmp0(qdict_get_try_str(options, BDRV_OPT_READ_ONLY), "on") &&
3902 !qdict_get_try_bool(options, BDRV_OPT_READ_ONLY, false)) {
3903 flags |= (BDRV_O_RDWR | BDRV_O_ALLOW_RDWR);
3904 } else {
3905 flags &= ~BDRV_O_RDWR;
3906 }
3907
3908 if (flags & BDRV_O_SNAPSHOT) {
3909 snapshot_options = qdict_new();
3910 bdrv_temp_snapshot_options(&snapshot_flags, snapshot_options,
3911 flags, options);
3912
3913 qdict_del(options, BDRV_OPT_READ_ONLY);
3914 bdrv_inherited_options(BDRV_CHILD_COW, true,
3915 &flags, options, flags, options);
3916 }
3917
3918 bs->open_flags = flags;
3919 bs->options = options;
3920 options = qdict_clone_shallow(options);
3921
3922
3923
3924 drvname = qdict_get_try_str(options, "driver");
3925 if (drvname) {
3926 drv = bdrv_find_format(drvname);
3927 if (!drv) {
3928 error_setg(errp, "Unknown driver: '%s'", drvname);
3929 goto fail;
3930 }
3931 }
3932
3933 assert(drvname || !(flags & BDRV_O_PROTOCOL));
3934
3935
3936 backing = qdict_get_try_str(options, "backing");
3937 if (qobject_to(QNull, qdict_get(options, "backing")) != NULL ||
3938 (backing && *backing == '\0'))
3939 {
3940 if (backing) {
3941 warn_report("Use of \"backing\": \"\" is deprecated; "
3942 "use \"backing\": null instead");
3943 }
3944 flags |= BDRV_O_NO_BACKING;
3945 qdict_del(bs->explicit_options, "backing");
3946 qdict_del(bs->options, "backing");
3947 qdict_del(options, "backing");
3948 }
3949
3950
3951
3952
3953 if ((flags & BDRV_O_PROTOCOL) == 0) {
3954 BlockDriverState *file_bs;
3955
3956 file_bs = bdrv_open_child_bs(filename, options, "file", bs,
3957 &child_of_bds, BDRV_CHILD_IMAGE,
3958 true, &local_err);
3959 if (local_err) {
3960 goto fail;
3961 }
3962 if (file_bs != NULL) {
3963
3964
3965
3966 file = blk_new(bdrv_get_aio_context(file_bs), 0, BLK_PERM_ALL);
3967 blk_insert_bs(file, file_bs, &local_err);
3968 bdrv_unref(file_bs);
3969 if (local_err) {
3970 goto fail;
3971 }
3972
3973 qdict_put_str(options, "file", bdrv_get_node_name(file_bs));
3974 }
3975 }
3976
3977
3978 bs->probed = !drv;
3979 if (!drv && file) {
3980 ret = find_image_format(file, filename, &drv, &local_err);
3981 if (ret < 0) {
3982 goto fail;
3983 }
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995 qdict_put_str(bs->options, "driver", drv->format_name);
3996 qdict_put_str(options, "driver", drv->format_name);
3997 } else if (!drv) {
3998 error_setg(errp, "Must specify either driver or file");
3999 goto fail;
4000 }
4001
4002
4003 assert(!!(flags & BDRV_O_PROTOCOL) == !!drv->bdrv_file_open);
4004
4005
4006 assert(!(flags & BDRV_O_PROTOCOL) || !file);
4007
4008
4009 ret = bdrv_open_common(bs, file, options, &local_err);
4010 if (ret < 0) {
4011 goto fail;
4012 }
4013
4014 if (file) {
4015 blk_unref(file);
4016 file = NULL;
4017 }
4018
4019
4020 if ((flags & BDRV_O_NO_BACKING) == 0) {
4021 ret = bdrv_open_backing_file(bs, options, "backing", &local_err);
4022 if (ret < 0) {
4023 goto close_and_fail;
4024 }
4025 }
4026
4027
4028
4029 QLIST_FOREACH(child, &bs->children, next) {
4030 char *child_key_dot;
4031 child_key_dot = g_strdup_printf("%s.", child->name);
4032 qdict_extract_subqdict(bs->explicit_options, NULL, child_key_dot);
4033 qdict_extract_subqdict(bs->options, NULL, child_key_dot);
4034 qdict_del(bs->explicit_options, child->name);
4035 qdict_del(bs->options, child->name);
4036 g_free(child_key_dot);
4037 }
4038
4039
4040 if (qdict_size(options) != 0) {
4041 const QDictEntry *entry = qdict_first(options);
4042 if (flags & BDRV_O_PROTOCOL) {
4043 error_setg(errp, "Block protocol '%s' doesn't support the option "
4044 "'%s'", drv->format_name, entry->key);
4045 } else {
4046 error_setg(errp,
4047 "Block format '%s' does not support the option '%s'",
4048 drv->format_name, entry->key);
4049 }
4050
4051 goto close_and_fail;
4052 }
4053
4054 bdrv_parent_cb_change_media(bs, true);
4055
4056 qobject_unref(options);
4057 options = NULL;
4058
4059
4060
4061 if (snapshot_flags) {
4062 BlockDriverState *snapshot_bs;
4063 snapshot_bs = bdrv_append_temp_snapshot(bs, snapshot_flags,
4064 snapshot_options, &local_err);
4065 snapshot_options = NULL;
4066 if (local_err) {
4067 goto close_and_fail;
4068 }
4069
4070
4071
4072
4073 bdrv_unref(bs);
4074 bs = snapshot_bs;
4075 }
4076
4077 return bs;
4078
4079fail:
4080 blk_unref(file);
4081 qobject_unref(snapshot_options);
4082 qobject_unref(bs->explicit_options);
4083 qobject_unref(bs->options);
4084 qobject_unref(options);
4085 bs->options = NULL;
4086 bs->explicit_options = NULL;
4087 bdrv_unref(bs);
4088 error_propagate(errp, local_err);
4089 return NULL;
4090
4091close_and_fail:
4092 bdrv_unref(bs);
4093 qobject_unref(snapshot_options);
4094 qobject_unref(options);
4095 error_propagate(errp, local_err);
4096 return NULL;
4097}
4098
4099
4100
4101
4102
4103
4104BlockDriverState *bdrv_open(const char *filename, const char *reference,
4105 QDict *options, int flags, Error **errp)
4106{
4107 GLOBAL_STATE_CODE();
4108
4109 return bdrv_open_inherit(filename, reference, options, flags, NULL,
4110 NULL, 0, errp);
4111}
4112
4113
4114static bool is_str_in_list(const char *str, const char *const *list)
4115{
4116 if (str && list) {
4117 int i;
4118 for (i = 0; list[i] != NULL; i++) {
4119 if (!strcmp(str, list[i])) {
4120 return true;
4121 }
4122 }
4123 }
4124 return false;
4125}
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136static int bdrv_reset_options_allowed(BlockDriverState *bs,
4137 const QDict *new_opts, Error **errp)
4138{
4139 const QDictEntry *e;
4140
4141
4142 const char *const common_options[] = {
4143 "node-name", "discard", "cache.direct", "cache.no-flush",
4144 "read-only", "auto-read-only", "detect-zeroes", NULL
4145 };
4146
4147 for (e = qdict_first(bs->options); e; e = qdict_next(bs->options, e)) {
4148 if (!qdict_haskey(new_opts, e->key) &&
4149 !is_str_in_list(e->key, common_options) &&
4150 !is_str_in_list(e->key, bs->drv->mutable_opts)) {
4151 error_setg(errp, "Option '%s' cannot be reset "
4152 "to its default value", e->key);
4153 return -EINVAL;
4154 }
4155 }
4156
4157 return 0;
4158}
4159
4160
4161
4162
4163static bool bdrv_recurse_has_child(BlockDriverState *bs,
4164 BlockDriverState *child)
4165{
4166 BdrvChild *c;
4167
4168 if (bs == child) {
4169 return true;
4170 }
4171
4172 QLIST_FOREACH(c, &bs->children, next) {
4173 if (bdrv_recurse_has_child(c->bs, child)) {
4174 return true;
4175 }
4176 }
4177
4178 return false;
4179}
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205static BlockReopenQueue *bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
4206 BlockDriverState *bs,
4207 QDict *options,
4208 const BdrvChildClass *klass,
4209 BdrvChildRole role,
4210 bool parent_is_format,
4211 QDict *parent_options,
4212 int parent_flags,
4213 bool keep_old_opts)
4214{
4215 assert(bs != NULL);
4216
4217 BlockReopenQueueEntry *bs_entry;
4218 BdrvChild *child;
4219 QDict *old_options, *explicit_options, *options_copy;
4220 int flags;
4221 QemuOpts *opts;
4222
4223 GLOBAL_STATE_CODE();
4224
4225 bdrv_drained_begin(bs);
4226
4227 if (bs_queue == NULL) {
4228 bs_queue = g_new0(BlockReopenQueue, 1);
4229 QTAILQ_INIT(bs_queue);
4230 }
4231
4232 if (!options) {
4233 options = qdict_new();
4234 }
4235
4236
4237 QTAILQ_FOREACH(bs_entry, bs_queue, entry) {
4238 if (bs == bs_entry->state.bs) {
4239 break;
4240 }
4241 }
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252 if (bs_entry || keep_old_opts) {
4253 old_options = qdict_clone_shallow(bs_entry ?
4254 bs_entry->state.explicit_options :
4255 bs->explicit_options);
4256 bdrv_join_options(bs, options, old_options);
4257 qobject_unref(old_options);
4258 }
4259
4260 explicit_options = qdict_clone_shallow(options);
4261
4262
4263 if (parent_options) {
4264 flags = 0;
4265 klass->inherit_options(role, parent_is_format, &flags, options,
4266 parent_flags, parent_options);
4267 } else {
4268 flags = bdrv_get_flags(bs);
4269 }
4270
4271 if (keep_old_opts) {
4272
4273 old_options = qdict_clone_shallow(bs->options);
4274 bdrv_join_options(bs, options, old_options);
4275 qobject_unref(old_options);
4276 }
4277
4278
4279 options_copy = qdict_clone_shallow(options);
4280 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
4281 qemu_opts_absorb_qdict(opts, options_copy, NULL);
4282 update_flags_from_options(&flags, opts);
4283 qemu_opts_del(opts);
4284 qobject_unref(options_copy);
4285
4286
4287 flags &= ~BDRV_O_PROTOCOL;
4288 if (flags & BDRV_O_RDWR) {
4289 flags |= BDRV_O_ALLOW_RDWR;
4290 }
4291
4292 if (!bs_entry) {
4293 bs_entry = g_new0(BlockReopenQueueEntry, 1);
4294 QTAILQ_INSERT_TAIL(bs_queue, bs_entry, entry);
4295 } else {
4296 qobject_unref(bs_entry->state.options);
4297 qobject_unref(bs_entry->state.explicit_options);
4298 }
4299
4300 bs_entry->state.bs = bs;
4301 bs_entry->state.options = options;
4302 bs_entry->state.explicit_options = explicit_options;
4303 bs_entry->state.flags = flags;
4304
4305
4306
4307
4308
4309
4310
4311 if (!keep_old_opts) {
4312 bs_entry->state.backing_missing =
4313 !qdict_haskey(options, "backing") &&
4314 !qdict_haskey(options, "backing.driver");
4315 }
4316
4317 QLIST_FOREACH(child, &bs->children, next) {
4318 QDict *new_child_options = NULL;
4319 bool child_keep_old = keep_old_opts;
4320
4321
4322
4323
4324 if (child->bs->inherits_from != bs) {
4325 continue;
4326 }
4327
4328
4329 if (qdict_haskey(options, child->name)) {
4330 const char *childref = qdict_get_try_str(options, child->name);
4331
4332
4333
4334
4335 if (g_strcmp0(childref, child->bs->node_name)) {
4336 continue;
4337 }
4338
4339
4340
4341
4342
4343 child_keep_old = true;
4344 } else {
4345
4346 char *child_key_dot = g_strdup_printf("%s.", child->name);
4347 qdict_extract_subqdict(explicit_options, NULL, child_key_dot);
4348 qdict_extract_subqdict(options, &new_child_options, child_key_dot);
4349 g_free(child_key_dot);
4350 }
4351
4352 bdrv_reopen_queue_child(bs_queue, child->bs, new_child_options,
4353 child->klass, child->role, bs->drv->is_format,
4354 options, flags, child_keep_old);
4355 }
4356
4357 return bs_queue;
4358}
4359
4360
4361BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
4362 BlockDriverState *bs,
4363 QDict *options, bool keep_old_opts)
4364{
4365 GLOBAL_STATE_CODE();
4366
4367 return bdrv_reopen_queue_child(bs_queue, bs, options, NULL, 0, false,
4368 NULL, 0, keep_old_opts);
4369}
4370
4371void bdrv_reopen_queue_free(BlockReopenQueue *bs_queue)
4372{
4373 GLOBAL_STATE_CODE();
4374 if (bs_queue) {
4375 BlockReopenQueueEntry *bs_entry, *next;
4376 QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
4377 AioContext *ctx = bdrv_get_aio_context(bs_entry->state.bs);
4378
4379 aio_context_acquire(ctx);
4380 bdrv_drained_end(bs_entry->state.bs);
4381 aio_context_release(ctx);
4382
4383 qobject_unref(bs_entry->state.explicit_options);
4384 qobject_unref(bs_entry->state.options);
4385 g_free(bs_entry);
4386 }
4387 g_free(bs_queue);
4388 }
4389}
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
4411{
4412 int ret = -1;
4413 BlockReopenQueueEntry *bs_entry, *next;
4414 AioContext *ctx;
4415 Transaction *tran = tran_new();
4416 g_autoptr(GSList) refresh_list = NULL;
4417
4418 assert(qemu_get_current_aio_context() == qemu_get_aio_context());
4419 assert(bs_queue != NULL);
4420 GLOBAL_STATE_CODE();
4421
4422 QTAILQ_FOREACH(bs_entry, bs_queue, entry) {
4423 ctx = bdrv_get_aio_context(bs_entry->state.bs);
4424 aio_context_acquire(ctx);
4425 ret = bdrv_flush(bs_entry->state.bs);
4426 aio_context_release(ctx);
4427 if (ret < 0) {
4428 error_setg_errno(errp, -ret, "Error flushing drive");
4429 goto abort;
4430 }
4431 }
4432
4433 QTAILQ_FOREACH(bs_entry, bs_queue, entry) {
4434 assert(bs_entry->state.bs->quiesce_counter > 0);
4435 ctx = bdrv_get_aio_context(bs_entry->state.bs);
4436 aio_context_acquire(ctx);
4437 ret = bdrv_reopen_prepare(&bs_entry->state, bs_queue, tran, errp);
4438 aio_context_release(ctx);
4439 if (ret < 0) {
4440 goto abort;
4441 }
4442 bs_entry->prepared = true;
4443 }
4444
4445 QTAILQ_FOREACH(bs_entry, bs_queue, entry) {
4446 BDRVReopenState *state = &bs_entry->state;
4447
4448 refresh_list = g_slist_prepend(refresh_list, state->bs);
4449 if (state->old_backing_bs) {
4450 refresh_list = g_slist_prepend(refresh_list, state->old_backing_bs);
4451 }
4452 if (state->old_file_bs) {
4453 refresh_list = g_slist_prepend(refresh_list, state->old_file_bs);
4454 }
4455 }
4456
4457
4458
4459
4460
4461
4462
4463 ret = bdrv_list_refresh_perms(refresh_list, bs_queue, tran, errp);
4464 if (ret < 0) {
4465 goto abort;
4466 }
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477 QTAILQ_FOREACH_REVERSE(bs_entry, bs_queue, entry) {
4478 ctx = bdrv_get_aio_context(bs_entry->state.bs);
4479 aio_context_acquire(ctx);
4480 bdrv_reopen_commit(&bs_entry->state);
4481 aio_context_release(ctx);
4482 }
4483
4484 tran_commit(tran);
4485
4486 QTAILQ_FOREACH_REVERSE(bs_entry, bs_queue, entry) {
4487 BlockDriverState *bs = bs_entry->state.bs;
4488
4489 if (bs->drv->bdrv_reopen_commit_post) {
4490 ctx = bdrv_get_aio_context(bs);
4491 aio_context_acquire(ctx);
4492 bs->drv->bdrv_reopen_commit_post(&bs_entry->state);
4493 aio_context_release(ctx);
4494 }
4495 }
4496
4497 ret = 0;
4498 goto cleanup;
4499
4500abort:
4501 tran_abort(tran);
4502 QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
4503 if (bs_entry->prepared) {
4504 ctx = bdrv_get_aio_context(bs_entry->state.bs);
4505 aio_context_acquire(ctx);
4506 bdrv_reopen_abort(&bs_entry->state);
4507 aio_context_release(ctx);
4508 }
4509 }
4510
4511cleanup:
4512 bdrv_reopen_queue_free(bs_queue);
4513
4514 return ret;
4515}
4516
4517int bdrv_reopen(BlockDriverState *bs, QDict *opts, bool keep_old_opts,
4518 Error **errp)
4519{
4520 AioContext *ctx = bdrv_get_aio_context(bs);
4521 BlockReopenQueue *queue;
4522 int ret;
4523
4524 GLOBAL_STATE_CODE();
4525
4526 queue = bdrv_reopen_queue(NULL, bs, opts, keep_old_opts);
4527
4528 if (ctx != qemu_get_aio_context()) {
4529 aio_context_release(ctx);
4530 }
4531 ret = bdrv_reopen_multiple(queue, errp);
4532
4533 if (ctx != qemu_get_aio_context()) {
4534 aio_context_acquire(ctx);
4535 }
4536
4537 return ret;
4538}
4539
4540int bdrv_reopen_set_read_only(BlockDriverState *bs, bool read_only,
4541 Error **errp)
4542{
4543 QDict *opts = qdict_new();
4544
4545 GLOBAL_STATE_CODE();
4546
4547 qdict_put_bool(opts, BDRV_OPT_READ_ONLY, read_only);
4548
4549 return bdrv_reopen(bs, opts, true, errp);
4550}
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569static int bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state,
4570 bool is_backing, Transaction *tran,
4571 Error **errp)
4572{
4573 BlockDriverState *bs = reopen_state->bs;
4574 BlockDriverState *new_child_bs;
4575 BlockDriverState *old_child_bs = is_backing ? child_bs(bs->backing) :
4576 child_bs(bs->file);
4577 const char *child_name = is_backing ? "backing" : "file";
4578 QObject *value;
4579 const char *str;
4580
4581 GLOBAL_STATE_CODE();
4582
4583 value = qdict_get(reopen_state->options, child_name);
4584 if (value == NULL) {
4585 return 0;
4586 }
4587
4588 switch (qobject_type(value)) {
4589 case QTYPE_QNULL:
4590 assert(is_backing);
4591 new_child_bs = NULL;
4592 break;
4593 case QTYPE_QSTRING:
4594 str = qstring_get_str(qobject_to(QString, value));
4595 new_child_bs = bdrv_lookup_bs(NULL, str, errp);
4596 if (new_child_bs == NULL) {
4597 return -EINVAL;
4598 } else if (bdrv_recurse_has_child(new_child_bs, bs)) {
4599 error_setg(errp, "Making '%s' a %s child of '%s' would create a "
4600 "cycle", str, child_name, bs->node_name);
4601 return -EINVAL;
4602 }
4603 break;
4604 default:
4605
4606
4607
4608
4609 g_assert_not_reached();
4610 }
4611
4612 if (old_child_bs == new_child_bs) {
4613 return 0;
4614 }
4615
4616 if (old_child_bs) {
4617 if (bdrv_skip_implicit_filters(old_child_bs) == new_child_bs) {
4618 return 0;
4619 }
4620
4621 if (old_child_bs->implicit) {
4622 error_setg(errp, "Cannot replace implicit %s child of %s",
4623 child_name, bs->node_name);
4624 return -EPERM;
4625 }
4626 }
4627
4628 if (bs->drv->is_filter && !old_child_bs) {
4629
4630
4631
4632
4633 error_setg(errp, "'%s' is a %s filter node that does not support a "
4634 "%s child", bs->node_name, bs->drv->format_name, child_name);
4635 return -EINVAL;
4636 }
4637
4638 if (is_backing) {
4639 reopen_state->old_backing_bs = old_child_bs;
4640 } else {
4641 reopen_state->old_file_bs = old_child_bs;
4642 }
4643
4644 return bdrv_set_file_or_backing_noperm(bs, new_child_bs, is_backing,
4645 tran, errp);
4646}
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665static int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
4666 BlockReopenQueue *queue,
4667 Transaction *change_child_tran, Error **errp)
4668{
4669 int ret = -1;
4670 int old_flags;
4671 Error *local_err = NULL;
4672 BlockDriver *drv;
4673 QemuOpts *opts;
4674 QDict *orig_reopen_opts;
4675 char *discard = NULL;
4676 bool read_only;
4677 bool drv_prepared = false;
4678
4679 assert(reopen_state != NULL);
4680 assert(reopen_state->bs->drv != NULL);
4681 GLOBAL_STATE_CODE();
4682 drv = reopen_state->bs->drv;
4683
4684
4685
4686
4687 orig_reopen_opts = qdict_clone_shallow(reopen_state->options);
4688
4689
4690 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
4691 if (!qemu_opts_absorb_qdict(opts, reopen_state->options, errp)) {
4692 ret = -EINVAL;
4693 goto error;
4694 }
4695
4696
4697
4698
4699 old_flags = reopen_state->flags;
4700 update_flags_from_options(&reopen_state->flags, opts);
4701 assert(old_flags == reopen_state->flags);
4702
4703 discard = qemu_opt_get_del(opts, BDRV_OPT_DISCARD);
4704 if (discard != NULL) {
4705 if (bdrv_parse_discard_flags(discard, &reopen_state->flags) != 0) {
4706 error_setg(errp, "Invalid discard option");
4707 ret = -EINVAL;
4708 goto error;
4709 }
4710 }
4711
4712 reopen_state->detect_zeroes =
4713 bdrv_parse_detect_zeroes(opts, reopen_state->flags, &local_err);
4714 if (local_err) {
4715 error_propagate(errp, local_err);
4716 ret = -EINVAL;
4717 goto error;
4718 }
4719
4720
4721
4722
4723 qemu_opts_to_qdict(opts, reopen_state->options);
4724
4725
4726
4727
4728 read_only = !(reopen_state->flags & BDRV_O_RDWR);
4729 ret = bdrv_can_set_read_only(reopen_state->bs, read_only, true, &local_err);
4730 if (local_err) {
4731 error_propagate(errp, local_err);
4732 goto error;
4733 }
4734
4735 if (drv->bdrv_reopen_prepare) {
4736
4737
4738
4739
4740
4741 ret = bdrv_reset_options_allowed(reopen_state->bs,
4742 reopen_state->options, errp);
4743 if (ret) {
4744 goto error;
4745 }
4746
4747 ret = drv->bdrv_reopen_prepare(reopen_state, queue, &local_err);
4748 if (ret) {
4749 if (local_err != NULL) {
4750 error_propagate(errp, local_err);
4751 } else {
4752 bdrv_refresh_filename(reopen_state->bs);
4753 error_setg(errp, "failed while preparing to reopen image '%s'",
4754 reopen_state->bs->filename);
4755 }
4756 goto error;
4757 }
4758 } else {
4759
4760
4761 error_setg(errp, "Block format '%s' used by node '%s' "
4762 "does not support reopening files", drv->format_name,
4763 bdrv_get_device_or_node_name(reopen_state->bs));
4764 ret = -1;
4765 goto error;
4766 }
4767
4768 drv_prepared = true;
4769
4770
4771
4772
4773
4774
4775 if (drv->supports_backing && reopen_state->backing_missing &&
4776 (reopen_state->bs->backing || reopen_state->bs->backing_file[0])) {
4777 error_setg(errp, "backing is missing for '%s'",
4778 reopen_state->bs->node_name);
4779 ret = -EINVAL;
4780 goto error;
4781 }
4782
4783
4784
4785
4786
4787
4788 ret = bdrv_reopen_parse_file_or_backing(reopen_state, true,
4789 change_child_tran, errp);
4790 if (ret < 0) {
4791 goto error;
4792 }
4793 qdict_del(reopen_state->options, "backing");
4794
4795
4796 ret = bdrv_reopen_parse_file_or_backing(reopen_state, false,
4797 change_child_tran, errp);
4798 if (ret < 0) {
4799 goto error;
4800 }
4801 qdict_del(reopen_state->options, "file");
4802
4803
4804
4805
4806 if (qdict_size(reopen_state->options)) {
4807 const QDictEntry *entry = qdict_first(reopen_state->options);
4808
4809 do {
4810 QObject *new = entry->value;
4811 QObject *old = qdict_get(reopen_state->bs->options, entry->key);
4812
4813
4814
4815 if (qobject_type(new) == QTYPE_QSTRING) {
4816 BdrvChild *child;
4817 QLIST_FOREACH(child, &reopen_state->bs->children, next) {
4818 if (!strcmp(child->name, entry->key)) {
4819 break;
4820 }
4821 }
4822
4823 if (child) {
4824 if (!strcmp(child->bs->node_name,
4825 qstring_get_str(qobject_to(QString, new)))) {
4826 continue;
4827 }
4828 }
4829 }
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847 if (!qobject_is_equal(new, old)) {
4848 error_setg(errp, "Cannot change the option '%s'", entry->key);
4849 ret = -EINVAL;
4850 goto error;
4851 }
4852 } while ((entry = qdict_next(reopen_state->options, entry)));
4853 }
4854
4855 ret = 0;
4856
4857
4858 qobject_unref(reopen_state->options);
4859 reopen_state->options = qobject_ref(orig_reopen_opts);
4860
4861error:
4862 if (ret < 0 && drv_prepared) {
4863
4864
4865
4866
4867 if (drv->bdrv_reopen_abort) {
4868 drv->bdrv_reopen_abort(reopen_state);
4869 }
4870 }
4871 qemu_opts_del(opts);
4872 qobject_unref(orig_reopen_opts);
4873 g_free(discard);
4874 return ret;
4875}
4876
4877
4878
4879
4880
4881
4882static void bdrv_reopen_commit(BDRVReopenState *reopen_state)
4883{
4884 BlockDriver *drv;
4885 BlockDriverState *bs;
4886 BdrvChild *child;
4887
4888 assert(reopen_state != NULL);
4889 bs = reopen_state->bs;
4890 drv = bs->drv;
4891 assert(drv != NULL);
4892 GLOBAL_STATE_CODE();
4893
4894
4895 if (drv->bdrv_reopen_commit) {
4896 drv->bdrv_reopen_commit(reopen_state);
4897 }
4898
4899
4900 qobject_unref(bs->explicit_options);
4901 qobject_unref(bs->options);
4902 qobject_ref(reopen_state->explicit_options);
4903 qobject_ref(reopen_state->options);
4904
4905 bs->explicit_options = reopen_state->explicit_options;
4906 bs->options = reopen_state->options;
4907 bs->open_flags = reopen_state->flags;
4908 bs->detect_zeroes = reopen_state->detect_zeroes;
4909
4910
4911
4912 QLIST_FOREACH(child, &bs->children, next) {
4913 qdict_del(bs->explicit_options, child->name);
4914 qdict_del(bs->options, child->name);
4915 }
4916
4917 qdict_del(bs->explicit_options, "backing");
4918 qdict_del(bs->options, "backing");
4919
4920 bdrv_refresh_limits(bs, NULL, NULL);
4921 bdrv_refresh_total_sectors(bs, bs->total_sectors);
4922}
4923
4924
4925
4926
4927
4928static void bdrv_reopen_abort(BDRVReopenState *reopen_state)
4929{
4930 BlockDriver *drv;
4931
4932 assert(reopen_state != NULL);
4933 drv = reopen_state->bs->drv;
4934 assert(drv != NULL);
4935 GLOBAL_STATE_CODE();
4936
4937 if (drv->bdrv_reopen_abort) {
4938 drv->bdrv_reopen_abort(reopen_state);
4939 }
4940}
4941
4942
4943static void bdrv_close(BlockDriverState *bs)
4944{
4945 BdrvAioNotifier *ban, *ban_next;
4946 BdrvChild *child, *next;
4947
4948 GLOBAL_STATE_CODE();
4949 assert(!bs->refcnt);
4950
4951 bdrv_drained_begin(bs);
4952 bdrv_flush(bs);
4953 bdrv_drain(bs);
4954
4955 if (bs->drv) {
4956 if (bs->drv->bdrv_close) {
4957
4958 bs->drv->bdrv_close(bs);
4959 }
4960 bs->drv = NULL;
4961 }
4962
4963 QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
4964 bdrv_unref_child(bs, child);
4965 }
4966
4967 assert(!bs->backing);
4968 assert(!bs->file);
4969 g_free(bs->opaque);
4970 bs->opaque = NULL;
4971 qatomic_set(&bs->copy_on_read, 0);
4972 bs->backing_file[0] = '\0';
4973 bs->backing_format[0] = '\0';
4974 bs->total_sectors = 0;
4975 bs->encrypted = false;
4976 bs->sg = false;
4977 qobject_unref(bs->options);
4978 qobject_unref(bs->explicit_options);
4979 bs->options = NULL;
4980 bs->explicit_options = NULL;
4981 qobject_unref(bs->full_open_options);
4982 bs->full_open_options = NULL;
4983 g_free(bs->block_status_cache);
4984 bs->block_status_cache = NULL;
4985
4986 bdrv_release_named_dirty_bitmaps(bs);
4987 assert(QLIST_EMPTY(&bs->dirty_bitmaps));
4988
4989 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
4990 g_free(ban);
4991 }
4992 QLIST_INIT(&bs->aio_notifiers);
4993 bdrv_drained_end(bs);
4994
4995
4996
4997
4998
4999
5000 if (bs->quiesce_counter) {
5001 bdrv_drain_all_end_quiesce(bs);
5002 }
5003}
5004
5005void bdrv_close_all(void)
5006{
5007 GLOBAL_STATE_CODE();
5008 assert(job_next(NULL) == NULL);
5009
5010
5011
5012 bdrv_drain_all();
5013
5014 blk_remove_all_bs();
5015 blockdev_close_all_bdrv_states();
5016
5017 assert(QTAILQ_EMPTY(&all_bdrv_states));
5018}
5019
5020static bool should_update_child(BdrvChild *c, BlockDriverState *to)
5021{
5022 GQueue *queue;
5023 GHashTable *found;
5024 bool ret;
5025
5026 if (c->klass->stay_at_node) {
5027 return false;
5028 }
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068 ret = true;
5069 found = g_hash_table_new(NULL, NULL);
5070 g_hash_table_add(found, to);
5071 queue = g_queue_new();
5072 g_queue_push_tail(queue, to);
5073
5074 while (!g_queue_is_empty(queue)) {
5075 BlockDriverState *v = g_queue_pop_head(queue);
5076 BdrvChild *c2;
5077
5078 QLIST_FOREACH(c2, &v->children, next) {
5079 if (c2 == c) {
5080 ret = false;
5081 break;
5082 }
5083
5084 if (g_hash_table_contains(found, c2->bs)) {
5085 continue;
5086 }
5087
5088 g_queue_push_tail(queue, c2->bs);
5089 g_hash_table_add(found, c2->bs);
5090 }
5091 }
5092
5093 g_queue_free(queue);
5094 g_hash_table_destroy(found);
5095
5096 return ret;
5097}
5098
5099static void bdrv_remove_child_commit(void *opaque)
5100{
5101 GLOBAL_STATE_CODE();
5102 bdrv_child_free(opaque);
5103}
5104
5105static TransactionActionDrv bdrv_remove_child_drv = {
5106 .commit = bdrv_remove_child_commit,
5107};
5108
5109
5110static void bdrv_remove_child(BdrvChild *child, Transaction *tran)
5111{
5112 if (!child) {
5113 return;
5114 }
5115
5116 if (child->bs) {
5117 BlockDriverState *bs = child->bs;
5118 bdrv_drained_begin(bs);
5119 bdrv_replace_child_tran(child, NULL, tran);
5120 bdrv_drained_end(bs);
5121 }
5122
5123 tran_add(tran, &bdrv_remove_child_drv, child);
5124}
5125
5126static void undrain_on_clean_cb(void *opaque)
5127{
5128 bdrv_drained_end(opaque);
5129}
5130
5131static TransactionActionDrv undrain_on_clean = {
5132 .clean = undrain_on_clean_cb,
5133};
5134
5135static int bdrv_replace_node_noperm(BlockDriverState *from,
5136 BlockDriverState *to,
5137 bool auto_skip, Transaction *tran,
5138 Error **errp)
5139{
5140 BdrvChild *c, *next;
5141
5142 GLOBAL_STATE_CODE();
5143
5144 bdrv_drained_begin(from);
5145 bdrv_drained_begin(to);
5146 tran_add(tran, &undrain_on_clean, from);
5147 tran_add(tran, &undrain_on_clean, to);
5148
5149 QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) {
5150 assert(c->bs == from);
5151 if (!should_update_child(c, to)) {
5152 if (auto_skip) {
5153 continue;
5154 }
5155 error_setg(errp, "Should not change '%s' link to '%s'",
5156 c->name, from->node_name);
5157 return -EINVAL;
5158 }
5159 if (c->frozen) {
5160 error_setg(errp, "Cannot change '%s' link to '%s'",
5161 c->name, from->node_name);
5162 return -EPERM;
5163 }
5164 bdrv_replace_child_tran(c, to, tran);
5165 }
5166
5167 return 0;
5168}
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180static int bdrv_replace_node_common(BlockDriverState *from,
5181 BlockDriverState *to,
5182 bool auto_skip, bool detach_subchain,
5183 Error **errp)
5184{
5185 Transaction *tran = tran_new();
5186 g_autoptr(GSList) refresh_list = NULL;
5187 BlockDriverState *to_cow_parent = NULL;
5188 int ret;
5189
5190 GLOBAL_STATE_CODE();
5191
5192 if (detach_subchain) {
5193 assert(bdrv_chain_contains(from, to));
5194 assert(from != to);
5195 for (to_cow_parent = from;
5196 bdrv_filter_or_cow_bs(to_cow_parent) != to;
5197 to_cow_parent = bdrv_filter_or_cow_bs(to_cow_parent))
5198 {
5199 ;
5200 }
5201 }
5202
5203
5204
5205 bdrv_ref(from);
5206
5207 assert(qemu_get_current_aio_context() == qemu_get_aio_context());
5208 assert(bdrv_get_aio_context(from) == bdrv_get_aio_context(to));
5209 bdrv_drained_begin(from);
5210
5211
5212
5213
5214
5215
5216
5217 ret = bdrv_replace_node_noperm(from, to, auto_skip, tran, errp);
5218 if (ret < 0) {
5219 goto out;
5220 }
5221
5222 if (detach_subchain) {
5223 bdrv_remove_child(bdrv_filter_or_cow_child(to_cow_parent), tran);
5224 }
5225
5226 refresh_list = g_slist_prepend(refresh_list, to);
5227 refresh_list = g_slist_prepend(refresh_list, from);
5228
5229 ret = bdrv_list_refresh_perms(refresh_list, NULL, tran, errp);
5230 if (ret < 0) {
5231 goto out;
5232 }
5233
5234 ret = 0;
5235
5236out:
5237 tran_finalize(tran, ret);
5238
5239 bdrv_drained_end(from);
5240 bdrv_unref(from);
5241
5242 return ret;
5243}
5244
5245int bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
5246 Error **errp)
5247{
5248 GLOBAL_STATE_CODE();
5249
5250 return bdrv_replace_node_common(from, to, true, false, errp);
5251}
5252
5253int bdrv_drop_filter(BlockDriverState *bs, Error **errp)
5254{
5255 GLOBAL_STATE_CODE();
5256
5257 return bdrv_replace_node_common(bs, bdrv_filter_or_cow_bs(bs), true, true,
5258 errp);
5259}
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
5276 Error **errp)
5277{
5278 int ret;
5279 BdrvChild *child;
5280 Transaction *tran = tran_new();
5281 AioContext *old_context, *new_context = NULL;
5282
5283 GLOBAL_STATE_CODE();
5284
5285 assert(!bs_new->backing);
5286
5287 old_context = bdrv_get_aio_context(bs_top);
5288
5289 child = bdrv_attach_child_noperm(bs_new, bs_top, "backing",
5290 &child_of_bds, bdrv_backing_role(bs_new),
5291 tran, errp);
5292 if (!child) {
5293 ret = -EINVAL;
5294 goto out;
5295 }
5296
5297
5298
5299
5300
5301
5302
5303 new_context = bdrv_get_aio_context(bs_top);
5304
5305 if (old_context != new_context) {
5306 aio_context_release(old_context);
5307 aio_context_acquire(new_context);
5308 }
5309
5310 ret = bdrv_replace_node_noperm(bs_top, bs_new, true, tran, errp);
5311 if (ret < 0) {
5312 goto out;
5313 }
5314
5315 ret = bdrv_refresh_perms(bs_new, tran, errp);
5316out:
5317 tran_finalize(tran, ret);
5318
5319 bdrv_refresh_limits(bs_top, NULL, NULL);
5320
5321 if (new_context && old_context != new_context) {
5322 aio_context_release(new_context);
5323 aio_context_acquire(old_context);
5324 }
5325
5326 return ret;
5327}
5328
5329
5330int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs,
5331 Error **errp)
5332{
5333 int ret;
5334 Transaction *tran = tran_new();
5335 g_autoptr(GSList) refresh_list = NULL;
5336 BlockDriverState *old_bs = child->bs;
5337
5338 GLOBAL_STATE_CODE();
5339
5340 bdrv_ref(old_bs);
5341 bdrv_drained_begin(old_bs);
5342 bdrv_drained_begin(new_bs);
5343
5344 bdrv_replace_child_tran(child, new_bs, tran);
5345
5346 refresh_list = g_slist_prepend(refresh_list, old_bs);
5347 refresh_list = g_slist_prepend(refresh_list, new_bs);
5348
5349 ret = bdrv_list_refresh_perms(refresh_list, NULL, tran, errp);
5350
5351 tran_finalize(tran, ret);
5352
5353 bdrv_drained_end(old_bs);
5354 bdrv_drained_end(new_bs);
5355 bdrv_unref(old_bs);
5356
5357 return ret;
5358}
5359
5360static void bdrv_delete(BlockDriverState *bs)
5361{
5362 assert(bdrv_op_blocker_is_empty(bs));
5363 assert(!bs->refcnt);
5364 GLOBAL_STATE_CODE();
5365
5366
5367 if (bs->node_name[0] != '\0') {
5368 QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
5369 }
5370 QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
5371
5372 bdrv_close(bs);
5373
5374 g_free(bs);
5375}
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *options,
5387 int flags, Error **errp)
5388{
5389 ERRP_GUARD();
5390 int ret;
5391 BlockDriverState *new_node_bs = NULL;
5392 const char *drvname, *node_name;
5393 BlockDriver *drv;
5394
5395 drvname = qdict_get_try_str(options, "driver");
5396 if (!drvname) {
5397 error_setg(errp, "driver is not specified");
5398 goto fail;
5399 }
5400
5401 drv = bdrv_find_format(drvname);
5402 if (!drv) {
5403 error_setg(errp, "Unknown driver: '%s'", drvname);
5404 goto fail;
5405 }
5406
5407 node_name = qdict_get_try_str(options, "node-name");
5408
5409 GLOBAL_STATE_CODE();
5410
5411 new_node_bs = bdrv_new_open_driver_opts(drv, node_name, options, flags,
5412 errp);
5413 options = NULL;
5414 if (!new_node_bs) {
5415 error_prepend(errp, "Could not create node: ");
5416 goto fail;
5417 }
5418
5419 bdrv_drained_begin(bs);
5420 ret = bdrv_replace_node(bs, new_node_bs, errp);
5421 bdrv_drained_end(bs);
5422
5423 if (ret < 0) {
5424 error_prepend(errp, "Could not replace node: ");
5425 goto fail;
5426 }
5427
5428 return new_node_bs;
5429
5430fail:
5431 qobject_unref(options);
5432 bdrv_unref(new_node_bs);
5433 return NULL;
5434}
5435
5436
5437
5438
5439
5440
5441
5442
5443int coroutine_fn bdrv_co_check(BlockDriverState *bs,
5444 BdrvCheckResult *res, BdrvCheckMode fix)
5445{
5446 IO_CODE();
5447 assert_bdrv_graph_readable();
5448 if (bs->drv == NULL) {
5449 return -ENOMEDIUM;
5450 }
5451 if (bs->drv->bdrv_co_check == NULL) {
5452 return -ENOTSUP;
5453 }
5454
5455 memset(res, 0, sizeof(*res));
5456 return bs->drv->bdrv_co_check(bs, res, fix);
5457}
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467int bdrv_change_backing_file(BlockDriverState *bs, const char *backing_file,
5468 const char *backing_fmt, bool require)
5469{
5470 BlockDriver *drv = bs->drv;
5471 int ret;
5472
5473 GLOBAL_STATE_CODE();
5474
5475 if (!drv) {
5476 return -ENOMEDIUM;
5477 }
5478
5479
5480 if (backing_fmt && !backing_file) {
5481 return -EINVAL;
5482 }
5483
5484 if (require && backing_file && !backing_fmt) {
5485 return -EINVAL;
5486 }
5487
5488 if (drv->bdrv_change_backing_file != NULL) {
5489 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
5490 } else {
5491 ret = -ENOTSUP;
5492 }
5493
5494 if (ret == 0) {
5495 pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");
5496 pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");
5497 pstrcpy(bs->auto_backing_file, sizeof(bs->auto_backing_file),
5498 backing_file ?: "");
5499 }
5500 return ret;
5501}
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
5514 BlockDriverState *bs)
5515{
5516
5517 GLOBAL_STATE_CODE();
5518
5519 bs = bdrv_skip_filters(bs);
5520 active = bdrv_skip_filters(active);
5521
5522 while (active) {
5523 BlockDriverState *next = bdrv_backing_chain_next(active);
5524 if (bs == next) {
5525 return active;
5526 }
5527 active = next;
5528 }
5529
5530 return NULL;
5531}
5532
5533
5534BlockDriverState *bdrv_find_base(BlockDriverState *bs)
5535{
5536 GLOBAL_STATE_CODE();
5537
5538 return bdrv_find_overlay(bs, NULL);
5539}
5540
5541
5542
5543
5544
5545
5546bool bdrv_is_backing_chain_frozen(BlockDriverState *bs, BlockDriverState *base,
5547 Error **errp)
5548{
5549 BlockDriverState *i;
5550 BdrvChild *child;
5551
5552 GLOBAL_STATE_CODE();
5553
5554 for (i = bs; i != base; i = child_bs(child)) {
5555 child = bdrv_filter_or_cow_child(i);
5556
5557 if (child && child->frozen) {
5558 error_setg(errp, "Cannot change '%s' link from '%s' to '%s'",
5559 child->name, i->node_name, child->bs->node_name);
5560 return true;
5561 }
5562 }
5563
5564 return false;
5565}
5566
5567
5568
5569
5570
5571
5572
5573
5574int bdrv_freeze_backing_chain(BlockDriverState *bs, BlockDriverState *base,
5575 Error **errp)
5576{
5577 BlockDriverState *i;
5578 BdrvChild *child;
5579
5580 GLOBAL_STATE_CODE();
5581
5582 if (bdrv_is_backing_chain_frozen(bs, base, errp)) {
5583 return -EPERM;
5584 }
5585
5586 for (i = bs; i != base; i = child_bs(child)) {
5587 child = bdrv_filter_or_cow_child(i);
5588 if (child && child->bs->never_freeze) {
5589 error_setg(errp, "Cannot freeze '%s' link to '%s'",
5590 child->name, child->bs->node_name);
5591 return -EPERM;
5592 }
5593 }
5594
5595 for (i = bs; i != base; i = child_bs(child)) {
5596 child = bdrv_filter_or_cow_child(i);
5597 if (child) {
5598 child->frozen = true;
5599 }
5600 }
5601
5602 return 0;
5603}
5604
5605
5606
5607
5608
5609
5610
5611void bdrv_unfreeze_backing_chain(BlockDriverState *bs, BlockDriverState *base)
5612{
5613 BlockDriverState *i;
5614 BdrvChild *child;
5615
5616 GLOBAL_STATE_CODE();
5617
5618 for (i = bs; i != base; i = child_bs(child)) {
5619 child = bdrv_filter_or_cow_child(i);
5620 if (child) {
5621 assert(child->frozen);
5622 child->frozen = false;
5623 }
5624 }
5625}
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
5657 const char *backing_file_str)
5658{
5659 BlockDriverState *explicit_top = top;
5660 bool update_inherits_from;
5661 BdrvChild *c;
5662 Error *local_err = NULL;
5663 int ret = -EIO;
5664 g_autoptr(GSList) updated_children = NULL;
5665 GSList *p;
5666
5667 GLOBAL_STATE_CODE();
5668
5669 bdrv_ref(top);
5670 bdrv_drained_begin(base);
5671
5672 if (!top->drv || !base->drv) {
5673 goto exit;
5674 }
5675
5676
5677 if (!bdrv_chain_contains(top, base)) {
5678 goto exit;
5679 }
5680
5681
5682
5683
5684
5685
5686 explicit_top = bdrv_skip_implicit_filters(explicit_top);
5687 update_inherits_from = bdrv_inherits_from_recursive(base, explicit_top);
5688
5689
5690 if (!backing_file_str) {
5691 bdrv_refresh_filename(base);
5692 backing_file_str = base->filename;
5693 }
5694
5695 QLIST_FOREACH(c, &top->parents, next_parent) {
5696 updated_children = g_slist_prepend(updated_children, c);
5697 }
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709 bdrv_replace_node_common(top, base, false, false, &local_err);
5710 if (local_err) {
5711 error_report_err(local_err);
5712 goto exit;
5713 }
5714
5715 for (p = updated_children; p; p = p->next) {
5716 c = p->data;
5717
5718 if (c->klass->update_filename) {
5719 ret = c->klass->update_filename(c, base, backing_file_str,
5720 &local_err);
5721 if (ret < 0) {
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731 error_report_err(local_err);
5732 goto exit;
5733 }
5734 }
5735 }
5736
5737 if (update_inherits_from) {
5738 base->inherits_from = explicit_top->inherits_from;
5739 }
5740
5741 ret = 0;
5742exit:
5743 bdrv_drained_end(base);
5744 bdrv_unref(top);
5745 return ret;
5746}
5747
5748
5749
5750
5751
5752
5753static int64_t bdrv_sum_allocated_file_size(BlockDriverState *bs)
5754{
5755 BdrvChild *child;
5756 int64_t child_size, sum = 0;
5757
5758 QLIST_FOREACH(child, &bs->children, next) {
5759 if (child->role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA |
5760 BDRV_CHILD_FILTERED))
5761 {
5762 child_size = bdrv_co_get_allocated_file_size(child->bs);
5763 if (child_size < 0) {
5764 return child_size;
5765 }
5766 sum += child_size;
5767 }
5768 }
5769
5770 return sum;
5771}
5772
5773
5774
5775
5776
5777int64_t coroutine_fn bdrv_co_get_allocated_file_size(BlockDriverState *bs)
5778{
5779 BlockDriver *drv = bs->drv;
5780 IO_CODE();
5781
5782 if (!drv) {
5783 return -ENOMEDIUM;
5784 }
5785 if (drv->bdrv_co_get_allocated_file_size) {
5786 return drv->bdrv_co_get_allocated_file_size(bs);
5787 }
5788
5789 if (drv->bdrv_file_open) {
5790
5791
5792
5793
5794
5795 return -ENOTSUP;
5796 } else if (drv->is_filter) {
5797
5798 return bdrv_co_get_allocated_file_size(bdrv_filter_bs(bs));
5799 } else {
5800
5801 return bdrv_sum_allocated_file_size(bs);
5802 }
5803}
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
5829 BlockDriverState *in_bs, Error **errp)
5830{
5831 IO_CODE();
5832 if (!drv->bdrv_measure) {
5833 error_setg(errp, "Block driver '%s' does not support size measurement",
5834 drv->format_name);
5835 return NULL;
5836 }
5837
5838 return drv->bdrv_measure(opts, in_bs, errp);
5839}
5840
5841
5842
5843
5844int64_t coroutine_fn bdrv_co_nb_sectors(BlockDriverState *bs)
5845{
5846 BlockDriver *drv = bs->drv;
5847 IO_CODE();
5848 assert_bdrv_graph_readable();
5849
5850 if (!drv)
5851 return -ENOMEDIUM;
5852
5853 if (bs->bl.has_variable_length) {
5854 int ret = bdrv_co_refresh_total_sectors(bs, bs->total_sectors);
5855 if (ret < 0) {
5856 return ret;
5857 }
5858 }
5859 return bs->total_sectors;
5860}
5861
5862
5863
5864
5865
5866int64_t coroutine_mixed_fn bdrv_nb_sectors(BlockDriverState *bs)
5867{
5868 BlockDriver *drv = bs->drv;
5869 IO_CODE();
5870
5871 if (!drv)
5872 return -ENOMEDIUM;
5873
5874 if (bs->bl.has_variable_length) {
5875 int ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
5876 if (ret < 0) {
5877 return ret;
5878 }
5879 }
5880
5881 return bs->total_sectors;
5882}
5883
5884
5885
5886
5887
5888int64_t coroutine_fn bdrv_co_getlength(BlockDriverState *bs)
5889{
5890 int64_t ret;
5891 IO_CODE();
5892 assert_bdrv_graph_readable();
5893
5894 ret = bdrv_co_nb_sectors(bs);
5895 if (ret < 0) {
5896 return ret;
5897 }
5898 if (ret > INT64_MAX / BDRV_SECTOR_SIZE) {
5899 return -EFBIG;
5900 }
5901 return ret * BDRV_SECTOR_SIZE;
5902}
5903
5904bool bdrv_is_sg(BlockDriverState *bs)
5905{
5906 IO_CODE();
5907 return bs->sg;
5908}
5909
5910
5911
5912
5913bool bdrv_supports_compressed_writes(BlockDriverState *bs)
5914{
5915 BlockDriverState *filtered;
5916 IO_CODE();
5917
5918 if (!bs->drv || !block_driver_can_compress(bs->drv)) {
5919 return false;
5920 }
5921
5922 filtered = bdrv_filter_bs(bs);
5923 if (filtered) {
5924
5925
5926
5927
5928 return bdrv_supports_compressed_writes(filtered);
5929 }
5930
5931 return true;
5932}
5933
5934const char *bdrv_get_format_name(BlockDriverState *bs)
5935{
5936 IO_CODE();
5937 return bs->drv ? bs->drv->format_name : NULL;
5938}
5939
5940static int qsort_strcmp(const void *a, const void *b)
5941{
5942 return strcmp(*(char *const *)a, *(char *const *)b);
5943}
5944
5945void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
5946 void *opaque, bool read_only)
5947{
5948 BlockDriver *drv;
5949 int count = 0;
5950 int i;
5951 const char **formats = NULL;
5952
5953 GLOBAL_STATE_CODE();
5954
5955 QLIST_FOREACH(drv, &bdrv_drivers, list) {
5956 if (drv->format_name) {
5957 bool found = false;
5958 int i = count;
5959
5960 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, read_only)) {
5961 continue;
5962 }
5963
5964 while (formats && i && !found) {
5965 found = !strcmp(formats[--i], drv->format_name);
5966 }
5967
5968 if (!found) {
5969 formats = g_renew(const char *, formats, count + 1);
5970 formats[count++] = drv->format_name;
5971 }
5972 }
5973 }
5974
5975 for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); i++) {
5976 const char *format_name = block_driver_modules[i].format_name;
5977
5978 if (format_name) {
5979 bool found = false;
5980 int j = count;
5981
5982 if (use_bdrv_whitelist &&
5983 !bdrv_format_is_whitelisted(format_name, read_only)) {
5984 continue;
5985 }
5986
5987 while (formats && j && !found) {
5988 found = !strcmp(formats[--j], format_name);
5989 }
5990
5991 if (!found) {
5992 formats = g_renew(const char *, formats, count + 1);
5993 formats[count++] = format_name;
5994 }
5995 }
5996 }
5997
5998 qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
5999
6000 for (i = 0; i < count; i++) {
6001 it(opaque, formats[i]);
6002 }
6003
6004 g_free(formats);
6005}
6006
6007
6008BlockDriverState *bdrv_find_node(const char *node_name)
6009{
6010 BlockDriverState *bs;
6011
6012 assert(node_name);
6013 GLOBAL_STATE_CODE();
6014
6015 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
6016 if (!strcmp(node_name, bs->node_name)) {
6017 return bs;
6018 }
6019 }
6020 return NULL;
6021}
6022
6023
6024BlockDeviceInfoList *bdrv_named_nodes_list(bool flat,
6025 Error **errp)
6026{
6027 BlockDeviceInfoList *list;
6028 BlockDriverState *bs;
6029
6030 GLOBAL_STATE_CODE();
6031
6032 list = NULL;
6033 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
6034 BlockDeviceInfo *info = bdrv_block_device_info(NULL, bs, flat, errp);
6035 if (!info) {
6036 qapi_free_BlockDeviceInfoList(list);
6037 return NULL;
6038 }
6039 QAPI_LIST_PREPEND(list, info);
6040 }
6041
6042 return list;
6043}
6044
6045typedef struct XDbgBlockGraphConstructor {
6046 XDbgBlockGraph *graph;
6047 GHashTable *graph_nodes;
6048} XDbgBlockGraphConstructor;
6049
6050static XDbgBlockGraphConstructor *xdbg_graph_new(void)
6051{
6052 XDbgBlockGraphConstructor *gr = g_new(XDbgBlockGraphConstructor, 1);
6053
6054 gr->graph = g_new0(XDbgBlockGraph, 1);
6055 gr->graph_nodes = g_hash_table_new(NULL, NULL);
6056
6057 return gr;
6058}
6059
6060static XDbgBlockGraph *xdbg_graph_finalize(XDbgBlockGraphConstructor *gr)
6061{
6062 XDbgBlockGraph *graph = gr->graph;
6063
6064 g_hash_table_destroy(gr->graph_nodes);
6065 g_free(gr);
6066
6067 return graph;
6068}
6069
6070static uintptr_t xdbg_graph_node_num(XDbgBlockGraphConstructor *gr, void *node)
6071{
6072 uintptr_t ret = (uintptr_t)g_hash_table_lookup(gr->graph_nodes, node);
6073
6074 if (ret != 0) {
6075 return ret;
6076 }
6077
6078
6079
6080
6081
6082 ret = g_hash_table_size(gr->graph_nodes) + 1;
6083 g_hash_table_insert(gr->graph_nodes, node, (void *)ret);
6084
6085 return ret;
6086}
6087
6088static void xdbg_graph_add_node(XDbgBlockGraphConstructor *gr, void *node,
6089 XDbgBlockGraphNodeType type, const char *name)
6090{
6091 XDbgBlockGraphNode *n;
6092
6093 n = g_new0(XDbgBlockGraphNode, 1);
6094
6095 n->id = xdbg_graph_node_num(gr, node);
6096 n->type = type;
6097 n->name = g_strdup(name);
6098
6099 QAPI_LIST_PREPEND(gr->graph->nodes, n);
6100}
6101
6102static void xdbg_graph_add_edge(XDbgBlockGraphConstructor *gr, void *parent,
6103 const BdrvChild *child)
6104{
6105 BlockPermission qapi_perm;
6106 XDbgBlockGraphEdge *edge;
6107 GLOBAL_STATE_CODE();
6108
6109 edge = g_new0(XDbgBlockGraphEdge, 1);
6110
6111 edge->parent = xdbg_graph_node_num(gr, parent);
6112 edge->child = xdbg_graph_node_num(gr, child->bs);
6113 edge->name = g_strdup(child->name);
6114
6115 for (qapi_perm = 0; qapi_perm < BLOCK_PERMISSION__MAX; qapi_perm++) {
6116 uint64_t flag = bdrv_qapi_perm_to_blk_perm(qapi_perm);
6117
6118 if (flag & child->perm) {
6119 QAPI_LIST_PREPEND(edge->perm, qapi_perm);
6120 }
6121 if (flag & child->shared_perm) {
6122 QAPI_LIST_PREPEND(edge->shared_perm, qapi_perm);
6123 }
6124 }
6125
6126 QAPI_LIST_PREPEND(gr->graph->edges, edge);
6127}
6128
6129
6130XDbgBlockGraph *bdrv_get_xdbg_block_graph(Error **errp)
6131{
6132 BlockBackend *blk;
6133 BlockJob *job;
6134 BlockDriverState *bs;
6135 BdrvChild *child;
6136 XDbgBlockGraphConstructor *gr = xdbg_graph_new();
6137
6138 GLOBAL_STATE_CODE();
6139
6140 for (blk = blk_all_next(NULL); blk; blk = blk_all_next(blk)) {
6141 char *allocated_name = NULL;
6142 const char *name = blk_name(blk);
6143
6144 if (!*name) {
6145 name = allocated_name = blk_get_attached_dev_id(blk);
6146 }
6147 xdbg_graph_add_node(gr, blk, X_DBG_BLOCK_GRAPH_NODE_TYPE_BLOCK_BACKEND,
6148 name);
6149 g_free(allocated_name);
6150 if (blk_root(blk)) {
6151 xdbg_graph_add_edge(gr, blk, blk_root(blk));
6152 }
6153 }
6154
6155 WITH_JOB_LOCK_GUARD() {
6156 for (job = block_job_next_locked(NULL); job;
6157 job = block_job_next_locked(job)) {
6158 GSList *el;
6159
6160 xdbg_graph_add_node(gr, job, X_DBG_BLOCK_GRAPH_NODE_TYPE_BLOCK_JOB,
6161 job->job.id);
6162 for (el = job->nodes; el; el = el->next) {
6163 xdbg_graph_add_edge(gr, job, (BdrvChild *)el->data);
6164 }
6165 }
6166 }
6167
6168 QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
6169 xdbg_graph_add_node(gr, bs, X_DBG_BLOCK_GRAPH_NODE_TYPE_BLOCK_DRIVER,
6170 bs->node_name);
6171 QLIST_FOREACH(child, &bs->children, next) {
6172 xdbg_graph_add_edge(gr, bs, child);
6173 }
6174 }
6175
6176 return xdbg_graph_finalize(gr);
6177}
6178
6179BlockDriverState *bdrv_lookup_bs(const char *device,
6180 const char *node_name,
6181 Error **errp)
6182{
6183 BlockBackend *blk;
6184 BlockDriverState *bs;
6185
6186 GLOBAL_STATE_CODE();
6187
6188 if (device) {
6189 blk = blk_by_name(device);
6190
6191 if (blk) {
6192 bs = blk_bs(blk);
6193 if (!bs) {
6194 error_setg(errp, "Device '%s' has no medium", device);
6195 }
6196
6197 return bs;
6198 }
6199 }
6200
6201 if (node_name) {
6202 bs = bdrv_find_node(node_name);
6203
6204 if (bs) {
6205 return bs;
6206 }
6207 }
6208
6209 error_setg(errp, "Cannot find device=\'%s\' nor node-name=\'%s\'",
6210 device ? device : "",
6211 node_name ? node_name : "");
6212 return NULL;
6213}
6214
6215
6216
6217bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
6218{
6219
6220 GLOBAL_STATE_CODE();
6221
6222 while (top && top != base) {
6223 top = bdrv_filter_or_cow_bs(top);
6224 }
6225
6226 return top != NULL;
6227}
6228
6229BlockDriverState *bdrv_next_node(BlockDriverState *bs)
6230{
6231 GLOBAL_STATE_CODE();
6232 if (!bs) {
6233 return QTAILQ_FIRST(&graph_bdrv_states);
6234 }
6235 return QTAILQ_NEXT(bs, node_list);
6236}
6237
6238BlockDriverState *bdrv_next_all_states(BlockDriverState *bs)
6239{
6240 GLOBAL_STATE_CODE();
6241 if (!bs) {
6242 return QTAILQ_FIRST(&all_bdrv_states);
6243 }
6244 return QTAILQ_NEXT(bs, bs_list);
6245}
6246
6247const char *bdrv_get_node_name(const BlockDriverState *bs)
6248{
6249 IO_CODE();
6250 return bs->node_name;
6251}
6252
6253const char *bdrv_get_parent_name(const BlockDriverState *bs)
6254{
6255 BdrvChild *c;
6256 const char *name;
6257 IO_CODE();
6258
6259
6260 QLIST_FOREACH(c, &bs->parents, next_parent) {
6261 if (c->klass->get_name) {
6262 name = c->klass->get_name(c);
6263 if (name && *name) {
6264 return name;
6265 }
6266 }
6267 }
6268
6269 return NULL;
6270}
6271
6272
6273const char *bdrv_get_device_name(const BlockDriverState *bs)
6274{
6275 IO_CODE();
6276 return bdrv_get_parent_name(bs) ?: "";
6277}
6278
6279
6280
6281
6282
6283const char *bdrv_get_device_or_node_name(const BlockDriverState *bs)
6284{
6285 IO_CODE();
6286 return bdrv_get_parent_name(bs) ?: bs->node_name;
6287}
6288
6289int bdrv_get_flags(BlockDriverState *bs)
6290{
6291 IO_CODE();
6292 return bs->open_flags;
6293}
6294
6295int bdrv_has_zero_init_1(BlockDriverState *bs)
6296{
6297 GLOBAL_STATE_CODE();
6298 return 1;
6299}
6300
6301int bdrv_has_zero_init(BlockDriverState *bs)
6302{
6303 BlockDriverState *filtered;
6304 GLOBAL_STATE_CODE();
6305
6306 if (!bs->drv) {
6307 return 0;
6308 }
6309
6310
6311
6312 if (bdrv_cow_child(bs)) {
6313 return 0;
6314 }
6315 if (bs->drv->bdrv_has_zero_init) {
6316 return bs->drv->bdrv_has_zero_init(bs);
6317 }
6318
6319 filtered = bdrv_filter_bs(bs);
6320 if (filtered) {
6321 return bdrv_has_zero_init(filtered);
6322 }
6323
6324
6325 return 0;
6326}
6327
6328bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs)
6329{
6330 IO_CODE();
6331 if (!(bs->open_flags & BDRV_O_UNMAP)) {
6332 return false;
6333 }
6334
6335 return bs->supported_zero_flags & BDRV_REQ_MAY_UNMAP;
6336}
6337
6338void bdrv_get_backing_filename(BlockDriverState *bs,
6339 char *filename, int filename_size)
6340{
6341 IO_CODE();
6342 pstrcpy(filename, filename_size, bs->backing_file);
6343}
6344
6345int coroutine_fn bdrv_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
6346{
6347 int ret;
6348 BlockDriver *drv = bs->drv;
6349 IO_CODE();
6350
6351 if (!drv) {
6352 return -ENOMEDIUM;
6353 }
6354 if (!drv->bdrv_co_get_info) {
6355 BlockDriverState *filtered = bdrv_filter_bs(bs);
6356 if (filtered) {
6357 return bdrv_co_get_info(filtered, bdi);
6358 }
6359 return -ENOTSUP;
6360 }
6361 memset(bdi, 0, sizeof(*bdi));
6362 ret = drv->bdrv_co_get_info(bs, bdi);
6363 if (ret < 0) {
6364 return ret;
6365 }
6366
6367 if (bdi->cluster_size > BDRV_MAX_ALIGNMENT) {
6368 return -EINVAL;
6369 }
6370
6371 return 0;
6372}
6373
6374ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
6375 Error **errp)
6376{
6377 BlockDriver *drv = bs->drv;
6378 IO_CODE();
6379 if (drv && drv->bdrv_get_specific_info) {
6380 return drv->bdrv_get_specific_info(bs, errp);
6381 }
6382 return NULL;
6383}
6384
6385BlockStatsSpecific *bdrv_get_specific_stats(BlockDriverState *bs)
6386{
6387 BlockDriver *drv = bs->drv;
6388 IO_CODE();
6389 if (!drv || !drv->bdrv_get_specific_stats) {
6390 return NULL;
6391 }
6392 return drv->bdrv_get_specific_stats(bs);
6393}
6394
6395void coroutine_fn bdrv_co_debug_event(BlockDriverState *bs, BlkdebugEvent event)
6396{
6397 IO_CODE();
6398 if (!bs || !bs->drv || !bs->drv->bdrv_co_debug_event) {
6399 return;
6400 }
6401
6402 bs->drv->bdrv_co_debug_event(bs, event);
6403}
6404
6405static BlockDriverState *bdrv_find_debug_node(BlockDriverState *bs)
6406{
6407 GLOBAL_STATE_CODE();
6408 while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
6409 bs = bdrv_primary_bs(bs);
6410 }
6411
6412 if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
6413 assert(bs->drv->bdrv_debug_remove_breakpoint);
6414 return bs;
6415 }
6416
6417 return NULL;
6418}
6419
6420int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
6421 const char *tag)
6422{
6423 GLOBAL_STATE_CODE();
6424 bs = bdrv_find_debug_node(bs);
6425 if (bs) {
6426 return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
6427 }
6428
6429 return -ENOTSUP;
6430}
6431
6432int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
6433{
6434 GLOBAL_STATE_CODE();
6435 bs = bdrv_find_debug_node(bs);
6436 if (bs) {
6437 return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
6438 }
6439
6440 return -ENOTSUP;
6441}
6442
6443int bdrv_debug_resume(BlockDriverState *bs, const char *tag)
6444{
6445 GLOBAL_STATE_CODE();
6446 while (bs && (!bs->drv || !bs->drv->bdrv_debug_resume)) {
6447 bs = bdrv_primary_bs(bs);
6448 }
6449
6450 if (bs && bs->drv && bs->drv->bdrv_debug_resume) {
6451 return bs->drv->bdrv_debug_resume(bs, tag);
6452 }
6453
6454 return -ENOTSUP;
6455}
6456
6457bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag)
6458{
6459 GLOBAL_STATE_CODE();
6460 while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) {
6461 bs = bdrv_primary_bs(bs);
6462 }
6463
6464 if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) {
6465 return bs->drv->bdrv_debug_is_suspended(bs, tag);
6466 }
6467
6468 return false;
6469}
6470
6471
6472
6473
6474
6475BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
6476 const char *backing_file)
6477{
6478 char *filename_full = NULL;
6479 char *backing_file_full = NULL;
6480 char *filename_tmp = NULL;
6481 int is_protocol = 0;
6482 bool filenames_refreshed = false;
6483 BlockDriverState *curr_bs = NULL;
6484 BlockDriverState *retval = NULL;
6485 BlockDriverState *bs_below;
6486
6487 GLOBAL_STATE_CODE();
6488
6489 if (!bs || !bs->drv || !backing_file) {
6490 return NULL;
6491 }
6492
6493 filename_full = g_malloc(PATH_MAX);
6494 backing_file_full = g_malloc(PATH_MAX);
6495
6496 is_protocol = path_has_protocol(backing_file);
6497
6498
6499
6500
6501
6502
6503
6504 for (curr_bs = bdrv_skip_filters(bs);
6505 bdrv_cow_child(curr_bs) != NULL;
6506 curr_bs = bs_below)
6507 {
6508 bs_below = bdrv_backing_chain_next(curr_bs);
6509
6510 if (bdrv_backing_overridden(curr_bs)) {
6511
6512
6513
6514
6515
6516 if (!filenames_refreshed) {
6517
6518
6519
6520
6521
6522 bdrv_refresh_filename(bs_below);
6523 filenames_refreshed = true;
6524 }
6525
6526 if (strcmp(backing_file, bs_below->filename) == 0) {
6527 retval = bs_below;
6528 break;
6529 }
6530 } else if (is_protocol || path_has_protocol(curr_bs->backing_file)) {
6531
6532
6533
6534
6535 char *backing_file_full_ret;
6536
6537 if (strcmp(backing_file, curr_bs->backing_file) == 0) {
6538 retval = bs_below;
6539 break;
6540 }
6541
6542 backing_file_full_ret = bdrv_get_full_backing_filename(curr_bs,
6543 NULL);
6544 if (backing_file_full_ret) {
6545 bool equal = strcmp(backing_file, backing_file_full_ret) == 0;
6546 g_free(backing_file_full_ret);
6547 if (equal) {
6548 retval = bs_below;
6549 break;
6550 }
6551 }
6552 } else {
6553
6554
6555 filename_tmp = bdrv_make_absolute_filename(curr_bs, backing_file,
6556 NULL);
6557
6558 if (!filename_tmp || !realpath(filename_tmp, filename_full)) {
6559 g_free(filename_tmp);
6560 continue;
6561 }
6562 g_free(filename_tmp);
6563
6564
6565
6566 filename_tmp = bdrv_get_full_backing_filename(curr_bs, NULL);
6567 if (!filename_tmp || !realpath(filename_tmp, backing_file_full)) {
6568 g_free(filename_tmp);
6569 continue;
6570 }
6571 g_free(filename_tmp);
6572
6573 if (strcmp(backing_file_full, filename_full) == 0) {
6574 retval = bs_below;
6575 break;
6576 }
6577 }
6578 }
6579
6580 g_free(filename_full);
6581 g_free(backing_file_full);
6582 return retval;
6583}
6584
6585void bdrv_init(void)
6586{
6587#ifdef CONFIG_BDRV_WHITELIST_TOOLS
6588 use_bdrv_whitelist = 1;
6589#endif
6590 module_call_init(MODULE_INIT_BLOCK);
6591}
6592
6593void bdrv_init_with_whitelist(void)
6594{
6595 use_bdrv_whitelist = 1;
6596 bdrv_init();
6597}
6598
6599int bdrv_activate(BlockDriverState *bs, Error **errp)
6600{
6601 BdrvChild *child, *parent;
6602 Error *local_err = NULL;
6603 int ret;
6604 BdrvDirtyBitmap *bm;
6605
6606 GLOBAL_STATE_CODE();
6607
6608 if (!bs->drv) {
6609 return -ENOMEDIUM;
6610 }
6611
6612 QLIST_FOREACH(child, &bs->children, next) {
6613 bdrv_activate(child->bs, &local_err);
6614 if (local_err) {
6615 error_propagate(errp, local_err);
6616 return -EINVAL;
6617 }
6618 }
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633 if (bs->open_flags & BDRV_O_INACTIVE) {
6634 bs->open_flags &= ~BDRV_O_INACTIVE;
6635 ret = bdrv_refresh_perms(bs, NULL, errp);
6636 if (ret < 0) {
6637 bs->open_flags |= BDRV_O_INACTIVE;
6638 return ret;
6639 }
6640
6641 ret = bdrv_invalidate_cache(bs, errp);
6642 if (ret < 0) {
6643 bs->open_flags |= BDRV_O_INACTIVE;
6644 return ret;
6645 }
6646
6647 FOR_EACH_DIRTY_BITMAP(bs, bm) {
6648 bdrv_dirty_bitmap_skip_store(bm, false);
6649 }
6650
6651 ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
6652 if (ret < 0) {
6653 bs->open_flags |= BDRV_O_INACTIVE;
6654 error_setg_errno(errp, -ret, "Could not refresh total sector count");
6655 return ret;
6656 }
6657 }
6658
6659 QLIST_FOREACH(parent, &bs->parents, next_parent) {
6660 if (parent->klass->activate) {
6661 parent->klass->activate(parent, &local_err);
6662 if (local_err) {
6663 bs->open_flags |= BDRV_O_INACTIVE;
6664 error_propagate(errp, local_err);
6665 return -EINVAL;
6666 }
6667 }
6668 }
6669
6670 return 0;
6671}
6672
6673int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp)
6674{
6675 Error *local_err = NULL;
6676 IO_CODE();
6677
6678 assert(!(bs->open_flags & BDRV_O_INACTIVE));
6679 assert_bdrv_graph_readable();
6680
6681 if (bs->drv->bdrv_co_invalidate_cache) {
6682 bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
6683 if (local_err) {
6684 error_propagate(errp, local_err);
6685 return -EINVAL;
6686 }
6687 }
6688
6689 return 0;
6690}
6691
6692void bdrv_activate_all(Error **errp)
6693{
6694 BlockDriverState *bs;
6695 BdrvNextIterator it;
6696
6697 GLOBAL_STATE_CODE();
6698
6699 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
6700 AioContext *aio_context = bdrv_get_aio_context(bs);
6701 int ret;
6702
6703 aio_context_acquire(aio_context);
6704 ret = bdrv_activate(bs, errp);
6705 aio_context_release(aio_context);
6706 if (ret < 0) {
6707 bdrv_next_cleanup(&it);
6708 return;
6709 }
6710 }
6711}
6712
6713static bool bdrv_has_bds_parent(BlockDriverState *bs, bool only_active)
6714{
6715 BdrvChild *parent;
6716 GLOBAL_STATE_CODE();
6717
6718 QLIST_FOREACH(parent, &bs->parents, next_parent) {
6719 if (parent->klass->parent_is_bds) {
6720 BlockDriverState *parent_bs = parent->opaque;
6721 if (!only_active || !(parent_bs->open_flags & BDRV_O_INACTIVE)) {
6722 return true;
6723 }
6724 }
6725 }
6726
6727 return false;
6728}
6729
6730static int bdrv_inactivate_recurse(BlockDriverState *bs)
6731{
6732 BdrvChild *child, *parent;
6733 int ret;
6734 uint64_t cumulative_perms, cumulative_shared_perms;
6735
6736 GLOBAL_STATE_CODE();
6737
6738 if (!bs->drv) {
6739 return -ENOMEDIUM;
6740 }
6741
6742
6743
6744 if (bdrv_has_bds_parent(bs, true)) {
6745 return 0;
6746 }
6747
6748 assert(!(bs->open_flags & BDRV_O_INACTIVE));
6749
6750
6751 if (bs->drv->bdrv_inactivate) {
6752 ret = bs->drv->bdrv_inactivate(bs);
6753 if (ret < 0) {
6754 return ret;
6755 }
6756 }
6757
6758 QLIST_FOREACH(parent, &bs->parents, next_parent) {
6759 if (parent->klass->inactivate) {
6760 ret = parent->klass->inactivate(parent);
6761 if (ret < 0) {
6762 return ret;
6763 }
6764 }
6765 }
6766
6767 bdrv_get_cumulative_perm(bs, &cumulative_perms,
6768 &cumulative_shared_perms);
6769 if (cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) {
6770
6771 return -EPERM;
6772 }
6773
6774 bs->open_flags |= BDRV_O_INACTIVE;
6775
6776
6777
6778
6779
6780
6781 bdrv_refresh_perms(bs, NULL, NULL);
6782
6783
6784 QLIST_FOREACH(child, &bs->children, next) {
6785 ret = bdrv_inactivate_recurse(child->bs);
6786 if (ret < 0) {
6787 return ret;
6788 }
6789 }
6790
6791 return 0;
6792}
6793
6794int bdrv_inactivate_all(void)
6795{
6796 BlockDriverState *bs = NULL;
6797 BdrvNextIterator it;
6798 int ret = 0;
6799 GSList *aio_ctxs = NULL, *ctx;
6800
6801 GLOBAL_STATE_CODE();
6802
6803 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
6804 AioContext *aio_context = bdrv_get_aio_context(bs);
6805
6806 if (!g_slist_find(aio_ctxs, aio_context)) {
6807 aio_ctxs = g_slist_prepend(aio_ctxs, aio_context);
6808 aio_context_acquire(aio_context);
6809 }
6810 }
6811
6812 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
6813
6814
6815
6816 if (bdrv_has_bds_parent(bs, false)) {
6817 continue;
6818 }
6819 ret = bdrv_inactivate_recurse(bs);
6820 if (ret < 0) {
6821 bdrv_next_cleanup(&it);
6822 goto out;
6823 }
6824 }
6825
6826out:
6827 for (ctx = aio_ctxs; ctx != NULL; ctx = ctx->next) {
6828 AioContext *aio_context = ctx->data;
6829 aio_context_release(aio_context);
6830 }
6831 g_slist_free(aio_ctxs);
6832
6833 return ret;
6834}
6835
6836
6837
6838
6839
6840
6841
6842bool coroutine_fn bdrv_co_is_inserted(BlockDriverState *bs)
6843{
6844 BlockDriver *drv = bs->drv;
6845 BdrvChild *child;
6846 IO_CODE();
6847 assert_bdrv_graph_readable();
6848
6849 if (!drv) {
6850 return false;
6851 }
6852 if (drv->bdrv_co_is_inserted) {
6853 return drv->bdrv_co_is_inserted(bs);
6854 }
6855 QLIST_FOREACH(child, &bs->children, next) {
6856 if (!bdrv_co_is_inserted(child->bs)) {
6857 return false;
6858 }
6859 }
6860 return true;
6861}
6862
6863
6864
6865
6866void coroutine_fn bdrv_co_eject(BlockDriverState *bs, bool eject_flag)
6867{
6868 BlockDriver *drv = bs->drv;
6869 IO_CODE();
6870 assert_bdrv_graph_readable();
6871
6872 if (drv && drv->bdrv_co_eject) {
6873 drv->bdrv_co_eject(bs, eject_flag);
6874 }
6875}
6876
6877
6878
6879
6880
6881void coroutine_fn bdrv_co_lock_medium(BlockDriverState *bs, bool locked)
6882{
6883 BlockDriver *drv = bs->drv;
6884 IO_CODE();
6885 assert_bdrv_graph_readable();
6886 trace_bdrv_lock_medium(bs, locked);
6887
6888 if (drv && drv->bdrv_co_lock_medium) {
6889 drv->bdrv_co_lock_medium(bs, locked);
6890 }
6891}
6892
6893
6894void bdrv_ref(BlockDriverState *bs)
6895{
6896 GLOBAL_STATE_CODE();
6897 bs->refcnt++;
6898}
6899
6900
6901
6902
6903void bdrv_unref(BlockDriverState *bs)
6904{
6905 GLOBAL_STATE_CODE();
6906 if (!bs) {
6907 return;
6908 }
6909 assert(bs->refcnt > 0);
6910 if (--bs->refcnt == 0) {
6911 bdrv_delete(bs);
6912 }
6913}
6914
6915struct BdrvOpBlocker {
6916 Error *reason;
6917 QLIST_ENTRY(BdrvOpBlocker) list;
6918};
6919
6920bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
6921{
6922 BdrvOpBlocker *blocker;
6923 GLOBAL_STATE_CODE();
6924 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
6925 if (!QLIST_EMPTY(&bs->op_blockers[op])) {
6926 blocker = QLIST_FIRST(&bs->op_blockers[op]);
6927 error_propagate_prepend(errp, error_copy(blocker->reason),
6928 "Node '%s' is busy: ",
6929 bdrv_get_device_or_node_name(bs));
6930 return true;
6931 }
6932 return false;
6933}
6934
6935void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason)
6936{
6937 BdrvOpBlocker *blocker;
6938 GLOBAL_STATE_CODE();
6939 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
6940
6941 blocker = g_new0(BdrvOpBlocker, 1);
6942 blocker->reason = reason;
6943 QLIST_INSERT_HEAD(&bs->op_blockers[op], blocker, list);
6944}
6945
6946void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason)
6947{
6948 BdrvOpBlocker *blocker, *next;
6949 GLOBAL_STATE_CODE();
6950 assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
6951 QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
6952 if (blocker->reason == reason) {
6953 QLIST_REMOVE(blocker, list);
6954 g_free(blocker);
6955 }
6956 }
6957}
6958
6959void bdrv_op_block_all(BlockDriverState *bs, Error *reason)
6960{
6961 int i;
6962 GLOBAL_STATE_CODE();
6963 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
6964 bdrv_op_block(bs, i, reason);
6965 }
6966}
6967
6968void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason)
6969{
6970 int i;
6971 GLOBAL_STATE_CODE();
6972 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
6973 bdrv_op_unblock(bs, i, reason);
6974 }
6975}
6976
6977bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
6978{
6979 int i;
6980 GLOBAL_STATE_CODE();
6981 for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
6982 if (!QLIST_EMPTY(&bs->op_blockers[i])) {
6983 return false;
6984 }
6985 }
6986 return true;
6987}
6988
6989
6990
6991
6992
6993void bdrv_img_create(const char *filename, const char *fmt,
6994 const char *base_filename, const char *base_fmt,
6995 char *options, uint64_t img_size, int flags, bool quiet,
6996 Error **errp)
6997{
6998 QemuOptsList *create_opts = NULL;
6999 QemuOpts *opts = NULL;
7000 const char *backing_fmt, *backing_file;
7001 int64_t size;
7002 BlockDriver *drv, *proto_drv;
7003 Error *local_err = NULL;
7004 int ret = 0;
7005
7006 GLOBAL_STATE_CODE();
7007
7008
7009 drv = bdrv_find_format(fmt);
7010 if (!drv) {
7011 error_setg(errp, "Unknown file format '%s'", fmt);
7012 return;
7013 }
7014
7015 proto_drv = bdrv_find_protocol(filename, true, errp);
7016 if (!proto_drv) {
7017 return;
7018 }
7019
7020 if (!drv->create_opts) {
7021 error_setg(errp, "Format driver '%s' does not support image creation",
7022 drv->format_name);
7023 return;
7024 }
7025
7026 if (!proto_drv->create_opts) {
7027 error_setg(errp, "Protocol driver '%s' does not support image creation",
7028 proto_drv->format_name);
7029 return;
7030 }
7031
7032
7033 create_opts = qemu_opts_append(create_opts, drv->create_opts);
7034 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
7035
7036 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
7037
7038
7039 if (options) {
7040 if (!qemu_opts_do_parse(opts, options, NULL, errp)) {
7041 goto out;
7042 }
7043 }
7044
7045 if (!qemu_opt_get(opts, BLOCK_OPT_SIZE)) {
7046 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
7047 } else if (img_size != UINT64_C(-1)) {
7048 error_setg(errp, "The image size must be specified only once");
7049 goto out;
7050 }
7051
7052 if (base_filename) {
7053 if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
7054 NULL)) {
7055 error_setg(errp, "Backing file not supported for file format '%s'",
7056 fmt);
7057 goto out;
7058 }
7059 }
7060
7061 if (base_fmt) {
7062 if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) {
7063 error_setg(errp, "Backing file format not supported for file "
7064 "format '%s'", fmt);
7065 goto out;
7066 }
7067 }
7068
7069 backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
7070 if (backing_file) {
7071 if (!strcmp(filename, backing_file)) {
7072 error_setg(errp, "Error: Trying to create an image with the "
7073 "same filename as the backing file");
7074 goto out;
7075 }
7076 if (backing_file[0] == '\0') {
7077 error_setg(errp, "Expected backing file name, got empty string");
7078 goto out;
7079 }
7080 }
7081
7082 backing_fmt = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
7083
7084
7085
7086 size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, img_size);
7087 if (backing_file && !(flags & BDRV_O_NO_BACKING)) {
7088 BlockDriverState *bs;
7089 char *full_backing;
7090 int back_flags;
7091 QDict *backing_options = NULL;
7092
7093 full_backing =
7094 bdrv_get_full_backing_filename_from_filename(filename, backing_file,
7095 &local_err);
7096 if (local_err) {
7097 goto out;
7098 }
7099 assert(full_backing);
7100
7101
7102
7103
7104
7105 back_flags = flags;
7106 back_flags &= ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
7107 back_flags |= BDRV_O_NO_IO;
7108
7109 backing_options = qdict_new();
7110 if (backing_fmt) {
7111 qdict_put_str(backing_options, "driver", backing_fmt);
7112 }
7113 qdict_put_bool(backing_options, BDRV_OPT_FORCE_SHARE, true);
7114
7115 bs = bdrv_open(full_backing, NULL, backing_options, back_flags,
7116 &local_err);
7117 g_free(full_backing);
7118 if (!bs) {
7119 error_append_hint(&local_err, "Could not open backing image.\n");
7120 goto out;
7121 } else {
7122 if (!backing_fmt) {
7123 error_setg(&local_err,
7124 "Backing file specified without backing format");
7125 error_append_hint(&local_err, "Detected format of %s.",
7126 bs->drv->format_name);
7127 goto out;
7128 }
7129 if (size == -1) {
7130
7131 size = bdrv_getlength(bs);
7132 if (size < 0) {
7133 error_setg_errno(errp, -size, "Could not get size of '%s'",
7134 backing_file);
7135 bdrv_unref(bs);
7136 goto out;
7137 }
7138 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, size, &error_abort);
7139 }
7140 bdrv_unref(bs);
7141 }
7142
7143 } else if (backing_file && !backing_fmt) {
7144 error_setg(&local_err,
7145 "Backing file specified without backing format");
7146 goto out;
7147 }
7148
7149 if (size == -1) {
7150 error_setg(errp, "Image creation needs a size parameter");
7151 goto out;
7152 }
7153
7154 if (!quiet) {
7155 printf("Formatting '%s', fmt=%s ", filename, fmt);
7156 qemu_opts_print(opts, " ");
7157 puts("");
7158 fflush(stdout);
7159 }
7160
7161 ret = bdrv_create(drv, filename, opts, &local_err);
7162
7163 if (ret == -EFBIG) {
7164
7165
7166
7167 const char *cluster_size_hint = "";
7168 if (qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE, 0)) {
7169 cluster_size_hint = " (try using a larger cluster size)";
7170 }
7171 error_setg(errp, "The image size is too large for file format '%s'"
7172 "%s", fmt, cluster_size_hint);
7173 error_free(local_err);
7174 local_err = NULL;
7175 }
7176
7177out:
7178 qemu_opts_del(opts);
7179 qemu_opts_free(create_opts);
7180 error_propagate(errp, local_err);
7181}
7182
7183AioContext *bdrv_get_aio_context(BlockDriverState *bs)
7184{
7185 IO_CODE();
7186 return bs ? bs->aio_context : qemu_get_aio_context();
7187}
7188
7189AioContext *coroutine_fn bdrv_co_enter(BlockDriverState *bs)
7190{
7191 Coroutine *self = qemu_coroutine_self();
7192 AioContext *old_ctx = qemu_coroutine_get_aio_context(self);
7193 AioContext *new_ctx;
7194 IO_CODE();
7195
7196
7197
7198
7199
7200 bdrv_inc_in_flight(bs);
7201
7202 new_ctx = bdrv_get_aio_context(bs);
7203 aio_co_reschedule_self(new_ctx);
7204 return old_ctx;
7205}
7206
7207void coroutine_fn bdrv_co_leave(BlockDriverState *bs, AioContext *old_ctx)
7208{
7209 IO_CODE();
7210 aio_co_reschedule_self(old_ctx);
7211 bdrv_dec_in_flight(bs);
7212}
7213
7214void coroutine_fn bdrv_co_lock(BlockDriverState *bs)
7215{
7216 AioContext *ctx = bdrv_get_aio_context(bs);
7217
7218
7219 assert(qemu_get_current_aio_context() == qemu_get_aio_context());
7220
7221
7222
7223
7224
7225 assert(qemu_in_coroutine());
7226 if (ctx != qemu_get_aio_context()) {
7227 aio_context_acquire(ctx);
7228 }
7229}
7230
7231void coroutine_fn bdrv_co_unlock(BlockDriverState *bs)
7232{
7233 AioContext *ctx = bdrv_get_aio_context(bs);
7234
7235 assert(qemu_in_coroutine());
7236 if (ctx != qemu_get_aio_context()) {
7237 aio_context_release(ctx);
7238 }
7239}
7240
7241static void bdrv_do_remove_aio_context_notifier(BdrvAioNotifier *ban)
7242{
7243 GLOBAL_STATE_CODE();
7244 QLIST_REMOVE(ban, list);
7245 g_free(ban);
7246}
7247
7248static void bdrv_detach_aio_context(BlockDriverState *bs)
7249{
7250 BdrvAioNotifier *baf, *baf_tmp;
7251
7252 assert(!bs->walking_aio_notifiers);
7253 GLOBAL_STATE_CODE();
7254 bs->walking_aio_notifiers = true;
7255 QLIST_FOREACH_SAFE(baf, &bs->aio_notifiers, list, baf_tmp) {
7256 if (baf->deleted) {
7257 bdrv_do_remove_aio_context_notifier(baf);
7258 } else {
7259 baf->detach_aio_context(baf->opaque);
7260 }
7261 }
7262
7263
7264
7265 bs->walking_aio_notifiers = false;
7266
7267 if (bs->drv && bs->drv->bdrv_detach_aio_context) {
7268 bs->drv->bdrv_detach_aio_context(bs);
7269 }
7270
7271 if (bs->quiesce_counter) {
7272 aio_enable_external(bs->aio_context);
7273 }
7274 bs->aio_context = NULL;
7275}
7276
7277static void bdrv_attach_aio_context(BlockDriverState *bs,
7278 AioContext *new_context)
7279{
7280 BdrvAioNotifier *ban, *ban_tmp;
7281 GLOBAL_STATE_CODE();
7282
7283 if (bs->quiesce_counter) {
7284 aio_disable_external(new_context);
7285 }
7286
7287 bs->aio_context = new_context;
7288
7289 if (bs->drv && bs->drv->bdrv_attach_aio_context) {
7290 bs->drv->bdrv_attach_aio_context(bs, new_context);
7291 }
7292
7293 assert(!bs->walking_aio_notifiers);
7294 bs->walking_aio_notifiers = true;
7295 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_tmp) {
7296 if (ban->deleted) {
7297 bdrv_do_remove_aio_context_notifier(ban);
7298 } else {
7299 ban->attached_aio_context(new_context, ban->opaque);
7300 }
7301 }
7302 bs->walking_aio_notifiers = false;
7303}
7304
7305typedef struct BdrvStateSetAioContext {
7306 AioContext *new_ctx;
7307 BlockDriverState *bs;
7308} BdrvStateSetAioContext;
7309
7310static bool bdrv_parent_change_aio_context(BdrvChild *c, AioContext *ctx,
7311 GHashTable *visited,
7312 Transaction *tran,
7313 Error **errp)
7314{
7315 GLOBAL_STATE_CODE();
7316 if (g_hash_table_contains(visited, c)) {
7317 return true;
7318 }
7319 g_hash_table_add(visited, c);
7320
7321
7322
7323
7324
7325 if (!c->klass->change_aio_ctx) {
7326 char *user = bdrv_child_user_desc(c);
7327 error_setg(errp, "Changing iothreads is not supported by %s", user);
7328 g_free(user);
7329 return false;
7330 }
7331 if (!c->klass->change_aio_ctx(c, ctx, visited, tran, errp)) {
7332 assert(!errp || *errp);
7333 return false;
7334 }
7335 return true;
7336}
7337
7338bool bdrv_child_change_aio_context(BdrvChild *c, AioContext *ctx,
7339 GHashTable *visited, Transaction *tran,
7340 Error **errp)
7341{
7342 GLOBAL_STATE_CODE();
7343 if (g_hash_table_contains(visited, c)) {
7344 return true;
7345 }
7346 g_hash_table_add(visited, c);
7347 return bdrv_change_aio_context(c->bs, ctx, visited, tran, errp);
7348}
7349
7350static void bdrv_set_aio_context_clean(void *opaque)
7351{
7352 BdrvStateSetAioContext *state = (BdrvStateSetAioContext *) opaque;
7353 BlockDriverState *bs = (BlockDriverState *) state->bs;
7354
7355
7356 bdrv_drained_end(bs);
7357
7358 g_free(state);
7359}
7360
7361static void bdrv_set_aio_context_commit(void *opaque)
7362{
7363 BdrvStateSetAioContext *state = (BdrvStateSetAioContext *) opaque;
7364 BlockDriverState *bs = (BlockDriverState *) state->bs;
7365 AioContext *new_context = state->new_ctx;
7366 AioContext *old_context = bdrv_get_aio_context(bs);
7367
7368
7369
7370
7371
7372
7373
7374 if (old_context != qemu_get_aio_context()) {
7375 aio_context_acquire(old_context);
7376 }
7377 bdrv_detach_aio_context(bs);
7378 if (old_context != qemu_get_aio_context()) {
7379 aio_context_release(old_context);
7380 }
7381 bdrv_attach_aio_context(bs, new_context);
7382}
7383
7384static TransactionActionDrv set_aio_context = {
7385 .commit = bdrv_set_aio_context_commit,
7386 .clean = bdrv_set_aio_context_clean,
7387};
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402static bool bdrv_change_aio_context(BlockDriverState *bs, AioContext *ctx,
7403 GHashTable *visited, Transaction *tran,
7404 Error **errp)
7405{
7406 BdrvChild *c;
7407 BdrvStateSetAioContext *state;
7408
7409 GLOBAL_STATE_CODE();
7410
7411 if (bdrv_get_aio_context(bs) == ctx) {
7412 return true;
7413 }
7414
7415 QLIST_FOREACH(c, &bs->parents, next_parent) {
7416 if (!bdrv_parent_change_aio_context(c, ctx, visited, tran, errp)) {
7417 return false;
7418 }
7419 }
7420
7421 QLIST_FOREACH(c, &bs->children, next) {
7422 if (!bdrv_child_change_aio_context(c, ctx, visited, tran, errp)) {
7423 return false;
7424 }
7425 }
7426
7427 state = g_new(BdrvStateSetAioContext, 1);
7428 *state = (BdrvStateSetAioContext) {
7429 .new_ctx = ctx,
7430 .bs = bs,
7431 };
7432
7433
7434 bdrv_drained_begin(bs);
7435
7436 tran_add(tran, &set_aio_context, state);
7437
7438 return true;
7439}
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455int bdrv_try_change_aio_context(BlockDriverState *bs, AioContext *ctx,
7456 BdrvChild *ignore_child, Error **errp)
7457{
7458 Transaction *tran;
7459 GHashTable *visited;
7460 int ret;
7461 AioContext *old_context = bdrv_get_aio_context(bs);
7462 GLOBAL_STATE_CODE();
7463
7464
7465
7466
7467
7468
7469
7470 tran = tran_new();
7471 visited = g_hash_table_new(NULL, NULL);
7472 if (ignore_child) {
7473 g_hash_table_add(visited, ignore_child);
7474 }
7475 ret = bdrv_change_aio_context(bs, ctx, visited, tran, errp);
7476 g_hash_table_destroy(visited);
7477
7478
7479
7480
7481
7482
7483
7484
7485 if (!ret) {
7486
7487 tran_abort(tran);
7488 return -EPERM;
7489 }
7490
7491
7492
7493
7494
7495 if (qemu_get_aio_context() != old_context) {
7496 aio_context_release(old_context);
7497 }
7498
7499
7500
7501
7502
7503
7504 if (qemu_get_aio_context() != ctx) {
7505 aio_context_acquire(ctx);
7506 }
7507
7508 tran_commit(tran);
7509
7510 if (qemu_get_aio_context() != ctx) {
7511 aio_context_release(ctx);
7512 }
7513
7514
7515 if (qemu_get_aio_context() != old_context) {
7516 aio_context_acquire(old_context);
7517 }
7518
7519 return 0;
7520}
7521
7522void bdrv_add_aio_context_notifier(BlockDriverState *bs,
7523 void (*attached_aio_context)(AioContext *new_context, void *opaque),
7524 void (*detach_aio_context)(void *opaque), void *opaque)
7525{
7526 BdrvAioNotifier *ban = g_new(BdrvAioNotifier, 1);
7527 *ban = (BdrvAioNotifier){
7528 .attached_aio_context = attached_aio_context,
7529 .detach_aio_context = detach_aio_context,
7530 .opaque = opaque
7531 };
7532 GLOBAL_STATE_CODE();
7533
7534 QLIST_INSERT_HEAD(&bs->aio_notifiers, ban, list);
7535}
7536
7537void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
7538 void (*attached_aio_context)(AioContext *,
7539 void *),
7540 void (*detach_aio_context)(void *),
7541 void *opaque)
7542{
7543 BdrvAioNotifier *ban, *ban_next;
7544 GLOBAL_STATE_CODE();
7545
7546 QLIST_FOREACH_SAFE(ban, &bs->aio_notifiers, list, ban_next) {
7547 if (ban->attached_aio_context == attached_aio_context &&
7548 ban->detach_aio_context == detach_aio_context &&
7549 ban->opaque == opaque &&
7550 ban->deleted == false)
7551 {
7552 if (bs->walking_aio_notifiers) {
7553 ban->deleted = true;
7554 } else {
7555 bdrv_do_remove_aio_context_notifier(ban);
7556 }
7557 return;
7558 }
7559 }
7560
7561 abort();
7562}
7563
7564int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
7565 BlockDriverAmendStatusCB *status_cb, void *cb_opaque,
7566 bool force,
7567 Error **errp)
7568{
7569 GLOBAL_STATE_CODE();
7570 if (!bs->drv) {
7571 error_setg(errp, "Node is ejected");
7572 return -ENOMEDIUM;
7573 }
7574 if (!bs->drv->bdrv_amend_options) {
7575 error_setg(errp, "Block driver '%s' does not support option amendment",
7576 bs->drv->format_name);
7577 return -ENOTSUP;
7578 }
7579 return bs->drv->bdrv_amend_options(bs, opts, status_cb,
7580 cb_opaque, force, errp);
7581}
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595bool bdrv_recurse_can_replace(BlockDriverState *bs,
7596 BlockDriverState *to_replace)
7597{
7598 BlockDriverState *filtered;
7599
7600 GLOBAL_STATE_CODE();
7601
7602 if (!bs || !bs->drv) {
7603 return false;
7604 }
7605
7606 if (bs == to_replace) {
7607 return true;
7608 }
7609
7610
7611 if (bs->drv->bdrv_recurse_can_replace) {
7612 return bs->drv->bdrv_recurse_can_replace(bs, to_replace);
7613 }
7614
7615
7616 filtered = bdrv_filter_bs(bs);
7617 if (filtered) {
7618 return bdrv_recurse_can_replace(filtered, to_replace);
7619 }
7620
7621
7622 return false;
7623}
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
7637 const char *node_name, Error **errp)
7638{
7639 BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
7640 AioContext *aio_context;
7641
7642 GLOBAL_STATE_CODE();
7643
7644 if (!to_replace_bs) {
7645 error_setg(errp, "Failed to find node with node-name='%s'", node_name);
7646 return NULL;
7647 }
7648
7649 aio_context = bdrv_get_aio_context(to_replace_bs);
7650 aio_context_acquire(aio_context);
7651
7652 if (bdrv_op_is_blocked(to_replace_bs, BLOCK_OP_TYPE_REPLACE, errp)) {
7653 to_replace_bs = NULL;
7654 goto out;
7655 }
7656
7657
7658
7659
7660
7661
7662 if (!bdrv_recurse_can_replace(parent_bs, to_replace_bs)) {
7663 error_setg(errp, "Cannot replace '%s' by a node mirrored from '%s', "
7664 "because it cannot be guaranteed that doing so would not "
7665 "lead to an abrupt change of visible data",
7666 node_name, parent_bs->node_name);
7667 to_replace_bs = NULL;
7668 goto out;
7669 }
7670
7671out:
7672 aio_context_release(aio_context);
7673 return to_replace_bs;
7674}
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686static const char *const *strong_options(BlockDriverState *bs,
7687 const char *const *curopt)
7688{
7689 static const char *const global_options[] = {
7690 "driver", "filename", NULL
7691 };
7692
7693 if (!curopt) {
7694 return &global_options[0];
7695 }
7696
7697 curopt++;
7698 if (curopt == &global_options[ARRAY_SIZE(global_options) - 1] && bs->drv) {
7699 curopt = bs->drv->strong_runtime_opts;
7700 }
7701
7702 return (curopt && *curopt) ? curopt : NULL;
7703}
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716static bool append_strong_runtime_options(QDict *d, BlockDriverState *bs)
7717{
7718 bool found_any = false;
7719 const char *const *option_name = NULL;
7720
7721 if (!bs->drv) {
7722 return false;
7723 }
7724
7725 while ((option_name = strong_options(bs, option_name))) {
7726 bool option_given = false;
7727
7728 assert(strlen(*option_name) > 0);
7729 if ((*option_name)[strlen(*option_name) - 1] != '.') {
7730 QObject *entry = qdict_get(bs->options, *option_name);
7731 if (!entry) {
7732 continue;
7733 }
7734
7735 qdict_put_obj(d, *option_name, qobject_ref(entry));
7736 option_given = true;
7737 } else {
7738 const QDictEntry *entry;
7739 for (entry = qdict_first(bs->options); entry;
7740 entry = qdict_next(bs->options, entry))
7741 {
7742 if (strstart(qdict_entry_key(entry), *option_name, NULL)) {
7743 qdict_put_obj(d, qdict_entry_key(entry),
7744 qobject_ref(qdict_entry_value(entry)));
7745 option_given = true;
7746 }
7747 }
7748 }
7749
7750
7751
7752 if (!found_any && option_given &&
7753 strcmp(*option_name, "driver") && strcmp(*option_name, "filename"))
7754 {
7755 found_any = true;
7756 }
7757 }
7758
7759 if (!qdict_haskey(d, "driver")) {
7760
7761
7762 qdict_put_str(d, "driver", bs->drv->format_name);
7763 }
7764
7765 return found_any;
7766}
7767
7768
7769
7770
7771static bool bdrv_backing_overridden(BlockDriverState *bs)
7772{
7773 GLOBAL_STATE_CODE();
7774 if (bs->backing) {
7775 return strcmp(bs->auto_backing_file,
7776 bs->backing->bs->filename);
7777 } else {
7778
7779
7780 return bs->auto_backing_file[0] != '\0';
7781 }
7782}
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796void bdrv_refresh_filename(BlockDriverState *bs)
7797{
7798 BlockDriver *drv = bs->drv;
7799 BdrvChild *child;
7800 BlockDriverState *primary_child_bs;
7801 QDict *opts;
7802 bool backing_overridden;
7803 bool generate_json_filename;
7804
7805
7806 GLOBAL_STATE_CODE();
7807
7808 if (!drv) {
7809 return;
7810 }
7811
7812
7813
7814 QLIST_FOREACH(child, &bs->children, next) {
7815 bdrv_refresh_filename(child->bs);
7816 }
7817
7818 if (bs->implicit) {
7819
7820 child = QLIST_FIRST(&bs->children);
7821 assert(QLIST_NEXT(child, next) == NULL);
7822
7823 pstrcpy(bs->exact_filename, sizeof(bs->exact_filename),
7824 child->bs->exact_filename);
7825 pstrcpy(bs->filename, sizeof(bs->filename), child->bs->filename);
7826
7827 qobject_unref(bs->full_open_options);
7828 bs->full_open_options = qobject_ref(child->bs->full_open_options);
7829
7830 return;
7831 }
7832
7833 backing_overridden = bdrv_backing_overridden(bs);
7834
7835 if (bs->open_flags & BDRV_O_NO_IO) {
7836
7837
7838
7839
7840 backing_overridden = false;
7841 }
7842
7843
7844 opts = qdict_new();
7845 generate_json_filename = append_strong_runtime_options(opts, bs);
7846 generate_json_filename |= backing_overridden;
7847
7848 if (drv->bdrv_gather_child_options) {
7849
7850
7851 drv->bdrv_gather_child_options(bs, opts, backing_overridden);
7852 } else {
7853 QLIST_FOREACH(child, &bs->children, next) {
7854 if (child == bs->backing && !backing_overridden) {
7855
7856 continue;
7857 }
7858
7859 qdict_put(opts, child->name,
7860 qobject_ref(child->bs->full_open_options));
7861 }
7862
7863 if (backing_overridden && !bs->backing) {
7864
7865 qdict_put_null(opts, "backing");
7866 }
7867 }
7868
7869 qobject_unref(bs->full_open_options);
7870 bs->full_open_options = opts;
7871
7872 primary_child_bs = bdrv_primary_bs(bs);
7873
7874 if (drv->bdrv_refresh_filename) {
7875
7876
7877 bs->exact_filename[0] = '\0';
7878
7879 drv->bdrv_refresh_filename(bs);
7880 } else if (primary_child_bs) {
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890 bs->exact_filename[0] = '\0';
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904 if (primary_child_bs->exact_filename[0] &&
7905 primary_child_bs->drv->bdrv_file_open &&
7906 !drv->is_filter && !generate_json_filename)
7907 {
7908 strcpy(bs->exact_filename, primary_child_bs->exact_filename);
7909 }
7910 }
7911
7912 if (bs->exact_filename[0]) {
7913 pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
7914 } else {
7915 GString *json = qobject_to_json(QOBJECT(bs->full_open_options));
7916 if (snprintf(bs->filename, sizeof(bs->filename), "json:%s",
7917 json->str) >= sizeof(bs->filename)) {
7918
7919 strcpy(bs->filename + sizeof(bs->filename) - 4, "...");
7920 }
7921 g_string_free(json, true);
7922 }
7923}
7924
7925char *bdrv_dirname(BlockDriverState *bs, Error **errp)
7926{
7927 BlockDriver *drv = bs->drv;
7928 BlockDriverState *child_bs;
7929
7930 GLOBAL_STATE_CODE();
7931
7932 if (!drv) {
7933 error_setg(errp, "Node '%s' is ejected", bs->node_name);
7934 return NULL;
7935 }
7936
7937 if (drv->bdrv_dirname) {
7938 return drv->bdrv_dirname(bs, errp);
7939 }
7940
7941 child_bs = bdrv_primary_bs(bs);
7942 if (child_bs) {
7943 return bdrv_dirname(child_bs, errp);
7944 }
7945
7946 bdrv_refresh_filename(bs);
7947 if (bs->exact_filename[0] != '\0') {
7948 return path_combine(bs->exact_filename, "");
7949 }
7950
7951 error_setg(errp, "Cannot generate a base directory for %s nodes",
7952 drv->format_name);
7953 return NULL;
7954}
7955
7956
7957
7958
7959
7960void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs,
7961 Error **errp)
7962{
7963 GLOBAL_STATE_CODE();
7964 if (!parent_bs->drv || !parent_bs->drv->bdrv_add_child) {
7965 error_setg(errp, "The node %s does not support adding a child",
7966 bdrv_get_device_or_node_name(parent_bs));
7967 return;
7968 }
7969
7970 if (!QLIST_EMPTY(&child_bs->parents)) {
7971 error_setg(errp, "The node %s already has a parent",
7972 child_bs->node_name);
7973 return;
7974 }
7975
7976 parent_bs->drv->bdrv_add_child(parent_bs, child_bs, errp);
7977}
7978
7979void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child, Error **errp)
7980{
7981 BdrvChild *tmp;
7982
7983 GLOBAL_STATE_CODE();
7984 if (!parent_bs->drv || !parent_bs->drv->bdrv_del_child) {
7985 error_setg(errp, "The node %s does not support removing a child",
7986 bdrv_get_device_or_node_name(parent_bs));
7987 return;
7988 }
7989
7990 QLIST_FOREACH(tmp, &parent_bs->children, next) {
7991 if (tmp == child) {
7992 break;
7993 }
7994 }
7995
7996 if (!tmp) {
7997 error_setg(errp, "The node %s does not have a child named %s",
7998 bdrv_get_device_or_node_name(parent_bs),
7999 bdrv_get_device_or_node_name(child->bs));
8000 return;
8001 }
8002
8003 parent_bs->drv->bdrv_del_child(parent_bs, child, errp);
8004}
8005
8006int bdrv_make_empty(BdrvChild *c, Error **errp)
8007{
8008 BlockDriver *drv = c->bs->drv;
8009 int ret;
8010
8011 GLOBAL_STATE_CODE();
8012 assert(c->perm & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED));
8013
8014 if (!drv->bdrv_make_empty) {
8015 error_setg(errp, "%s does not support emptying nodes",
8016 drv->format_name);
8017 return -ENOTSUP;
8018 }
8019
8020 ret = drv->bdrv_make_empty(c->bs);
8021 if (ret < 0) {
8022 error_setg_errno(errp, -ret, "Failed to empty %s",
8023 c->bs->filename);
8024 return ret;
8025 }
8026
8027 return 0;
8028}
8029
8030
8031
8032
8033
8034BdrvChild *bdrv_cow_child(BlockDriverState *bs)
8035{
8036 IO_CODE();
8037
8038 if (!bs || !bs->drv) {
8039 return NULL;
8040 }
8041
8042 if (bs->drv->is_filter) {
8043 return NULL;
8044 }
8045
8046 if (!bs->backing) {
8047 return NULL;
8048 }
8049
8050 assert(bs->backing->role & BDRV_CHILD_COW);
8051 return bs->backing;
8052}
8053
8054
8055
8056
8057
8058BdrvChild *bdrv_filter_child(BlockDriverState *bs)
8059{
8060 BdrvChild *c;
8061 IO_CODE();
8062
8063 if (!bs || !bs->drv) {
8064 return NULL;
8065 }
8066
8067 if (!bs->drv->is_filter) {
8068 return NULL;
8069 }
8070
8071
8072 assert(!(bs->backing && bs->file));
8073
8074 c = bs->backing ?: bs->file;
8075 if (!c) {
8076 return NULL;
8077 }
8078
8079 assert(c->role & BDRV_CHILD_FILTERED);
8080 return c;
8081}
8082
8083
8084
8085
8086
8087
8088
8089BdrvChild *bdrv_filter_or_cow_child(BlockDriverState *bs)
8090{
8091 BdrvChild *cow_child = bdrv_cow_child(bs);
8092 BdrvChild *filter_child = bdrv_filter_child(bs);
8093 IO_CODE();
8094
8095
8096 assert(!(cow_child && filter_child));
8097
8098 return cow_child ?: filter_child;
8099}
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111BdrvChild *bdrv_primary_child(BlockDriverState *bs)
8112{
8113 BdrvChild *c, *found = NULL;
8114 IO_CODE();
8115
8116 QLIST_FOREACH(c, &bs->children, next) {
8117 if (c->role & BDRV_CHILD_PRIMARY) {
8118 assert(!found);
8119 found = c;
8120 }
8121 }
8122
8123 return found;
8124}
8125
8126static BlockDriverState *bdrv_do_skip_filters(BlockDriverState *bs,
8127 bool stop_on_explicit_filter)
8128{
8129 BdrvChild *c;
8130
8131 if (!bs) {
8132 return NULL;
8133 }
8134
8135 while (!(stop_on_explicit_filter && !bs->implicit)) {
8136 c = bdrv_filter_child(bs);
8137 if (!c) {
8138
8139
8140
8141
8142
8143
8144 assert(!bs->drv || !bs->drv->is_filter);
8145 break;
8146 }
8147 bs = c->bs;
8148 }
8149
8150
8151
8152
8153
8154
8155
8156
8157 return bs;
8158}
8159
8160
8161
8162
8163
8164
8165BlockDriverState *bdrv_skip_implicit_filters(BlockDriverState *bs)
8166{
8167 GLOBAL_STATE_CODE();
8168 return bdrv_do_skip_filters(bs, true);
8169}
8170
8171
8172
8173
8174
8175BlockDriverState *bdrv_skip_filters(BlockDriverState *bs)
8176{
8177 IO_CODE();
8178 return bdrv_do_skip_filters(bs, false);
8179}
8180
8181
8182
8183
8184
8185BlockDriverState *bdrv_backing_chain_next(BlockDriverState *bs)
8186{
8187 IO_CODE();
8188 return bdrv_skip_filters(bdrv_cow_bs(bdrv_skip_filters(bs)));
8189}
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199static bool bdrv_bsc_range_overlaps_locked(BlockDriverState *bs,
8200 int64_t offset, int64_t bytes,
8201 int64_t *pnum)
8202{
8203 BdrvBlockStatusCache *bsc = qatomic_rcu_read(&bs->block_status_cache);
8204 bool overlaps;
8205
8206 overlaps =
8207 qatomic_read(&bsc->valid) &&
8208 ranges_overlap(offset, bytes, bsc->data_start,
8209 bsc->data_end - bsc->data_start);
8210
8211 if (overlaps && pnum) {
8212 *pnum = bsc->data_end - offset;
8213 }
8214
8215 return overlaps;
8216}
8217
8218
8219
8220
8221bool bdrv_bsc_is_data(BlockDriverState *bs, int64_t offset, int64_t *pnum)
8222{
8223 IO_CODE();
8224 RCU_READ_LOCK_GUARD();
8225 return bdrv_bsc_range_overlaps_locked(bs, offset, 1, pnum);
8226}
8227
8228
8229
8230
8231void bdrv_bsc_invalidate_range(BlockDriverState *bs,
8232 int64_t offset, int64_t bytes)
8233{
8234 IO_CODE();
8235 RCU_READ_LOCK_GUARD();
8236
8237 if (bdrv_bsc_range_overlaps_locked(bs, offset, bytes, NULL)) {
8238 qatomic_set(&bs->block_status_cache->valid, false);
8239 }
8240}
8241
8242
8243
8244
8245void bdrv_bsc_fill(BlockDriverState *bs, int64_t offset, int64_t bytes)
8246{
8247 BdrvBlockStatusCache *new_bsc = g_new(BdrvBlockStatusCache, 1);
8248 BdrvBlockStatusCache *old_bsc;
8249 IO_CODE();
8250
8251 *new_bsc = (BdrvBlockStatusCache) {
8252 .valid = true,
8253 .data_start = offset,
8254 .data_end = offset + bytes,
8255 };
8256
8257 QEMU_LOCK_GUARD(&bs->bsc_modify_lock);
8258
8259 old_bsc = qatomic_rcu_read(&bs->block_status_cache);
8260 qatomic_rcu_set(&bs->block_status_cache, new_bsc);
8261 if (old_bsc) {
8262 g_free_rcu(old_bsc, rcu);
8263 }
8264}
8265