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