Lines Matching +full:- +full:- +full:disable +full:- +full:live +full:- +full:block +full:- +full:migration

2  * QEMU host block devices
4 * Copyright (c) 2003-2008 Fabrice Bellard
7 * later. See the COPYING file in the top-level directory.
12 * Copyright (c) 2003-2008 Fabrice Bellard
34 #include "system/block-backend.h"
36 #include "hw/block/block.h"
37 #include "block/blockjob.h"
38 #include "block/dirty-bitmap.h"
39 #include "block/qdict.h"
40 #include "block/throttle-groups.h"
42 #include "qemu/error-report.h"
44 #include "qemu/qemu-print.h"
45 #include "qemu/config-file.h"
46 #include "qapi/qapi-commands-block.h"
47 #include "qapi/qapi-commands-transaction.h"
48 #include "qapi/qapi-visit-block-core.h"
55 #include "qapi/qobject-output-visitor.h"
58 #include "block/block_int.h"
59 #include "block/trace.h"
64 #include "qemu/main-loop.h"
65 #include "qemu/throttle-options.h"
99 * For instance, if you change [IF_SCSI] to 255, -drive
109 * Boards may call this to offer board-by-board overrides
125 if (dinfo->type == type) { in override_max_devs()
126 fprintf(stderr, "Cannot override units-per-bus property of" in override_max_devs()
158 while (job && (job->job.cancelled || in blockdev_mark_auto_del()
159 job->job.deferred_to_main_loop || in blockdev_mark_auto_del()
169 job_cancel_locked(&job->job, false); in blockdev_mark_auto_del()
173 dinfo->auto_del = 1; in blockdev_mark_auto_del()
181 if (dinfo && dinfo->auto_del) { in blockdev_auto_del()
230 if (dinfo && dinfo->type == type in drive_get()
231 && dinfo->bus == bus && dinfo->unit == unit) { in drive_get()
240 * Check board claimed all -drive that are meant to be claimed.
259 * -device, so we can leave failing to -device. in drive_check_orphaned()
263 if (dinfo->is_default || dinfo->type == IF_VIRTIO in drive_check_orphaned()
264 || dinfo->type == IF_XEN || dinfo->type == IF_NONE) { in drive_check_orphaned()
269 qemu_opts_loc_restore(dinfo->opts); in drive_check_orphaned()
272 if_name[dinfo->type], dinfo->bus, dinfo->unit); in drive_check_orphaned()
299 max_bus = -1; in drive_get_max_bus()
302 if (dinfo && dinfo->type == type && dinfo->bus > max_bus) { in drive_get_max_bus()
303 max_bus = dinfo->bus; in drive_get_max_bus()
332 return -1; in parse_block_error_action()
341 switch (qobject_type(entry->value)) { in parse_stats_intervals()
346 entry->value)); in parse_stats_intervals()
358 int64_t length = qnum_get_int(qobject_to(QNum, entry->value)); in parse_stats_intervals()
370 error_setg(errp, "The specification of stats-intervals is invalid"); in parse_stats_intervals()
388 if (qemu_opt_get_bool(opts, "copy-on-read", false)) { in extract_common_blockdev_options()
407 throttle_cfg->buckets[THROTTLE_BPS_TOTAL].avg = in extract_common_blockdev_options()
408 qemu_opt_get_number(opts, "throttling.bps-total", 0); in extract_common_blockdev_options()
409 throttle_cfg->buckets[THROTTLE_BPS_READ].avg = in extract_common_blockdev_options()
410 qemu_opt_get_number(opts, "throttling.bps-read", 0); in extract_common_blockdev_options()
411 throttle_cfg->buckets[THROTTLE_BPS_WRITE].avg = in extract_common_blockdev_options()
412 qemu_opt_get_number(opts, "throttling.bps-write", 0); in extract_common_blockdev_options()
413 throttle_cfg->buckets[THROTTLE_OPS_TOTAL].avg = in extract_common_blockdev_options()
414 qemu_opt_get_number(opts, "throttling.iops-total", 0); in extract_common_blockdev_options()
415 throttle_cfg->buckets[THROTTLE_OPS_READ].avg = in extract_common_blockdev_options()
416 qemu_opt_get_number(opts, "throttling.iops-read", 0); in extract_common_blockdev_options()
417 throttle_cfg->buckets[THROTTLE_OPS_WRITE].avg = in extract_common_blockdev_options()
418 qemu_opt_get_number(opts, "throttling.iops-write", 0); in extract_common_blockdev_options()
420 throttle_cfg->buckets[THROTTLE_BPS_TOTAL].max = in extract_common_blockdev_options()
421 qemu_opt_get_number(opts, "throttling.bps-total-max", 0); in extract_common_blockdev_options()
422 throttle_cfg->buckets[THROTTLE_BPS_READ].max = in extract_common_blockdev_options()
423 qemu_opt_get_number(opts, "throttling.bps-read-max", 0); in extract_common_blockdev_options()
424 throttle_cfg->buckets[THROTTLE_BPS_WRITE].max = in extract_common_blockdev_options()
425 qemu_opt_get_number(opts, "throttling.bps-write-max", 0); in extract_common_blockdev_options()
426 throttle_cfg->buckets[THROTTLE_OPS_TOTAL].max = in extract_common_blockdev_options()
427 qemu_opt_get_number(opts, "throttling.iops-total-max", 0); in extract_common_blockdev_options()
428 throttle_cfg->buckets[THROTTLE_OPS_READ].max = in extract_common_blockdev_options()
429 qemu_opt_get_number(opts, "throttling.iops-read-max", 0); in extract_common_blockdev_options()
430 throttle_cfg->buckets[THROTTLE_OPS_WRITE].max = in extract_common_blockdev_options()
431 qemu_opt_get_number(opts, "throttling.iops-write-max", 0); in extract_common_blockdev_options()
433 throttle_cfg->buckets[THROTTLE_BPS_TOTAL].burst_length = in extract_common_blockdev_options()
434 qemu_opt_get_number(opts, "throttling.bps-total-max-length", 1); in extract_common_blockdev_options()
435 throttle_cfg->buckets[THROTTLE_BPS_READ].burst_length = in extract_common_blockdev_options()
436 qemu_opt_get_number(opts, "throttling.bps-read-max-length", 1); in extract_common_blockdev_options()
437 throttle_cfg->buckets[THROTTLE_BPS_WRITE].burst_length = in extract_common_blockdev_options()
438 qemu_opt_get_number(opts, "throttling.bps-write-max-length", 1); in extract_common_blockdev_options()
439 throttle_cfg->buckets[THROTTLE_OPS_TOTAL].burst_length = in extract_common_blockdev_options()
440 qemu_opt_get_number(opts, "throttling.iops-total-max-length", 1); in extract_common_blockdev_options()
441 throttle_cfg->buckets[THROTTLE_OPS_READ].burst_length = in extract_common_blockdev_options()
442 qemu_opt_get_number(opts, "throttling.iops-read-max-length", 1); in extract_common_blockdev_options()
443 throttle_cfg->buckets[THROTTLE_OPS_WRITE].burst_length = in extract_common_blockdev_options()
444 qemu_opt_get_number(opts, "throttling.iops-write-max-length", 1); in extract_common_blockdev_options()
446 throttle_cfg->op_size = in extract_common_blockdev_options()
447 qemu_opt_get_number(opts, "throttling.iops-size", 0); in extract_common_blockdev_options()
457 qemu_opt_get(opts, "detect-zeroes"), in extract_common_blockdev_options()
519 account_invalid = account_get_opt(opts, "stats-account-invalid"); in blockdev_init()
520 account_failed = account_get_opt(opts, "stats-account-failed"); in blockdev_init()
526 qdict_extract_subqdict(bs_opts, &interval_dict, "stats-intervals."); in blockdev_init()
530 error_setg(errp, "Invalid option stats-intervals.%s", in blockdev_init()
531 qdict_first(interval_dict)->key); in blockdev_init()
546 qemu_printf("\nSupported formats (read-only):"); in blockdev_init()
589 blk_rs->open_flags = bdrv_flags | (read_only ? 0 : BDRV_O_RDWR); in blockdev_init()
590 blk_rs->detect_zeroes = detect_zeroes; in blockdev_init()
618 bs->detect_zeroes = detect_zeroes; in blockdev_init()
692 /* Iterates over the list of monitor-owned BlockDriverStates */
752 /* Options that are passed on, but have special semantics with -drive */
756 .help = "open drive file as read-only",
766 .name = "copy-on-read",
799 { "iops", "throttling.iops-total" }, in drive_new()
800 { "iops_rd", "throttling.iops-read" }, in drive_new()
801 { "iops_wr", "throttling.iops-write" }, in drive_new()
803 { "bps", "throttling.bps-total" }, in drive_new()
804 { "bps_rd", "throttling.bps-read" }, in drive_new()
805 { "bps_wr", "throttling.bps-write" }, in drive_new()
807 { "iops_max", "throttling.iops-total-max" }, in drive_new()
808 { "iops_rd_max", "throttling.iops-read-max" }, in drive_new()
809 { "iops_wr_max", "throttling.iops-write-max" }, in drive_new()
811 { "bps_max", "throttling.bps-total-max" }, in drive_new()
812 { "bps_rd_max", "throttling.bps-read-max" }, in drive_new()
813 { "bps_wr_max", "throttling.bps-write-max" }, in drive_new()
815 { "iops_size", "throttling.iops-size" }, in drive_new()
879 /* copy-on-read is disabled with a warning for read-only devices */ in drive_new()
881 copy_on_read = qemu_opt_get_bool(legacy_opts, "copy-on-read", false); in drive_new()
884 warn_report("disabling copy-on-read on read-only drive"); in drive_new()
889 qdict_put_str(bs_opts, "copy-on-read", copy_on_read ? "on" : "off"); in drive_new()
909 unit_id = qemu_opt_get_number(legacy_opts, "unit", -1); in drive_new()
910 index = qemu_opt_get_number(legacy_opts, "index", -1); in drive_new()
914 if (index != -1) { in drive_new()
915 if (bus_id != 0 || unit_id != -1) { in drive_new()
923 if (unit_id == -1) { in drive_new()
928 unit_id -= max_devs; in drive_new()
935 error_setg(errp, "unit %d too big (max is %d)", unit_id, max_devs - 1); in drive_new()
945 /* no id supplied -> create one */ in drive_new()
950 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd"; in drive_new()
963 /* Add virtio block device */ in drive_new()
968 qemu_opt_set(devopts, "driver", "virtio-blk", &error_abort); in drive_new()
976 (media == MEDIA_CDROM) ? "xen-cdrom" : "xen-disk", in drive_new()
1005 /* Actual block device init: Functionality shared with blockdev-add */ in drive_new()
1014 dinfo->opts = all_opts; in drive_new()
1016 dinfo->type = type; in drive_new()
1017 dinfo->bus = bus_id; in drive_new()
1018 dinfo->unit = unit_id; in drive_new()
1027 dinfo->media_cd = media == MEDIA_CDROM; in drive_new()
1051 error_setg(errp, "Need a root block node"); in qmp_get_root_bs()
1173 info->id = g_strdup(sn.id_str); in qmp_blockdev_snapshot_delete_internal_sync()
1174 info->name = g_strdup(sn.name); in qmp_blockdev_snapshot_delete_internal_sync()
1175 info->date_nsec = sn.date_nsec; in qmp_blockdev_snapshot_delete_internal_sync()
1176 info->date_sec = sn.date_sec; in qmp_blockdev_snapshot_delete_internal_sync()
1177 info->vm_state_size = sn.vm_state_size; in qmp_blockdev_snapshot_delete_internal_sync()
1178 info->vm_clock_nsec = sn.vm_clock_nsec % 1000000000; in qmp_blockdev_snapshot_delete_internal_sync()
1179 info->vm_clock_sec = sn.vm_clock_nsec / 1000000000; in qmp_blockdev_snapshot_delete_internal_sync()
1180 if (sn.icount != -1ULL) { in qmp_blockdev_snapshot_delete_internal_sync()
1181 info->icount = sn.icount; in qmp_blockdev_snapshot_delete_internal_sync()
1182 info->has_icount = true; in qmp_blockdev_snapshot_delete_internal_sync()
1223 device = internal->device; in internal_snapshot_action()
1224 name = internal->name; in internal_snapshot_action()
1232 state->bs = bs; in internal_snapshot_action()
1245 error_setg(errp, "Block node of device '%s' unexpectedly changed", in internal_snapshot_action()
1261 error_setg(errp, "Block format '%s' used by device '%s' " in internal_snapshot_action()
1263 bs->drv->format_name, device); in internal_snapshot_action()
1286 sn = &state->sn; in internal_snapshot_action()
1287 pstrcpy(sn->name, sizeof(sn->name), name); in internal_snapshot_action()
1289 sn->date_sec = rt / G_USEC_PER_SEC; in internal_snapshot_action()
1290 sn->date_nsec = (rt % G_USEC_PER_SEC) * 1000; in internal_snapshot_action()
1291 sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); in internal_snapshot_action()
1293 sn->icount = replay_get_current_icount(); in internal_snapshot_action()
1295 sn->icount = -1ULL; in internal_snapshot_action()
1300 error_setg_errno(errp, -ret1, in internal_snapshot_action()
1307 state->created = true; in internal_snapshot_action()
1313 BlockDriverState *bs = state->bs; in internal_snapshot_abort()
1314 QEMUSnapshotInfo *sn = &state->sn; in internal_snapshot_abort()
1319 if (!state->created) { in internal_snapshot_abort()
1326 if (bdrv_snapshot_delete(bs, sn->id_str, sn->name, &local_error) < 0) { in internal_snapshot_abort()
1330 sn->id_str, sn->name, in internal_snapshot_abort()
1341 if (!state->bs) { in internal_snapshot_clean()
1345 bdrv_drained_end(state->bs); in internal_snapshot_clean()
1374 /* Reference to the new image (for 'blockdev-snapshot') */ in external_snapshot_action()
1376 /* File name of the new image (for 'blockdev-snapshot-sync') */ in external_snapshot_action()
1387 /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar in external_snapshot_action()
1389 switch (action->type) { in external_snapshot_action()
1392 BlockdevSnapshot *s = action->u.blockdev_snapshot.data; in external_snapshot_action()
1393 device = s->node; in external_snapshot_action()
1394 node_name = s->node; in external_snapshot_action()
1396 snapshot_ref = s->overlay; in external_snapshot_action()
1401 BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data; in external_snapshot_action()
1402 device = s->device; in external_snapshot_action()
1403 node_name = s->node_name; in external_snapshot_action()
1404 new_image_file = s->snapshot_file; in external_snapshot_action()
1414 state->old_bs = bdrv_lookup_bs(device, node_name, errp); in external_snapshot_action()
1415 if (!state->old_bs) { in external_snapshot_action()
1423 bdrv_drained_begin(state->old_bs); in external_snapshot_action()
1428 if (state->old_bs != check_bs) { in external_snapshot_action()
1430 error_setg(errp, "Block node of device '%s' unexpectedly changed", in external_snapshot_action()
1436 if (!bdrv_is_inserted(state->old_bs)) { in external_snapshot_action()
1438 bdrv_get_device_or_node_name(state->old_bs)); in external_snapshot_action()
1442 if (bdrv_op_is_blocked(state->old_bs, in external_snapshot_action()
1447 if (!bdrv_is_read_only(state->old_bs)) { in external_snapshot_action()
1448 ret = bdrv_flush(state->old_bs); in external_snapshot_action()
1450 error_setg_errno(errp, -ret, "Write to node '%s' failed", in external_snapshot_action()
1451 bdrv_get_device_or_node_name(state->old_bs)); in external_snapshot_action()
1456 if (action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC) { in external_snapshot_action()
1457 BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data; in external_snapshot_action()
1458 const char *format = s->format ?: "qcow2"; in external_snapshot_action()
1460 const char *snapshot_node_name = s->snapshot_node_name; in external_snapshot_action()
1463 error_setg(errp, "New overlay node-name missing"); in external_snapshot_action()
1469 error_setg(errp, "New overlay node-name already in use"); in external_snapshot_action()
1473 flags = state->old_bs->open_flags; in external_snapshot_action()
1478 mode = s->has_mode ? s->mode : NEW_IMAGE_MODE_ABSOLUTE_PATHS; in external_snapshot_action()
1480 int64_t size = bdrv_getlength(state->old_bs); in external_snapshot_action()
1482 error_setg_errno(errp, -size, "bdrv_getlength failed"); in external_snapshot_action()
1485 bdrv_refresh_filename(state->old_bs); in external_snapshot_action()
1488 state->old_bs->filename, in external_snapshot_action()
1489 state->old_bs->drv->format_name, in external_snapshot_action()
1500 qdict_put_str(options, "node-name", snapshot_node_name); in external_snapshot_action()
1505 state->new_bs = bdrv_open(new_image_file, snapshot_ref, options, flags, in external_snapshot_action()
1509 if (!state->new_bs) { in external_snapshot_action()
1516 * (Specifically, allow it as a mirror target, which is write-only access.) in external_snapshot_action()
1518 bdrv_get_cumulative_perm(state->new_bs, &perm, &shared); in external_snapshot_action()
1524 if (state->new_bs->drv->is_filter) { in external_snapshot_action()
1529 if (bdrv_cow_child(state->new_bs)) { in external_snapshot_action()
1534 if (!state->new_bs->drv->supports_backing) { in external_snapshot_action()
1542 * important use case, which is taking a VM snapshot with migration to file in external_snapshot_action()
1548 if (bdrv_is_inactive(state->old_bs) && !bdrv_is_inactive(state->new_bs)) { in external_snapshot_action()
1552 ret = bdrv_inactivate(state->new_bs, errp); in external_snapshot_action()
1559 ret = bdrv_append(state->new_bs, state->old_bs, errp); in external_snapshot_action()
1563 state->overlay_appended = true; in external_snapshot_action()
1575 if (!qatomic_read(&state->old_bs->copy_on_read)) { in external_snapshot_commit()
1576 bdrv_reopen_set_read_only(state->old_bs, true, NULL); in external_snapshot_commit()
1583 if (state->new_bs) { in external_snapshot_abort()
1584 if (state->overlay_appended) { in external_snapshot_abort()
1591 aio_context = bdrv_get_aio_context(state->old_bs); in external_snapshot_abort()
1594 * Note that state->old_bs would not disappear during the in external_snapshot_abort()
1595 * write-locked section, because the unref from in external_snapshot_abort()
1596 * bdrv_set_backing_hd() only happens at the end of the write-locked in external_snapshot_abort()
1600 bdrv_ref(state->old_bs); in external_snapshot_abort()
1601 bdrv_set_backing_hd(state->new_bs, NULL, &error_abort); in external_snapshot_abort()
1604 * The call to bdrv_set_backing_hd() above returns state->old_bs to in external_snapshot_abort()
1608 tmp_context = bdrv_get_aio_context(state->old_bs); in external_snapshot_abort()
1610 ret = bdrv_try_change_aio_context_locked(state->old_bs, in external_snapshot_abort()
1616 bdrv_replace_node(state->new_bs, state->old_bs, &error_abort); in external_snapshot_abort()
1619 bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_bs */ in external_snapshot_abort()
1628 if (!state->old_bs) { in external_snapshot_clean()
1632 bdrv_drained_end(state->old_bs); in external_snapshot_clean()
1633 bdrv_unref(state->new_bs); in external_snapshot_clean()
1677 if (!backup->has_mode) { in drive_backup_action()
1678 backup->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS; in drive_backup_action()
1681 bs = bdrv_lookup_bs(backup->device, backup->device, errp); in drive_backup_action()
1686 if (!bs->drv) { in drive_backup_action()
1693 state->bs = bs; in drive_backup_action()
1697 format = backup->format; in drive_backup_action()
1698 if (!format && backup->mode != NEW_IMAGE_MODE_EXISTING) { in drive_backup_action()
1699 format = bs->drv->format_name; in drive_backup_action()
1709 flags = bs->open_flags | BDRV_O_RDWR; in drive_backup_action()
1715 if (backup->sync == MIRROR_SYNC_MODE_TOP) { in drive_backup_action()
1724 backup->sync = MIRROR_SYNC_MODE_FULL; in drive_backup_action()
1727 if (backup->sync == MIRROR_SYNC_MODE_NONE) { in drive_backup_action()
1736 error_setg_errno(errp, -size, "bdrv_getlength failed"); in drive_backup_action()
1740 if (backup->mode != NEW_IMAGE_MODE_EXISTING) { in drive_backup_action()
1751 bdrv_img_create(backup->target, format, in drive_backup_action()
1752 explicit_backing->filename, in drive_backup_action()
1753 explicit_backing->drv->format_name, NULL, in drive_backup_action()
1756 bdrv_img_create(backup->target, format, NULL, NULL, NULL, in drive_backup_action()
1768 qdict_put_str(options, "detect-zeroes", "unmap"); in drive_backup_action()
1773 target_bs = bdrv_open(backup->target, NULL, options, flags, errp); in drive_backup_action()
1793 state->job = do_backup_common(qapi_DriveBackup_base(backup), in drive_backup_action()
1805 assert(state->job); in drive_backup_commit()
1806 job_start(&state->job->job); in drive_backup_commit()
1813 if (state->job) { in drive_backup_abort()
1814 job_cancel_sync(&state->job->job, true); in drive_backup_abort()
1822 if (!state->bs) { in drive_backup_clean()
1826 bdrv_drained_end(state->bs); in drive_backup_clean()
1855 bs = bdrv_lookup_bs(backup->device, backup->device, errp); in blockdev_backup_action()
1860 target_bs = bdrv_lookup_bs(backup->target, backup->target, errp); in blockdev_backup_action()
1873 state->bs = bs; in blockdev_backup_action()
1876 bdrv_drained_begin(state->bs); in blockdev_backup_action()
1878 state->job = do_backup_common(qapi_BlockdevBackup_base(backup), in blockdev_backup_action()
1887 assert(state->job); in blockdev_backup_commit()
1888 job_start(&state->job->job); in blockdev_backup_commit()
1895 if (state->job) { in blockdev_backup_abort()
1896 job_cancel_sync(&state->job->job, true); in blockdev_backup_abort()
1904 if (!state->bs) { in blockdev_backup_clean()
1908 bdrv_drained_end(state->bs); in blockdev_backup_clean()
1933 qmp_block_dirty_bitmap_add(action->node, action->name, in block_dirty_bitmap_add_action()
1934 action->has_granularity, action->granularity, in block_dirty_bitmap_add_action()
1935 action->has_persistent, action->persistent, in block_dirty_bitmap_add_action()
1936 action->has_disabled, action->disabled, in block_dirty_bitmap_add_action()
1940 state->bitmap = block_dirty_bitmap_lookup(action->node, action->name, in block_dirty_bitmap_add_action()
1951 if (state->bitmap) { in block_dirty_bitmap_add_abort()
1952 bdrv_release_dirty_bitmap(state->bitmap); in block_dirty_bitmap_add_abort()
1971 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_clear_action()
1972 action->name, in block_dirty_bitmap_clear_action()
1973 &state->bs, in block_dirty_bitmap_clear_action()
1975 if (!state->bitmap) { in block_dirty_bitmap_clear_action()
1979 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_DEFAULT, errp)) { in block_dirty_bitmap_clear_action()
1983 bdrv_clear_dirty_bitmap(state->bitmap, &state->backup); in block_dirty_bitmap_clear_action()
1990 if (state->backup) { in block_dirty_bitmap_restore()
1991 bdrv_restore_dirty_bitmap(state->bitmap, state->backup); in block_dirty_bitmap_restore()
1999 hbitmap_free(state->backup); in block_dirty_bitmap_free_backup()
2015 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_enable_action()
2016 action->name, in block_dirty_bitmap_enable_action()
2019 if (!state->bitmap) { in block_dirty_bitmap_enable_action()
2023 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_ALLOW_RO, errp)) { in block_dirty_bitmap_enable_action()
2027 state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap); in block_dirty_bitmap_enable_action()
2028 bdrv_enable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_enable_action()
2035 if (!state->was_enabled) { in block_dirty_bitmap_enable_abort()
2036 bdrv_disable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_enable_abort()
2053 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_disable_action()
2054 action->name, in block_dirty_bitmap_disable_action()
2057 if (!state->bitmap) { in block_dirty_bitmap_disable_action()
2061 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_ALLOW_RO, errp)) { in block_dirty_bitmap_disable_action()
2065 state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap); in block_dirty_bitmap_disable_action()
2066 bdrv_disable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_disable_action()
2073 if (state->was_enabled) { in block_dirty_bitmap_disable_abort()
2074 bdrv_enable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_disable_abort()
2091 state->bitmap = block_dirty_bitmap_merge(action->node, action->target, in block_dirty_bitmap_merge_action()
2092 action->bitmaps, &state->backup, in block_dirty_bitmap_merge_action()
2112 state->bitmap = block_dirty_bitmap_remove(action->node, action->name, in block_dirty_bitmap_remove_action()
2113 false, &state->bs, errp); in block_dirty_bitmap_remove_action()
2114 if (state->bitmap) { in block_dirty_bitmap_remove_action()
2115 bdrv_dirty_bitmap_skip_store(state->bitmap, true); in block_dirty_bitmap_remove_action()
2116 bdrv_dirty_bitmap_set_busy(state->bitmap, true); in block_dirty_bitmap_remove_action()
2124 if (state->bitmap) { in block_dirty_bitmap_remove_abort()
2125 bdrv_dirty_bitmap_skip_store(state->bitmap, false); in block_dirty_bitmap_remove_abort()
2126 bdrv_dirty_bitmap_set_busy(state->bitmap, false); in block_dirty_bitmap_remove_abort()
2134 bdrv_dirty_bitmap_set_busy(state->bitmap, false); in block_dirty_bitmap_remove_commit()
2135 bdrv_release_dirty_bitmap(state->bitmap); in block_dirty_bitmap_remove_commit()
2157 switch (act->type) { in transaction_action()
2163 drive_backup_action(act->u.drive_backup.data, in transaction_action()
2167 blockdev_backup_action(act->u.blockdev_backup.data, in transaction_action()
2174 internal_snapshot_action(act->u.blockdev_snapshot_internal_sync.data, in transaction_action()
2178 block_dirty_bitmap_add_action(act->u.block_dirty_bitmap_add.data, in transaction_action()
2182 block_dirty_bitmap_clear_action(act->u.block_dirty_bitmap_clear.data, in transaction_action()
2186 block_dirty_bitmap_enable_action(act->u.block_dirty_bitmap_enable.data, in transaction_action()
2191 act->u.block_dirty_bitmap_disable.data, tran, errp); in transaction_action()
2194 block_dirty_bitmap_merge_action(act->u.block_dirty_bitmap_merge.data, in transaction_action()
2198 block_dirty_bitmap_remove_action(act->u.block_dirty_bitmap_remove.data, in transaction_action()
2230 properties ? properties->completion_mode : in qmp_transaction()
2239 for (act = actions; act; act = act->next) { in qmp_transaction()
2240 TransactionActionKind type = act->value->type; in qmp_transaction()
2247 "completion-mode = %s", in qmp_transaction()
2263 for (act = actions; act; act = act->next) { in qmp_transaction()
2264 transaction_action(act->value, block_job_txn, tran, &local_err); in qmp_transaction()
2277 /* failure, and it is all-or-none; roll back all operations */ in qmp_transaction()
2303 ret->sha256 = sha256; in qmp_x_debug_block_dirty_bitmap_sha256()
2373 error_setg(errp, "'base' and 'base-node' cannot be specified " in qmp_block_stream()
2385 error_setg(errp, "'bottom' and 'base-node' cannot be specified " in qmp_block_stream()
2435 if (!bottom_bs->drv) { in qmp_block_stream()
2439 if (bottom_bs->drv->is_filter) { in qmp_block_stream()
2440 error_setg(errp, "Node '%s' is a filter, use a non-filter node " in qmp_block_stream()
2540 * live commit feature versions; for this to work, we must make sure to in qmp_block_commit()
2566 error_setg(errp, "'top-node' and 'top' are mutually exclusive"); in qmp_block_commit()
2583 if (strcmp(bs->filename, top) != 0) { in qmp_block_commit()
2596 error_setg(errp, "'base-node' and 'base' are mutually exclusive"); in qmp_block_commit()
2652 error_setg(errp, "'backing-file' specified," in qmp_block_commit()
2655 error_setg(errp, "'backing-file' specified, but 'top' has a " in qmp_block_commit()
2663 * is possible that @bs != @top_bs (the block job should in qmp_block_commit()
2687 /* Common QMP interface for drive-backup and blockdev-backup */
2700 if (!backup->has_speed) { in do_backup_common()
2701 backup->speed = 0; in do_backup_common()
2703 if (!backup->has_on_source_error) { in do_backup_common()
2704 backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT; in do_backup_common()
2706 if (!backup->has_on_target_error) { in do_backup_common()
2707 backup->on_target_error = BLOCKDEV_ON_ERROR_REPORT; in do_backup_common()
2709 if (!backup->has_auto_finalize) { in do_backup_common()
2710 backup->auto_finalize = true; in do_backup_common()
2712 if (!backup->has_auto_dismiss) { in do_backup_common()
2713 backup->auto_dismiss = true; in do_backup_common()
2715 if (!backup->has_compress) { in do_backup_common()
2716 backup->compress = false; in do_backup_common()
2719 if (backup->x_perf) { in do_backup_common()
2720 if (backup->x_perf->has_use_copy_range) { in do_backup_common()
2721 perf.use_copy_range = backup->x_perf->use_copy_range; in do_backup_common()
2723 if (backup->x_perf->has_max_workers) { in do_backup_common()
2724 perf.max_workers = backup->x_perf->max_workers; in do_backup_common()
2726 if (backup->x_perf->has_max_chunk) { in do_backup_common()
2727 perf.max_chunk = backup->x_perf->max_chunk; in do_backup_common()
2729 if (backup->x_perf->has_min_cluster_size) { in do_backup_common()
2730 perf.min_cluster_size = backup->x_perf->min_cluster_size; in do_backup_common()
2734 if ((backup->sync == MIRROR_SYNC_MODE_BITMAP) || in do_backup_common()
2735 (backup->sync == MIRROR_SYNC_MODE_INCREMENTAL)) { in do_backup_common()
2737 if (!backup->bitmap) { in do_backup_common()
2739 "'%s' sync mode", MirrorSyncMode_str(backup->sync)); in do_backup_common()
2744 if (backup->sync == MIRROR_SYNC_MODE_INCREMENTAL) { in do_backup_common()
2745 if (backup->has_bitmap_mode && in do_backup_common()
2746 backup->bitmap_mode != BITMAP_SYNC_MODE_ON_SUCCESS) { in do_backup_common()
2750 MirrorSyncMode_str(backup->sync)); in do_backup_common()
2753 backup->has_bitmap_mode = true; in do_backup_common()
2754 backup->sync = MIRROR_SYNC_MODE_BITMAP; in do_backup_common()
2755 backup->bitmap_mode = BITMAP_SYNC_MODE_ON_SUCCESS; in do_backup_common()
2758 if (backup->bitmap) { in do_backup_common()
2759 bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap); in do_backup_common()
2761 error_setg(errp, "Bitmap '%s' could not be found", backup->bitmap); in do_backup_common()
2764 if (!backup->has_bitmap_mode) { in do_backup_common()
2774 if (backup->sync == MIRROR_SYNC_MODE_NONE) { in do_backup_common()
2776 " outputs", MirrorSyncMode_str(backup->sync)); in do_backup_common()
2781 if (backup->bitmap_mode == BITMAP_SYNC_MODE_NEVER && in do_backup_common()
2782 backup->sync != MIRROR_SYNC_MODE_BITMAP) { in do_backup_common()
2785 BitmapSyncMode_str(backup->bitmap_mode), in do_backup_common()
2786 MirrorSyncMode_str(backup->sync)); in do_backup_common()
2791 if (!backup->bitmap && backup->has_bitmap_mode) { in do_backup_common()
2796 if (!backup->auto_finalize) { in do_backup_common()
2799 if (!backup->auto_dismiss) { in do_backup_common()
2803 if (backup->has_on_cbw_error) { in do_backup_common()
2804 on_cbw_error = backup->on_cbw_error; in do_backup_common()
2807 job = backup_job_create(backup->job_id, bs, target_bs, backup->speed, in do_backup_common()
2808 backup->sync, bmap, backup->bitmap_mode, in do_backup_common()
2809 backup->compress, backup->discard_source, in do_backup_common()
2810 backup->filter_node_name, in do_backup_common()
2812 backup->on_source_error, in do_backup_common()
2813 backup->on_target_error, in do_backup_common()
2853 /* Parameter check and block job starting for drive mirroring.
2915 if (granularity & (granularity - 1)) { in blockdev_mirror_common()
2932 replaces = unfiltered_bs->node_name; in blockdev_mirror_common()
2942 error_setg_errno(errp, -bs_size, "Failed to query device's size"); in blockdev_mirror_common()
2954 error_setg_errno(errp, -replace_size, in blockdev_mirror_common()
2984 const char *format = arg->format; in qmp_drive_mirror()
2988 bs = qmp_get_root_bs(arg->device, errp); in qmp_drive_mirror()
3002 if (!arg->has_mode) { in qmp_drive_mirror()
3003 arg->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS; in qmp_drive_mirror()
3006 if (!arg->format) { in qmp_drive_mirror()
3007 format = (arg->mode == NEW_IMAGE_MODE_EXISTING in qmp_drive_mirror()
3008 ? NULL : bs->drv->format_name); in qmp_drive_mirror()
3011 flags = bs->open_flags | BDRV_O_RDWR; in qmp_drive_mirror()
3013 if (!target_backing_bs && arg->sync == MIRROR_SYNC_MODE_TOP) { in qmp_drive_mirror()
3014 arg->sync = MIRROR_SYNC_MODE_FULL; in qmp_drive_mirror()
3016 if (arg->sync == MIRROR_SYNC_MODE_NONE) { in qmp_drive_mirror()
3023 error_setg_errno(errp, -size, "bdrv_getlength failed"); in qmp_drive_mirror()
3027 if (arg->replaces) { in qmp_drive_mirror()
3028 if (!arg->node_name) { in qmp_drive_mirror()
3029 error_setg(errp, "a node-name must be provided when replacing a" in qmp_drive_mirror()
3035 if (arg->mode == NEW_IMAGE_MODE_ABSOLUTE_PATHS) { in qmp_drive_mirror()
3044 if ((arg->sync == MIRROR_SYNC_MODE_FULL || !target_backing_bs) in qmp_drive_mirror()
3045 && arg->mode != NEW_IMAGE_MODE_EXISTING) in qmp_drive_mirror()
3049 bdrv_img_create(arg->target, format, in qmp_drive_mirror()
3054 switch (arg->mode) { in qmp_drive_mirror()
3067 bdrv_img_create(arg->target, format, in qmp_drive_mirror()
3068 explicit_backing->filename, in qmp_drive_mirror()
3069 explicit_backing->drv->format_name, in qmp_drive_mirror()
3083 if (arg->node_name) { in qmp_drive_mirror()
3084 qdict_put_str(options, "node-name", arg->node_name); in qmp_drive_mirror()
3090 /* Mirroring takes care of copy-on-write using the source's backing in qmp_drive_mirror()
3093 target_bs = bdrv_open(arg->target, NULL, options, flags, errp); in qmp_drive_mirror()
3099 target_is_zero = (arg->mode != NEW_IMAGE_MODE_EXISTING && in qmp_drive_mirror()
3110 blockdev_mirror_common(arg->job_id, bs, target_bs, in qmp_drive_mirror()
3111 arg->replaces, arg->sync, in qmp_drive_mirror()
3113 arg->has_speed, arg->speed, in qmp_drive_mirror()
3114 arg->has_granularity, arg->granularity, in qmp_drive_mirror()
3115 arg->has_buf_size, arg->buf_size, in qmp_drive_mirror()
3116 arg->has_on_source_error, arg->on_source_error, in qmp_drive_mirror()
3117 arg->has_on_target_error, arg->on_target_error, in qmp_drive_mirror()
3118 arg->has_unmap, arg->unmap, in qmp_drive_mirror()
3120 arg->has_copy_mode, arg->copy_mode, in qmp_drive_mirror()
3121 arg->has_auto_finalize, arg->auto_finalize, in qmp_drive_mirror()
3122 arg->has_auto_dismiss, arg->auto_dismiss, in qmp_drive_mirror()
3184 * Get a block job using its ID. Called with job_mutex held.
3196 "Block job '%s' not found", id); in find_block_job_locked()
3233 if (job_user_paused_locked(&job->job) && !force) { in qmp_block_job_cancel()
3234 error_setg(errp, "The block job for device '%s' is currently paused", in qmp_block_job_cancel()
3240 job_user_cancel_locked(&job->job, force, errp); in qmp_block_job_cancel()
3255 job_user_pause_locked(&job->job, errp); in qmp_block_job_pause()
3270 job_user_resume_locked(&job->job, errp); in qmp_block_job_resume()
3285 job_complete_locked(&job->job, errp); in qmp_block_job_complete()
3300 job_ref_locked(&job->job); in qmp_block_job_finalize()
3301 job_finalize_locked(&job->job, errp); in qmp_block_job_finalize()
3303 job_unref_locked(&job->job); in qmp_block_job_finalize()
3319 job = &bjob->job; in qmp_block_job_dismiss()
3328 job = find_block_job_locked(opts->id, errp); in qmp_block_job_change()
3373 * determine if block ops are currently prohibited on the chain */ in qmp_change_backing_file()
3396 image_bs->drv ? image_bs->drv->format_name : "", in qmp_change_backing_file()
3400 error_setg_errno(errp, -ret, "Could not change backing file to '%s'", in qmp_change_backing_file()
3428 if (!qdict_get_try_str(qdict, "node-name")) { in qmp_blockdev_add()
3429 error_setg(errp, "'node-name' must be specified for the root node"); in qmp_blockdev_add()
3449 for (; reopen_list != NULL; reopen_list = reopen_list->next) { in qmp_blockdev_reopen()
3450 BlockdevOptions *options = reopen_list->value; in qmp_blockdev_reopen()
3457 if (!options->node_name) { in qmp_blockdev_reopen()
3458 error_setg(errp, "node-name not specified"); in qmp_blockdev_reopen()
3462 bs = bdrv_find_node(options->node_name); in qmp_blockdev_reopen()
3464 error_setg(errp, "Failed to find node with node-name='%s'", in qmp_blockdev_reopen()
3465 options->node_name); in qmp_blockdev_reopen()
3499 error_setg(errp, "Failed to find node with node-name='%s'", node_name); in qmp_blockdev_del()
3513 bs->node_name); in qmp_blockdev_del()
3517 if (bs->refcnt > 1) { in qmp_blockdev_del()
3518 error_setg(errp, "Block device %s is in use", in qmp_blockdev_del()
3540 error_setg_errno(errp, -ret, "Failed to inactivate all nodes"); in qmp_blockdev_set_active()
3553 error_setg(errp, "Failed to find node with node-name='%s'", in qmp_blockdev_set_active()
3575 QLIST_FOREACH(child, &parent_bs->children, next) { in bdrv_find_child()
3576 if (strcmp(child->name, child_name) == 0) { in bdrv_find_child()
3665 error_setg(errp, "Failed to find node with node-name='%s'", node_name); in qmp_x_blockdev_set_iothread()
3677 if (iothread->type == QTYPE_QSTRING) { in qmp_x_blockdev_set_iothread()
3678 IOThread *obj = iothread_by_id(iothread->u.s); in qmp_x_blockdev_set_iothread()
3680 error_setg(errp, "Cannot find iothread %s", iothread->u.s); in qmp_x_blockdev_set_iothread()
3703 .help = "enable/disable snapshot mode",
3727 .help = "open drive file as read-only",
3735 .help = "name of the block throttling group",
3737 .name = "copy-on-read",
3741 .name = "detect-zeroes",
3745 .name = "stats-account-invalid",
3750 .name = "stats-account-failed",