Lines Matching +full:- +full:- +full:enable +full:- +full:werror
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"
38 #include "block/dirty-bitmap.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"
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()
560 if ((buf = qemu_opt_get(opts, "werror")) != NULL) { 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",
762 .name = "werror",
766 .name = "copy-on-read",
786 const char *werror, *rerror; in drive_new() local
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()
968 qemu_opt_set(devopts, "driver", "virtio-blk", &error_abort); in drive_new()
976 (media == MEDIA_CDROM) ? "xen-cdrom" : "xen-disk", in drive_new()
984 /* Check werror/rerror compatibility with if=... */ in drive_new()
985 werror = qemu_opt_get(legacy_opts, "werror"); in drive_new()
986 if (werror != NULL) { in drive_new()
989 error_setg(errp, "werror is not supported by this bus type"); in drive_new()
992 qdict_put_str(bs_opts, "werror", werror); 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()
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()
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()
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()
1548 if (bdrv_is_inactive(state->old_bs) && !bdrv_is_inactive(state->new_bs)) { in external_snapshot_action()
1549 ret = bdrv_inactivate(state->new_bs, errp); in external_snapshot_action()
1555 ret = bdrv_append(state->new_bs, state->old_bs, errp); in external_snapshot_action()
1559 state->overlay_appended = true; in external_snapshot_action()
1569 if (!qatomic_read(&state->old_bs->copy_on_read)) { in external_snapshot_commit()
1570 bdrv_reopen_set_read_only(state->old_bs, true, NULL); in external_snapshot_commit()
1577 if (state->new_bs) { in external_snapshot_abort()
1578 if (state->overlay_appended) { in external_snapshot_abort()
1583 aio_context = bdrv_get_aio_context(state->old_bs); in external_snapshot_abort()
1585 bdrv_ref(state->old_bs); /* we can't let bdrv_set_backind_hd() in external_snapshot_abort()
1586 close state->old_bs; we need it */ in external_snapshot_abort()
1587 bdrv_set_backing_hd(state->new_bs, NULL, &error_abort); in external_snapshot_abort()
1590 * The call to bdrv_set_backing_hd() above returns state->old_bs to in external_snapshot_abort()
1594 tmp_context = bdrv_get_aio_context(state->old_bs); in external_snapshot_abort()
1596 ret = bdrv_try_change_aio_context(state->old_bs, in external_snapshot_abort()
1601 bdrv_drained_begin(state->new_bs); in external_snapshot_abort()
1603 bdrv_replace_node(state->new_bs, state->old_bs, &error_abort); in external_snapshot_abort()
1605 bdrv_drained_end(state->new_bs); in external_snapshot_abort()
1607 bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_bs */ in external_snapshot_abort()
1616 if (!state->old_bs) { in external_snapshot_clean()
1620 bdrv_drained_end(state->old_bs); in external_snapshot_clean()
1621 bdrv_unref(state->new_bs); in external_snapshot_clean()
1665 if (!backup->has_mode) { in drive_backup_action()
1666 backup->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS; in drive_backup_action()
1669 bs = bdrv_lookup_bs(backup->device, backup->device, errp); in drive_backup_action()
1674 if (!bs->drv) { in drive_backup_action()
1681 state->bs = bs; in drive_backup_action()
1685 format = backup->format; in drive_backup_action()
1686 if (!format && backup->mode != NEW_IMAGE_MODE_EXISTING) { in drive_backup_action()
1687 format = bs->drv->format_name; in drive_backup_action()
1697 flags = bs->open_flags | BDRV_O_RDWR; in drive_backup_action()
1703 if (backup->sync == MIRROR_SYNC_MODE_TOP) { in drive_backup_action()
1712 backup->sync = MIRROR_SYNC_MODE_FULL; in drive_backup_action()
1715 if (backup->sync == MIRROR_SYNC_MODE_NONE) { in drive_backup_action()
1724 error_setg_errno(errp, -size, "bdrv_getlength failed"); in drive_backup_action()
1728 if (backup->mode != NEW_IMAGE_MODE_EXISTING) { in drive_backup_action()
1739 bdrv_img_create(backup->target, format, in drive_backup_action()
1740 explicit_backing->filename, in drive_backup_action()
1741 explicit_backing->drv->format_name, NULL, in drive_backup_action()
1744 bdrv_img_create(backup->target, format, NULL, NULL, NULL, in drive_backup_action()
1756 qdict_put_str(options, "detect-zeroes", "unmap"); in drive_backup_action()
1761 target_bs = bdrv_open(backup->target, NULL, options, flags, errp); in drive_backup_action()
1778 state->job = do_backup_common(qapi_DriveBackup_base(backup), in drive_backup_action()
1790 assert(state->job); in drive_backup_commit()
1791 job_start(&state->job->job); in drive_backup_commit()
1798 if (state->job) { in drive_backup_abort()
1799 job_cancel_sync(&state->job->job, true); in drive_backup_abort()
1807 if (!state->bs) { in drive_backup_clean()
1811 bdrv_drained_end(state->bs); in drive_backup_clean()
1840 bs = bdrv_lookup_bs(backup->device, backup->device, errp); in blockdev_backup_action()
1845 target_bs = bdrv_lookup_bs(backup->target, backup->target, errp); in blockdev_backup_action()
1858 state->bs = bs; in blockdev_backup_action()
1861 bdrv_drained_begin(state->bs); in blockdev_backup_action()
1863 state->job = do_backup_common(qapi_BlockdevBackup_base(backup), in blockdev_backup_action()
1872 assert(state->job); in blockdev_backup_commit()
1873 job_start(&state->job->job); in blockdev_backup_commit()
1880 if (state->job) { in blockdev_backup_abort()
1881 job_cancel_sync(&state->job->job, true); in blockdev_backup_abort()
1889 if (!state->bs) { in blockdev_backup_clean()
1893 bdrv_drained_end(state->bs); in blockdev_backup_clean()
1918 qmp_block_dirty_bitmap_add(action->node, action->name, in block_dirty_bitmap_add_action()
1919 action->has_granularity, action->granularity, in block_dirty_bitmap_add_action()
1920 action->has_persistent, action->persistent, in block_dirty_bitmap_add_action()
1921 action->has_disabled, action->disabled, in block_dirty_bitmap_add_action()
1925 state->bitmap = block_dirty_bitmap_lookup(action->node, action->name, in block_dirty_bitmap_add_action()
1936 if (state->bitmap) { in block_dirty_bitmap_add_abort()
1937 bdrv_release_dirty_bitmap(state->bitmap); in block_dirty_bitmap_add_abort()
1956 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_clear_action()
1957 action->name, in block_dirty_bitmap_clear_action()
1958 &state->bs, in block_dirty_bitmap_clear_action()
1960 if (!state->bitmap) { in block_dirty_bitmap_clear_action()
1964 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_DEFAULT, errp)) { in block_dirty_bitmap_clear_action()
1968 bdrv_clear_dirty_bitmap(state->bitmap, &state->backup); in block_dirty_bitmap_clear_action()
1975 if (state->backup) { in block_dirty_bitmap_restore()
1976 bdrv_restore_dirty_bitmap(state->bitmap, state->backup); in block_dirty_bitmap_restore()
1984 hbitmap_free(state->backup); in block_dirty_bitmap_free_backup()
2000 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_enable_action()
2001 action->name, in block_dirty_bitmap_enable_action()
2004 if (!state->bitmap) { in block_dirty_bitmap_enable_action()
2008 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_ALLOW_RO, errp)) { in block_dirty_bitmap_enable_action()
2012 state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap); in block_dirty_bitmap_enable_action()
2013 bdrv_enable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_enable_action()
2020 if (!state->was_enabled) { in block_dirty_bitmap_enable_abort()
2021 bdrv_disable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_enable_abort()
2038 state->bitmap = block_dirty_bitmap_lookup(action->node, in block_dirty_bitmap_disable_action()
2039 action->name, in block_dirty_bitmap_disable_action()
2042 if (!state->bitmap) { in block_dirty_bitmap_disable_action()
2046 if (bdrv_dirty_bitmap_check(state->bitmap, BDRV_BITMAP_ALLOW_RO, errp)) { in block_dirty_bitmap_disable_action()
2050 state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap); in block_dirty_bitmap_disable_action()
2051 bdrv_disable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_disable_action()
2058 if (state->was_enabled) { in block_dirty_bitmap_disable_abort()
2059 bdrv_enable_dirty_bitmap(state->bitmap); in block_dirty_bitmap_disable_abort()
2076 state->bitmap = block_dirty_bitmap_merge(action->node, action->target, in block_dirty_bitmap_merge_action()
2077 action->bitmaps, &state->backup, in block_dirty_bitmap_merge_action()
2097 state->bitmap = block_dirty_bitmap_remove(action->node, action->name, in block_dirty_bitmap_remove_action()
2098 false, &state->bs, errp); in block_dirty_bitmap_remove_action()
2099 if (state->bitmap) { in block_dirty_bitmap_remove_action()
2100 bdrv_dirty_bitmap_skip_store(state->bitmap, true); in block_dirty_bitmap_remove_action()
2101 bdrv_dirty_bitmap_set_busy(state->bitmap, true); in block_dirty_bitmap_remove_action()
2109 if (state->bitmap) { in block_dirty_bitmap_remove_abort()
2110 bdrv_dirty_bitmap_skip_store(state->bitmap, false); in block_dirty_bitmap_remove_abort()
2111 bdrv_dirty_bitmap_set_busy(state->bitmap, false); in block_dirty_bitmap_remove_abort()
2119 bdrv_dirty_bitmap_set_busy(state->bitmap, false); in block_dirty_bitmap_remove_commit()
2120 bdrv_release_dirty_bitmap(state->bitmap); in block_dirty_bitmap_remove_commit()
2142 switch (act->type) { in transaction_action()
2148 drive_backup_action(act->u.drive_backup.data, in transaction_action()
2152 blockdev_backup_action(act->u.blockdev_backup.data, in transaction_action()
2159 internal_snapshot_action(act->u.blockdev_snapshot_internal_sync.data, in transaction_action()
2163 block_dirty_bitmap_add_action(act->u.block_dirty_bitmap_add.data, in transaction_action()
2167 block_dirty_bitmap_clear_action(act->u.block_dirty_bitmap_clear.data, in transaction_action()
2171 block_dirty_bitmap_enable_action(act->u.block_dirty_bitmap_enable.data, in transaction_action()
2176 act->u.block_dirty_bitmap_disable.data, tran, errp); in transaction_action()
2179 block_dirty_bitmap_merge_action(act->u.block_dirty_bitmap_merge.data, in transaction_action()
2183 block_dirty_bitmap_remove_action(act->u.block_dirty_bitmap_remove.data, in transaction_action()
2215 properties ? properties->completion_mode : in qmp_transaction()
2224 for (act = actions; act; act = act->next) { in qmp_transaction()
2225 TransactionActionKind type = act->value->type; in qmp_transaction()
2232 "completion-mode = %s", in qmp_transaction()
2248 for (act = actions; act; act = act->next) { in qmp_transaction()
2249 transaction_action(act->value, block_job_txn, tran, &local_err); in qmp_transaction()
2262 /* failure, and it is all-or-none; roll back all operations */ in qmp_transaction()
2288 ret->sha256 = sha256; in qmp_x_debug_block_dirty_bitmap_sha256()
2358 error_setg(errp, "'base' and 'base-node' cannot be specified " in qmp_block_stream()
2370 error_setg(errp, "'bottom' and 'base-node' cannot be specified " in qmp_block_stream()
2420 if (!bottom_bs->drv) { in qmp_block_stream()
2424 if (bottom_bs->drv->is_filter) { in qmp_block_stream()
2425 error_setg(errp, "Node '%s' is a filter, use a non-filter node " in qmp_block_stream()
2551 error_setg(errp, "'top-node' and 'top' are mutually exclusive"); in qmp_block_commit()
2568 if (strcmp(bs->filename, top) != 0) { in qmp_block_commit()
2581 error_setg(errp, "'base-node' and 'base' are mutually exclusive"); in qmp_block_commit()
2637 error_setg(errp, "'backing-file' specified," in qmp_block_commit()
2640 error_setg(errp, "'backing-file' specified, but 'top' has a " in qmp_block_commit()
2672 /* Common QMP interface for drive-backup and blockdev-backup */
2685 if (!backup->has_speed) { in do_backup_common()
2686 backup->speed = 0; in do_backup_common()
2688 if (!backup->has_on_source_error) { in do_backup_common()
2689 backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT; in do_backup_common()
2691 if (!backup->has_on_target_error) { in do_backup_common()
2692 backup->on_target_error = BLOCKDEV_ON_ERROR_REPORT; in do_backup_common()
2694 if (!backup->has_auto_finalize) { in do_backup_common()
2695 backup->auto_finalize = true; in do_backup_common()
2697 if (!backup->has_auto_dismiss) { in do_backup_common()
2698 backup->auto_dismiss = true; in do_backup_common()
2700 if (!backup->has_compress) { in do_backup_common()
2701 backup->compress = false; in do_backup_common()
2704 if (backup->x_perf) { in do_backup_common()
2705 if (backup->x_perf->has_use_copy_range) { in do_backup_common()
2706 perf.use_copy_range = backup->x_perf->use_copy_range; in do_backup_common()
2708 if (backup->x_perf->has_max_workers) { in do_backup_common()
2709 perf.max_workers = backup->x_perf->max_workers; in do_backup_common()
2711 if (backup->x_perf->has_max_chunk) { in do_backup_common()
2712 perf.max_chunk = backup->x_perf->max_chunk; in do_backup_common()
2714 if (backup->x_perf->has_min_cluster_size) { in do_backup_common()
2715 perf.min_cluster_size = backup->x_perf->min_cluster_size; in do_backup_common()
2719 if ((backup->sync == MIRROR_SYNC_MODE_BITMAP) || in do_backup_common()
2720 (backup->sync == MIRROR_SYNC_MODE_INCREMENTAL)) { in do_backup_common()
2722 if (!backup->bitmap) { in do_backup_common()
2724 "'%s' sync mode", MirrorSyncMode_str(backup->sync)); in do_backup_common()
2729 if (backup->sync == MIRROR_SYNC_MODE_INCREMENTAL) { in do_backup_common()
2730 if (backup->has_bitmap_mode && in do_backup_common()
2731 backup->bitmap_mode != BITMAP_SYNC_MODE_ON_SUCCESS) { in do_backup_common()
2735 MirrorSyncMode_str(backup->sync)); in do_backup_common()
2738 backup->has_bitmap_mode = true; in do_backup_common()
2739 backup->sync = MIRROR_SYNC_MODE_BITMAP; in do_backup_common()
2740 backup->bitmap_mode = BITMAP_SYNC_MODE_ON_SUCCESS; in do_backup_common()
2743 if (backup->bitmap) { in do_backup_common()
2744 bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap); in do_backup_common()
2746 error_setg(errp, "Bitmap '%s' could not be found", backup->bitmap); in do_backup_common()
2749 if (!backup->has_bitmap_mode) { in do_backup_common()
2759 if (backup->sync == MIRROR_SYNC_MODE_NONE) { in do_backup_common()
2761 " outputs", MirrorSyncMode_str(backup->sync)); in do_backup_common()
2766 if (backup->bitmap_mode == BITMAP_SYNC_MODE_NEVER && in do_backup_common()
2767 backup->sync != MIRROR_SYNC_MODE_BITMAP) { in do_backup_common()
2770 BitmapSyncMode_str(backup->bitmap_mode), in do_backup_common()
2771 MirrorSyncMode_str(backup->sync)); in do_backup_common()
2776 if (!backup->bitmap && backup->has_bitmap_mode) { in do_backup_common()
2781 if (!backup->auto_finalize) { in do_backup_common()
2784 if (!backup->auto_dismiss) { in do_backup_common()
2788 if (backup->has_on_cbw_error) { in do_backup_common()
2789 on_cbw_error = backup->on_cbw_error; in do_backup_common()
2792 job = backup_job_create(backup->job_id, bs, target_bs, backup->speed, in do_backup_common()
2793 backup->sync, bmap, backup->bitmap_mode, in do_backup_common()
2794 backup->compress, backup->discard_source, in do_backup_common()
2795 backup->filter_node_name, in do_backup_common()
2797 backup->on_source_error, in do_backup_common()
2798 backup->on_target_error, in do_backup_common()
2900 if (granularity & (granularity - 1)) { in blockdev_mirror_common()
2917 replaces = unfiltered_bs->node_name; in blockdev_mirror_common()
2927 error_setg_errno(errp, -bs_size, "Failed to query device's size"); in blockdev_mirror_common()
2939 error_setg_errno(errp, -replace_size, in blockdev_mirror_common()
2969 const char *format = arg->format; in qmp_drive_mirror()
2973 bs = qmp_get_root_bs(arg->device, errp); in qmp_drive_mirror()
2987 if (!arg->has_mode) { in qmp_drive_mirror()
2988 arg->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS; in qmp_drive_mirror()
2991 if (!arg->format) { in qmp_drive_mirror()
2992 format = (arg->mode == NEW_IMAGE_MODE_EXISTING in qmp_drive_mirror()
2993 ? NULL : bs->drv->format_name); in qmp_drive_mirror()
2996 flags = bs->open_flags | BDRV_O_RDWR; in qmp_drive_mirror()
2998 if (!target_backing_bs && arg->sync == MIRROR_SYNC_MODE_TOP) { in qmp_drive_mirror()
2999 arg->sync = MIRROR_SYNC_MODE_FULL; in qmp_drive_mirror()
3001 if (arg->sync == MIRROR_SYNC_MODE_NONE) { in qmp_drive_mirror()
3008 error_setg_errno(errp, -size, "bdrv_getlength failed"); in qmp_drive_mirror()
3012 if (arg->replaces) { in qmp_drive_mirror()
3013 if (!arg->node_name) { in qmp_drive_mirror()
3014 error_setg(errp, "a node-name must be provided when replacing a" in qmp_drive_mirror()
3020 if (arg->mode == NEW_IMAGE_MODE_ABSOLUTE_PATHS) { in qmp_drive_mirror()
3029 if ((arg->sync == MIRROR_SYNC_MODE_FULL || !target_backing_bs) in qmp_drive_mirror()
3030 && arg->mode != NEW_IMAGE_MODE_EXISTING) in qmp_drive_mirror()
3034 bdrv_img_create(arg->target, format, in qmp_drive_mirror()
3039 switch (arg->mode) { in qmp_drive_mirror()
3052 bdrv_img_create(arg->target, format, in qmp_drive_mirror()
3053 explicit_backing->filename, in qmp_drive_mirror()
3054 explicit_backing->drv->format_name, in qmp_drive_mirror()
3068 if (arg->node_name) { in qmp_drive_mirror()
3069 qdict_put_str(options, "node-name", arg->node_name); in qmp_drive_mirror()
3075 /* Mirroring takes care of copy-on-write using the source's backing in qmp_drive_mirror()
3078 target_bs = bdrv_open(arg->target, NULL, options, flags, errp); in qmp_drive_mirror()
3084 target_is_zero = (arg->mode != NEW_IMAGE_MODE_EXISTING && in qmp_drive_mirror()
3095 blockdev_mirror_common(arg->job_id, bs, target_bs, in qmp_drive_mirror()
3096 arg->replaces, arg->sync, in qmp_drive_mirror()
3098 arg->has_speed, arg->speed, in qmp_drive_mirror()
3099 arg->has_granularity, arg->granularity, in qmp_drive_mirror()
3100 arg->has_buf_size, arg->buf_size, in qmp_drive_mirror()
3101 arg->has_on_source_error, arg->on_source_error, in qmp_drive_mirror()
3102 arg->has_on_target_error, arg->on_target_error, in qmp_drive_mirror()
3103 arg->has_unmap, arg->unmap, in qmp_drive_mirror()
3105 arg->has_copy_mode, arg->copy_mode, in qmp_drive_mirror()
3106 arg->has_auto_finalize, arg->auto_finalize, in qmp_drive_mirror()
3107 arg->has_auto_dismiss, arg->auto_dismiss, in qmp_drive_mirror()
3218 if (job_user_paused_locked(&job->job) && !force) { in qmp_block_job_cancel()
3225 job_user_cancel_locked(&job->job, force, errp); in qmp_block_job_cancel()
3240 job_user_pause_locked(&job->job, errp); in qmp_block_job_pause()
3255 job_user_resume_locked(&job->job, errp); in qmp_block_job_resume()
3270 job_complete_locked(&job->job, errp); in qmp_block_job_complete()
3285 job_ref_locked(&job->job); in qmp_block_job_finalize()
3286 job_finalize_locked(&job->job, errp); in qmp_block_job_finalize()
3288 job_unref_locked(&job->job); in qmp_block_job_finalize()
3304 job = &bjob->job; in qmp_block_job_dismiss()
3313 job = find_block_job_locked(opts->id, errp); in qmp_block_job_change()
3381 image_bs->drv ? image_bs->drv->format_name : "", in qmp_change_backing_file()
3385 error_setg_errno(errp, -ret, "Could not change backing file to '%s'", in qmp_change_backing_file()
3413 if (!qdict_get_try_str(qdict, "node-name")) { in qmp_blockdev_add()
3414 error_setg(errp, "'node-name' must be specified for the root node"); in qmp_blockdev_add()
3434 for (; reopen_list != NULL; reopen_list = reopen_list->next) { in qmp_blockdev_reopen()
3435 BlockdevOptions *options = reopen_list->value; in qmp_blockdev_reopen()
3442 if (!options->node_name) { in qmp_blockdev_reopen()
3443 error_setg(errp, "node-name not specified"); in qmp_blockdev_reopen()
3447 bs = bdrv_find_node(options->node_name); in qmp_blockdev_reopen()
3449 error_setg(errp, "Failed to find node with node-name='%s'", in qmp_blockdev_reopen()
3450 options->node_name); in qmp_blockdev_reopen()
3484 error_setg(errp, "Failed to find node with node-name='%s'", node_name); in qmp_blockdev_del()
3498 bs->node_name); in qmp_blockdev_del()
3502 if (bs->refcnt > 1) { in qmp_blockdev_del()
3525 error_setg_errno(errp, -ret, "Failed to inactivate all nodes"); in qmp_blockdev_set_active()
3531 error_setg(errp, "Failed to find node with node-name='%s'", in qmp_blockdev_set_active()
3549 QLIST_FOREACH(child, &parent_bs->children, next) { in bdrv_find_child()
3550 if (strcmp(child->name, child_name) == 0) { in bdrv_find_child()
3641 error_setg(errp, "Failed to find node with node-name='%s'", node_name); in qmp_x_blockdev_set_iothread()
3653 if (iothread->type == QTYPE_QSTRING) { in qmp_x_blockdev_set_iothread()
3654 IOThread *obj = iothread_by_id(iothread->u.s); in qmp_x_blockdev_set_iothread()
3656 error_setg(errp, "Cannot find iothread %s", iothread->u.s); in qmp_x_blockdev_set_iothread()
3679 .help = "enable/disable snapshot mode",
3687 .help = "Enable writeback mode",
3697 .name = "werror",
3703 .help = "open drive file as read-only",
3713 .name = "copy-on-read",
3717 .name = "detect-zeroes",
3721 .name = "stats-account-invalid",
3726 .name = "stats-account-failed",