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