blockdev.c 123.7 KB
Newer Older
1 2 3 4 5 6 7
/*
 * QEMU host block devices
 *
 * Copyright (c) 2003-2008 Fabrice Bellard
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or
 * later.  See the COPYING file in the top-level directory.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 *
 * This file incorporates work covered by the following copyright and
 * permission notice:
 *
 * Copyright (c) 2003-2008 Fabrice Bellard
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
31 32
 */

P
Peter Maydell 已提交
33
#include "qemu/osdep.h"
M
Markus Armbruster 已提交
34
#include "sysemu/block-backend.h"
35
#include "sysemu/blockdev.h"
P
Paolo Bonzini 已提交
36
#include "hw/block/block.h"
37
#include "block/blockjob.h"
38
#include "block/throttle-groups.h"
39
#include "monitor/monitor.h"
40
#include "qemu/error-report.h"
41 42
#include "qemu/option.h"
#include "qemu/config-file.h"
43 44 45
#include "qapi/qapi-commands-block.h"
#include "qapi/qapi-commands-transaction.h"
#include "qapi/qapi-visit-block-core.h"
46
#include "qapi/qmp/qdict.h"
47
#include "qapi/qmp/qnum.h"
M
Markus Armbruster 已提交
48
#include "qapi/qmp/qstring.h"
49
#include "qapi/error.h"
50
#include "qapi/qmp/qerror.h"
51
#include "qapi/qmp/qlist.h"
52
#include "qapi/qobject-output-visitor.h"
53
#include "sysemu/sysemu.h"
54
#include "sysemu/iothread.h"
55
#include "block/block_int.h"
56
#include "block/trace.h"
57
#include "sysemu/arch_init.h"
58
#include "sysemu/qtest.h"
59 60
#include "qemu/cutils.h"
#include "qemu/help_option.h"
61
#include "qemu/throttle-options.h"
62

63 64 65
static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =
    QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states);

66 67
static int do_open_tray(const char *blk_name, const char *qdev_id,
                        bool force, Error **errp);
68 69 70 71 72
static void blockdev_remove_medium(bool has_device, const char *device,
                                   bool has_id, const char *id, Error **errp);
static void blockdev_insert_medium(bool has_device, const char *device,
                                   bool has_id, const char *id,
                                   const char *node_name, Error **errp);
73

74 75 76 77 78 79 80 81 82 83 84 85
static const char *const if_name[IF_COUNT] = {
    [IF_NONE] = "none",
    [IF_IDE] = "ide",
    [IF_SCSI] = "scsi",
    [IF_FLOPPY] = "floppy",
    [IF_PFLASH] = "pflash",
    [IF_MTD] = "mtd",
    [IF_SD] = "sd",
    [IF_VIRTIO] = "virtio",
    [IF_XEN] = "xen",
};

86
static int if_max_devs[IF_COUNT] = {
87 88 89 90
    /*
     * Do not change these numbers!  They govern how drive option
     * index maps to unit and bus.  That mapping is ABI.
     *
W
Wei Jiangang 已提交
91
     * All controllers used to implement if=T drives need to support
92 93 94 95 96 97 98 99 100 101 102
     * if_max_devs[T] units, for any T with if_max_devs[T] != 0.
     * Otherwise, some index values map to "impossible" bus, unit
     * values.
     *
     * For instance, if you change [IF_SCSI] to 255, -drive
     * if=scsi,index=12 no longer means bus=1,unit=5, but
     * bus=0,unit=12.  With an lsi53c895a controller (7 units max),
     * the drive can't be set up.  Regression.
     */
    [IF_IDE] = 2,
    [IF_SCSI] = 7,
103 104
};

105 106 107 108 109 110
/**
 * Boards may call this to offer board-by-board overrides
 * of the default, global values.
 */
void override_max_devs(BlockInterfaceType type, int max_devs)
{
111
    BlockBackend *blk;
112 113 114 115 116 117
    DriveInfo *dinfo;

    if (max_devs <= 0) {
        return;
    }

118 119
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
120 121 122 123 124 125 126 127 128 129 130
        if (dinfo->type == type) {
            fprintf(stderr, "Cannot override units-per-bus property of"
                    " the %s interface, because a drive of that type has"
                    " already been added.\n", if_name[type]);
            g_assert_not_reached();
        }
    }

    if_max_devs[type] = max_devs;
}

131 132 133 134 135 136 137
/*
 * We automatically delete the drive when a device using it gets
 * unplugged.  Questionable feature, but we can't just drop it.
 * Device models call blockdev_mark_auto_del() to schedule the
 * automatic deletion, and generic qdev code calls blockdev_auto_del()
 * when deletion is actually safe.
 */
138
void blockdev_mark_auto_del(BlockBackend *blk)
139
{
140
    DriveInfo *dinfo = blk_legacy_dinfo(blk);
141
    BlockDriverState *bs = blk_bs(blk);
142
    AioContext *aio_context;
143

144
    if (!dinfo) {
145 146 147
        return;
    }

M
Max Reitz 已提交
148 149 150
    if (bs) {
        aio_context = bdrv_get_aio_context(bs);
        aio_context_acquire(aio_context);
151

M
Max Reitz 已提交
152 153 154
        if (bs->job) {
            block_job_cancel(bs->job);
        }
155

M
Max Reitz 已提交
156 157
        aio_context_release(aio_context);
    }
158

159
    dinfo->auto_del = 1;
160 161
}

162
void blockdev_auto_del(BlockBackend *blk)
163
{
164
    DriveInfo *dinfo = blk_legacy_dinfo(blk);
165

166
    if (dinfo && dinfo->auto_del) {
167
        monitor_remove_blk(blk);
168
        blk_unref(blk);
169 170 171
    }
}

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
/**
 * Returns the current mapping of how many units per bus
 * a particular interface can support.
 *
 *  A positive integer indicates n units per bus.
 *  0 implies the mapping has not been established.
 * -1 indicates an invalid BlockInterfaceType was given.
 */
int drive_get_max_devs(BlockInterfaceType type)
{
    if (type >= IF_IDE && type < IF_COUNT) {
        return if_max_devs[type];
    }

    return -1;
}

189 190 191 192 193 194 195 196 197 198 199 200
static int drive_index_to_bus_id(BlockInterfaceType type, int index)
{
    int max_devs = if_max_devs[type];
    return max_devs ? index / max_devs : 0;
}

static int drive_index_to_unit_id(BlockInterfaceType type, int index)
{
    int max_devs = if_max_devs[type];
    return max_devs ? index % max_devs : index;
}

201 202
QemuOpts *drive_def(const char *optstr)
{
203
    return qemu_opts_parse_noisily(qemu_find_opts("drive"), optstr, false);
204 205 206
}

QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
207
                    const char *optstr)
208 209 210
{
    QemuOpts *opts;

211
    opts = drive_def(optstr);
212 213 214
    if (!opts) {
        return NULL;
    }
215
    if (type != IF_DEFAULT) {
216
        qemu_opt_set(opts, "if", if_name[type], &error_abort);
217 218
    }
    if (index >= 0) {
219
        qemu_opt_set_number(opts, "index", index, &error_abort);
220
    }
221
    if (file)
222
        qemu_opt_set(opts, "file", file, &error_abort);
223 224 225 226 227
    return opts;
}

DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
{
228
    BlockBackend *blk;
229 230
    DriveInfo *dinfo;

231 232 233 234
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
        if (dinfo && dinfo->type == type
            && dinfo->bus == bus && dinfo->unit == unit) {
235
            return dinfo;
236
        }
237 238 239 240 241
    }

    return NULL;
}

242
void drive_check_orphaned(void)
J
John Snow 已提交
243
{
244
    BlockBackend *blk;
J
John Snow 已提交
245
    DriveInfo *dinfo;
246
    Location loc;
247
    bool orphans = false;
J
John Snow 已提交
248

249 250
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
251
        if (!blk_get_attached_dev(blk) && !dinfo->is_default &&
J
John Snow 已提交
252
            dinfo->type != IF_NONE) {
253 254
            loc_push_none(&loc);
            qemu_opts_loc_restore(dinfo->opts);
255
            error_report("machine type does not support"
256 257 258
                         " if=%s,bus=%d,unit=%d",
                         if_name[dinfo->type], dinfo->bus, dinfo->unit);
            loc_pop(&loc);
259
            orphans = true;
J
John Snow 已提交
260 261 262
        }
    }

263 264 265
    if (orphans) {
        exit(1);
    }
J
John Snow 已提交
266 267
}

268 269 270 271 272 273 274
DriveInfo *drive_get_by_index(BlockInterfaceType type, int index)
{
    return drive_get(type,
                     drive_index_to_bus_id(type, index),
                     drive_index_to_unit_id(type, index));
}

275 276 277
int drive_get_max_bus(BlockInterfaceType type)
{
    int max_bus;
278
    BlockBackend *blk;
279 280 281
    DriveInfo *dinfo;

    max_bus = -1;
282 283 284
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
        if (dinfo && dinfo->type == type && dinfo->bus > max_bus) {
285
            max_bus = dinfo->bus;
286
        }
287 288 289 290
    }
    return max_bus;
}

291 292 293 294 295 296 297 298 299 300
/* Get a block device.  This should only be used for single-drive devices
   (e.g. SD/Floppy/MTD).  Multi-disk devices (scsi/ide) should use the
   appropriate bus.  */
DriveInfo *drive_get_next(BlockInterfaceType type)
{
    static int next_block_unit[IF_COUNT];

    return drive_get(type, 0, next_block_unit[type]++);
}

301 302
static void bdrv_format_print(void *opaque, const char *name)
{
303
    error_printf(" %s", name);
304 305
}

306 307
typedef struct {
    QEMUBH *bh;
F
Fam Zheng 已提交
308 309
    BlockDriverState *bs;
} BDRVPutRefBH;
310

311
static int parse_block_error_action(const char *buf, bool is_read, Error **errp)
312 313
{
    if (!strcmp(buf, "ignore")) {
314
        return BLOCKDEV_ON_ERROR_IGNORE;
315
    } else if (!is_read && !strcmp(buf, "enospc")) {
316
        return BLOCKDEV_ON_ERROR_ENOSPC;
317
    } else if (!strcmp(buf, "stop")) {
318
        return BLOCKDEV_ON_ERROR_STOP;
319
    } else if (!strcmp(buf, "report")) {
320
        return BLOCKDEV_ON_ERROR_REPORT;
321
    } else {
322 323
        error_setg(errp, "'%s' invalid %s error action",
                   buf, is_read ? "read" : "write");
324 325 326 327
        return -1;
    }
}

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
static bool parse_stats_intervals(BlockAcctStats *stats, QList *intervals,
                                  Error **errp)
{
    const QListEntry *entry;
    for (entry = qlist_first(intervals); entry; entry = qlist_next(entry)) {
        switch (qobject_type(entry->value)) {

        case QTYPE_QSTRING: {
            unsigned long long length;
            const char *str = qstring_get_str(qobject_to_qstring(entry->value));
            if (parse_uint_full(str, &length, 10) == 0 &&
                length > 0 && length <= UINT_MAX) {
                block_acct_add_interval(stats, (unsigned) length);
            } else {
                error_setg(errp, "Invalid interval length: %s", str);
                return false;
            }
            break;
        }

348 349 350
        case QTYPE_QNUM: {
            int64_t length = qnum_get_int(qobject_to_qnum(entry->value));

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
            if (length > 0 && length <= UINT_MAX) {
                block_acct_add_interval(stats, (unsigned) length);
            } else {
                error_setg(errp, "Invalid interval length: %" PRId64, length);
                return false;
            }
            break;
        }

        default:
            error_setg(errp, "The specification of stats-intervals is invalid");
            return false;
        }
    }
    return true;
}

368 369
typedef enum { MEDIA_DISK, MEDIA_CDROM } DriveMediaType;

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
/* All parameters but @opts are optional and may be set to NULL. */
static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,
    const char **throttling_group, ThrottleConfig *throttle_cfg,
    BlockdevDetectZeroesOptions *detect_zeroes, Error **errp)
{
    Error *local_error = NULL;
    const char *aio;

    if (bdrv_flags) {
        if (qemu_opt_get_bool(opts, "copy-on-read", false)) {
            *bdrv_flags |= BDRV_O_COPY_ON_READ;
        }

        if ((aio = qemu_opt_get(opts, "aio")) != NULL) {
            if (!strcmp(aio, "native")) {
                *bdrv_flags |= BDRV_O_NATIVE_AIO;
            } else if (!strcmp(aio, "threads")) {
                /* this is the default */
            } else {
               error_setg(errp, "invalid aio option");
               return;
            }
        }
    }

    /* disk I/O throttling */
    if (throttling_group) {
        *throttling_group = qemu_opt_get(opts, "throttling.group");
    }

    if (throttle_cfg) {
401
        throttle_config_init(throttle_cfg);
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
        throttle_cfg->buckets[THROTTLE_BPS_TOTAL].avg =
            qemu_opt_get_number(opts, "throttling.bps-total", 0);
        throttle_cfg->buckets[THROTTLE_BPS_READ].avg  =
            qemu_opt_get_number(opts, "throttling.bps-read", 0);
        throttle_cfg->buckets[THROTTLE_BPS_WRITE].avg =
            qemu_opt_get_number(opts, "throttling.bps-write", 0);
        throttle_cfg->buckets[THROTTLE_OPS_TOTAL].avg =
            qemu_opt_get_number(opts, "throttling.iops-total", 0);
        throttle_cfg->buckets[THROTTLE_OPS_READ].avg =
            qemu_opt_get_number(opts, "throttling.iops-read", 0);
        throttle_cfg->buckets[THROTTLE_OPS_WRITE].avg =
            qemu_opt_get_number(opts, "throttling.iops-write", 0);

        throttle_cfg->buckets[THROTTLE_BPS_TOTAL].max =
            qemu_opt_get_number(opts, "throttling.bps-total-max", 0);
        throttle_cfg->buckets[THROTTLE_BPS_READ].max  =
            qemu_opt_get_number(opts, "throttling.bps-read-max", 0);
        throttle_cfg->buckets[THROTTLE_BPS_WRITE].max =
            qemu_opt_get_number(opts, "throttling.bps-write-max", 0);
        throttle_cfg->buckets[THROTTLE_OPS_TOTAL].max =
            qemu_opt_get_number(opts, "throttling.iops-total-max", 0);
        throttle_cfg->buckets[THROTTLE_OPS_READ].max =
            qemu_opt_get_number(opts, "throttling.iops-read-max", 0);
        throttle_cfg->buckets[THROTTLE_OPS_WRITE].max =
            qemu_opt_get_number(opts, "throttling.iops-write-max", 0);

428 429 430 431 432 433 434 435 436 437 438 439 440
        throttle_cfg->buckets[THROTTLE_BPS_TOTAL].burst_length =
            qemu_opt_get_number(opts, "throttling.bps-total-max-length", 1);
        throttle_cfg->buckets[THROTTLE_BPS_READ].burst_length  =
            qemu_opt_get_number(opts, "throttling.bps-read-max-length", 1);
        throttle_cfg->buckets[THROTTLE_BPS_WRITE].burst_length =
            qemu_opt_get_number(opts, "throttling.bps-write-max-length", 1);
        throttle_cfg->buckets[THROTTLE_OPS_TOTAL].burst_length =
            qemu_opt_get_number(opts, "throttling.iops-total-max-length", 1);
        throttle_cfg->buckets[THROTTLE_OPS_READ].burst_length =
            qemu_opt_get_number(opts, "throttling.iops-read-max-length", 1);
        throttle_cfg->buckets[THROTTLE_OPS_WRITE].burst_length =
            qemu_opt_get_number(opts, "throttling.iops-write-max-length", 1);

441 442 443
        throttle_cfg->op_size =
            qemu_opt_get_number(opts, "throttling.iops-size", 0);

444
        if (!throttle_is_valid(throttle_cfg, errp)) {
445 446 447 448 449 450
            return;
        }
    }

    if (detect_zeroes) {
        *detect_zeroes =
451
            qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
452 453 454 455 456 457 458 459 460 461
                            qemu_opt_get(opts, "detect-zeroes"),
                            BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                            &local_error);
        if (local_error) {
            error_propagate(errp, local_error);
            return;
        }
    }
}

462
/* Takes the ownership of bs_opts */
463 464
static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
                                   Error **errp)
465 466 467 468
{
    const char *buf;
    int bdrv_flags = 0;
    int on_read_error, on_write_error;
469
    bool account_invalid, account_failed;
470
    bool writethrough, read_only;
M
Markus Armbruster 已提交
471
    BlockBackend *blk;
472
    BlockDriverState *bs;
473
    ThrottleConfig cfg;
474
    int snapshot = 0;
475
    Error *error = NULL;
476
    QemuOpts *opts;
477 478
    QDict *interval_dict = NULL;
    QList *interval_list = NULL;
479
    const char *id;
480 481 482
    BlockdevDetectZeroesOptions detect_zeroes =
        BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF;
    const char *throttling_group = NULL;
483

484 485 486
    /* Check common options by copying from bs_opts to opts, all other options
     * stay in bs_opts for processing by bdrv_open(). */
    id = qdict_get_try_str(bs_opts, "id");
487
    opts = qemu_opts_create(&qemu_common_drive_opts, id, 1, &error);
488
    if (error) {
489
        error_propagate(errp, error);
490
        goto err_no_opts;
491 492 493
    }

    qemu_opts_absorb_qdict(opts, bs_opts, &error);
494
    if (error) {
495
        error_propagate(errp, error);
496
        goto early_err;
497 498 499 500 501 502
    }

    if (id) {
        qdict_del(bs_opts, "id");
    }

503 504 505
    /* extract parameters */
    snapshot = qemu_opt_get_bool(opts, "snapshot", 0);

506 507 508
    account_invalid = qemu_opt_get_bool(opts, "stats-account-invalid", true);
    account_failed = qemu_opt_get_bool(opts, "stats-account-failed", true);

509 510
    writethrough = !qemu_opt_get_bool(opts, BDRV_OPT_CACHE_WB, true);

511 512
    id = qemu_opts_id(opts);

513 514 515 516 517 518 519 520
    qdict_extract_subqdict(bs_opts, &interval_dict, "stats-intervals.");
    qdict_array_split(interval_dict, &interval_list);

    if (qdict_size(interval_dict) != 0) {
        error_setg(errp, "Invalid option stats-intervals.%s",
                   qdict_first(interval_dict)->key);
        goto early_err;
    }
521

522 523 524 525 526
    extract_common_blockdev_options(opts, &bdrv_flags, &throttling_group, &cfg,
                                    &detect_zeroes, &error);
    if (error) {
        error_propagate(errp, error);
        goto early_err;
527 528 529
    }

    if ((buf = qemu_opt_get(opts, "format")) != NULL) {
530 531 532 533
        if (is_help_option(buf)) {
            error_printf("Supported formats:");
            bdrv_iterate_format(bdrv_format_print, NULL);
            error_printf("\n");
534
            goto early_err;
535
        }
536

537 538
        if (qdict_haskey(bs_opts, "driver")) {
            error_setg(errp, "Cannot specify both 'driver' and 'format'");
539
            goto early_err;
540
        }
541
        qdict_put_str(bs_opts, "driver", buf);
542 543
    }

544
    on_write_error = BLOCKDEV_ON_ERROR_ENOSPC;
545
    if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
546
        on_write_error = parse_block_error_action(buf, 0, &error);
547
        if (error) {
548
            error_propagate(errp, error);
549
            goto early_err;
550 551 552
        }
    }

553
    on_read_error = BLOCKDEV_ON_ERROR_REPORT;
554
    if ((buf = qemu_opt_get(opts, "rerror")) != NULL) {
555
        on_read_error = parse_block_error_action(buf, 1, &error);
556
        if (error) {
557
            error_propagate(errp, error);
558
            goto early_err;
559 560 561
        }
    }

562
    if (snapshot) {
563
        bdrv_flags |= BDRV_O_SNAPSHOT;
564 565
    }

566 567
    read_only = qemu_opt_get_bool(opts, BDRV_OPT_READ_ONLY, false);

568
    /* init */
569
    if ((!file || !*file) && !qdict_size(bs_opts)) {
570 571
        BlockBackendRootState *blk_rs;

K
Kevin Wolf 已提交
572
        blk = blk_new(0, BLK_PERM_ALL);
573 574
        blk_rs = blk_get_root_state(blk);
        blk_rs->open_flags    = bdrv_flags;
575
        blk_rs->read_only     = read_only;
576 577
        blk_rs->detect_zeroes = detect_zeroes;

578 579 580
        QDECREF(bs_opts);
    } else {
        if (file && !*file) {
581 582
            file = NULL;
        }
583

584 585 586 587 588
        /* bdrv_open() defaults to the values in bdrv_flags (for compatibility
         * with other callers) rather than what we want as the real defaults.
         * Apply the defaults here instead. */
        qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_DIRECT, "off");
        qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_NO_FLUSH, "off");
589 590
        qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY,
                              read_only ? "on" : "off");
591
        assert((bdrv_flags & BDRV_O_CACHE_MASK) == 0);
592

593 594 595 596
        if (runstate_check(RUN_STATE_INMIGRATE)) {
            bdrv_flags |= BDRV_O_INACTIVE;
        }

597
        blk = blk_new_open(file, NULL, bs_opts, bdrv_flags, errp);
598 599 600 601
        if (!blk) {
            goto err_no_bs_opts;
        }
        bs = blk_bs(blk);
602

603
        bs->detect_zeroes = detect_zeroes;
604

605
        block_acct_setup(blk_get_stats(blk), account_invalid, account_failed);
606

607 608 609 610
        if (!parse_stats_intervals(blk_get_stats(blk), interval_list, errp)) {
            blk_unref(blk);
            blk = NULL;
            goto err_no_bs_opts;
611
        }
612 613
    }

614 615 616
    /* disk I/O throttling */
    if (throttle_enabled(&cfg)) {
        if (!throttling_group) {
617
            throttling_group = id;
618 619 620 621 622
        }
        blk_io_limits_enable(blk, throttling_group);
        blk_set_io_limits(blk, &cfg);
    }

623
    blk_set_enable_write_cache(blk, !writethrough);
624
    blk_set_on_error(blk, on_read_error, on_write_error);
625

626
    if (!monitor_add_blk(blk, id, errp)) {
627 628 629 630 631
        blk_unref(blk);
        blk = NULL;
        goto err_no_bs_opts;
    }

632
err_no_bs_opts:
633
    qemu_opts_del(opts);
634 635
    QDECREF(interval_dict);
    QDECREF(interval_list);
636
    return blk;
637

638 639
early_err:
    qemu_opts_del(opts);
640 641
    QDECREF(interval_dict);
    QDECREF(interval_list);
642 643
err_no_opts:
    QDECREF(bs_opts);
644
    return NULL;
645 646
}

647 648 649 650 651
/* Takes the ownership of bs_opts */
static BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp)
{
    int bdrv_flags = 0;

652 653 654 655 656
    /* bdrv_open() defaults to the values in bdrv_flags (for compatibility
     * with other callers) rather than what we want as the real defaults.
     * Apply the defaults here instead. */
    qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_DIRECT, "off");
    qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_NO_FLUSH, "off");
657
    qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY, "off");
658

659 660 661 662
    if (runstate_check(RUN_STATE_INMIGRATE)) {
        bdrv_flags |= BDRV_O_INACTIVE;
    }

K
Kevin Wolf 已提交
663
    return bdrv_open(NULL, NULL, bs_opts, bdrv_flags, errp);
664 665
}

666 667 668 669 670 671 672 673 674 675 676 677 678
void blockdev_close_all_bdrv_states(void)
{
    BlockDriverState *bs, *next_bs;

    QTAILQ_FOREACH_SAFE(bs, &monitor_bdrv_states, monitor_list, next_bs) {
        AioContext *ctx = bdrv_get_aio_context(bs);

        aio_context_acquire(ctx);
        bdrv_unref(bs);
        aio_context_release(ctx);
    }
}

M
Max Reitz 已提交
679 680 681 682 683 684 685
/* Iterates over the list of monitor-owned BlockDriverStates */
BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs)
{
    return bs ? QTAILQ_NEXT(bs, monitor_list)
              : QTAILQ_FIRST(&monitor_bdrv_states);
}

686 687
static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
                            Error **errp)
688 689 690 691 692
{
    const char *value;

    value = qemu_opt_get(opts, from);
    if (value) {
693 694 695 696 697
        if (qemu_opt_find(opts, to)) {
            error_setg(errp, "'%s' and its alias '%s' can't be used at the "
                       "same time", to, from);
            return;
        }
698 699 700 701
    }

    /* rename all items in opts */
    while ((value = qemu_opt_get(opts, from))) {
702
        qemu_opt_set(opts, to, value, &error_abort);
703 704 705 706
        qemu_opt_unset(opts, from);
    }
}

707 708 709 710 711
QemuOptsList qemu_legacy_drive_opts = {
    .name = "drive",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_legacy_drive_opts.head),
    .desc = {
        {
712 713 714 715 716 717 718 719 720 721 722 723
            .name = "bus",
            .type = QEMU_OPT_NUMBER,
            .help = "bus number",
        },{
            .name = "unit",
            .type = QEMU_OPT_NUMBER,
            .help = "unit number (i.e. lun for scsi)",
        },{
            .name = "index",
            .type = QEMU_OPT_NUMBER,
            .help = "index number",
        },{
724 725 726
            .name = "media",
            .type = QEMU_OPT_STRING,
            .help = "media type (disk, cdrom)",
727 728 729 730
        },{
            .name = "if",
            .type = QEMU_OPT_STRING,
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
        },{
            .name = "cyls",
            .type = QEMU_OPT_NUMBER,
            .help = "number of cylinders (ide disk geometry)",
        },{
            .name = "heads",
            .type = QEMU_OPT_NUMBER,
            .help = "number of heads (ide disk geometry)",
        },{
            .name = "secs",
            .type = QEMU_OPT_NUMBER,
            .help = "number of sectors (ide disk geometry)",
        },{
            .name = "trans",
            .type = QEMU_OPT_STRING,
            .help = "chs translation (auto, lba, none)",
747 748 749 750
        },{
            .name = "addr",
            .type = QEMU_OPT_STRING,
            .help = "pci address (virtio only)",
751 752 753 754
        },{
            .name = "serial",
            .type = QEMU_OPT_STRING,
            .help = "disk serial number",
M
Max Reitz 已提交
755 756 757 758
        },{
            .name = "file",
            .type = QEMU_OPT_STRING,
            .help = "file name",
759
        },
760 761 762

        /* Options that are passed on, but have special semantics with -drive */
        {
763
            .name = BDRV_OPT_READ_ONLY,
764 765
            .type = QEMU_OPT_BOOL,
            .help = "open drive file as read-only",
766 767 768 769 770 771 772 773
        },{
            .name = "rerror",
            .type = QEMU_OPT_STRING,
            .help = "read error action",
        },{
            .name = "werror",
            .type = QEMU_OPT_STRING,
            .help = "write error action",
774 775 776 777 778 779
        },{
            .name = "copy-on-read",
            .type = QEMU_OPT_BOOL,
            .help = "copy read data from backing file into image file",
        },

780 781 782 783
        { /* end of list */ }
    },
};

784
DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
785
{
K
Kevin Wolf 已提交
786
    const char *value;
787
    BlockBackend *blk;
788
    DriveInfo *dinfo = NULL;
789
    QDict *bs_opts;
790 791
    QemuOpts *legacy_opts;
    DriveMediaType media = MEDIA_DISK;
792
    BlockInterfaceType type;
793
    int cyls, heads, secs, translation;
794
    int max_devs, bus_id, unit_id, index;
795
    const char *devaddr;
796
    const char *werror, *rerror;
F
Fam Zheng 已提交
797 798
    bool read_only = false;
    bool copy_on_read;
799
    const char *serial;
M
Max Reitz 已提交
800
    const char *filename;
801
    Error *local_err = NULL;
802
    int i;
803 804 805
    const char *deprecated[] = {
        "serial", "trans", "secs", "heads", "cyls", "addr"
    };
K
Kevin Wolf 已提交
806

807
    /* Change legacy command line options into QMP ones */
808 809 810 811 812 813 814
    static const struct {
        const char *from;
        const char *to;
    } opt_renames[] = {
        { "iops",           "throttling.iops-total" },
        { "iops_rd",        "throttling.iops-read" },
        { "iops_wr",        "throttling.iops-write" },
815

816 817 818
        { "bps",            "throttling.bps-total" },
        { "bps_rd",         "throttling.bps-read" },
        { "bps_wr",         "throttling.bps-write" },
819

820 821 822
        { "iops_max",       "throttling.iops-total-max" },
        { "iops_rd_max",    "throttling.iops-read-max" },
        { "iops_wr_max",    "throttling.iops-write-max" },
823

824 825 826
        { "bps_max",        "throttling.bps-total-max" },
        { "bps_rd_max",     "throttling.bps-read-max" },
        { "bps_wr_max",     "throttling.bps-write-max" },
827

828
        { "iops_size",      "throttling.iops-size" },
829

830 831
        { "group",          "throttling.group" },

832
        { "readonly",       BDRV_OPT_READ_ONLY },
833 834 835
    };

    for (i = 0; i < ARRAY_SIZE(opt_renames); i++) {
836 837 838
        qemu_opt_rename(all_opts, opt_renames[i].from, opt_renames[i].to,
                        &local_err);
        if (local_err) {
839
            error_report_err(local_err);
840 841
            return NULL;
        }
842
    }
843

K
Kevin Wolf 已提交
844 845 846
    value = qemu_opt_get(all_opts, "cache");
    if (value) {
        int flags = 0;
847
        bool writethrough;
K
Kevin Wolf 已提交
848

849
        if (bdrv_parse_cache_mode(value, &flags, &writethrough) != 0) {
K
Kevin Wolf 已提交
850 851 852 853 854
            error_report("invalid cache option");
            return NULL;
        }

        /* Specific options take precedence */
855 856
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_WB)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_WB,
857
                              !writethrough, &error_abort);
K
Kevin Wolf 已提交
858
        }
859 860
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_DIRECT)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_DIRECT,
861
                              !!(flags & BDRV_O_NOCACHE), &error_abort);
K
Kevin Wolf 已提交
862
        }
863 864
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_NO_FLUSH)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_NO_FLUSH,
865
                              !!(flags & BDRV_O_NO_FLUSH), &error_abort);
K
Kevin Wolf 已提交
866 867 868 869
        }
        qemu_opt_unset(all_opts, "cache");
    }

870 871 872 873
    /* Get a QDict for processing the options */
    bs_opts = qdict_new();
    qemu_opts_to_qdict(all_opts, bs_opts);

874 875
    legacy_opts = qemu_opts_create(&qemu_legacy_drive_opts, NULL, 0,
                                   &error_abort);
876
    qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
877
    if (local_err) {
878
        error_report_err(local_err);
879 880 881
        goto fail;
    }

882 883 884 885 886 887 888 889 890 891
    /* Other deprecated options */
    if (!qtest_enabled()) {
        for (i = 0; i < ARRAY_SIZE(deprecated); i++) {
            if (qemu_opt_get(legacy_opts, deprecated[i]) != NULL) {
                error_report("'%s' is deprecated, please use the corresponding "
                             "option of '-device' instead", deprecated[i]);
            }
        }
    }

892 893 894 895 896 897 898
    /* Media type */
    value = qemu_opt_get(legacy_opts, "media");
    if (value) {
        if (!strcmp(value, "disk")) {
            media = MEDIA_DISK;
        } else if (!strcmp(value, "cdrom")) {
            media = MEDIA_CDROM;
F
Fam Zheng 已提交
899
            read_only = true;
900 901 902 903 904 905
        } else {
            error_report("'%s' invalid media", value);
            goto fail;
        }
    }

906
    /* copy-on-read is disabled with a warning for read-only devices */
907
    read_only |= qemu_opt_get_bool(legacy_opts, BDRV_OPT_READ_ONLY, false);
908 909 910
    copy_on_read = qemu_opt_get_bool(legacy_opts, "copy-on-read", false);

    if (read_only && copy_on_read) {
911
        warn_report("disabling copy-on-read on read-only drive");
912 913 914
        copy_on_read = false;
    }

915 916
    qdict_put_str(bs_opts, BDRV_OPT_READ_ONLY, read_only ? "on" : "off");
    qdict_put_str(bs_opts, "copy-on-read", copy_on_read ? "on" : "off");
917

918 919 920 921 922 923 924 925 926 927 928 929 930 931 932
    /* Controller type */
    value = qemu_opt_get(legacy_opts, "if");
    if (value) {
        for (type = 0;
             type < IF_COUNT && strcmp(value, if_name[type]);
             type++) {
        }
        if (type == IF_COUNT) {
            error_report("unsupported bus type '%s'", value);
            goto fail;
        }
    } else {
        type = block_default_type;
    }

933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964
    /* Geometry */
    cyls  = qemu_opt_get_number(legacy_opts, "cyls", 0);
    heads = qemu_opt_get_number(legacy_opts, "heads", 0);
    secs  = qemu_opt_get_number(legacy_opts, "secs", 0);

    if (cyls || heads || secs) {
        if (cyls < 1) {
            error_report("invalid physical cyls number");
            goto fail;
        }
        if (heads < 1) {
            error_report("invalid physical heads number");
            goto fail;
        }
        if (secs < 1) {
            error_report("invalid physical secs number");
            goto fail;
        }
    }

    translation = BIOS_ATA_TRANSLATION_AUTO;
    value = qemu_opt_get(legacy_opts, "trans");
    if (value != NULL) {
        if (!cyls) {
            error_report("'%s' trans must be used with cyls, heads and secs",
                         value);
            goto fail;
        }
        if (!strcmp(value, "none")) {
            translation = BIOS_ATA_TRANSLATION_NONE;
        } else if (!strcmp(value, "lba")) {
            translation = BIOS_ATA_TRANSLATION_LBA;
965 966 967 968
        } else if (!strcmp(value, "large")) {
            translation = BIOS_ATA_TRANSLATION_LARGE;
        } else if (!strcmp(value, "rechs")) {
            translation = BIOS_ATA_TRANSLATION_RECHS;
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983
        } else if (!strcmp(value, "auto")) {
            translation = BIOS_ATA_TRANSLATION_AUTO;
        } else {
            error_report("'%s' invalid translation type", value);
            goto fail;
        }
    }

    if (media == MEDIA_CDROM) {
        if (cyls || secs || heads) {
            error_report("CHS can't be set with media=cdrom");
            goto fail;
        }
    }

984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
    /* Device address specified by bus/unit or index.
     * If none was specified, try to find the first free one. */
    bus_id  = qemu_opt_get_number(legacy_opts, "bus", 0);
    unit_id = qemu_opt_get_number(legacy_opts, "unit", -1);
    index   = qemu_opt_get_number(legacy_opts, "index", -1);

    max_devs = if_max_devs[type];

    if (index != -1) {
        if (bus_id != 0 || unit_id != -1) {
            error_report("index cannot be used with bus and unit");
            goto fail;
        }
        bus_id = drive_index_to_bus_id(type, index);
        unit_id = drive_index_to_unit_id(type, index);
    }

    if (unit_id == -1) {
       unit_id = 0;
       while (drive_get(type, bus_id, unit_id) != NULL) {
           unit_id++;
           if (max_devs && unit_id >= max_devs) {
               unit_id -= max_devs;
               bus_id++;
           }
       }
    }

    if (max_devs && unit_id >= max_devs) {
        error_report("unit %d too big (max is %d)", unit_id, max_devs - 1);
        goto fail;
    }

    if (drive_get(type, bus_id, unit_id) != NULL) {
        error_report("drive with bus=%d, unit=%d (index=%d) exists",
                     bus_id, unit_id, index);
        goto fail;
    }

1023 1024 1025
    /* Serial number */
    serial = qemu_opt_get(legacy_opts, "serial");

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
    /* no id supplied -> create one */
    if (qemu_opts_id(all_opts) == NULL) {
        char *new_id;
        const char *mediastr = "";
        if (type == IF_IDE || type == IF_SCSI) {
            mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
        }
        if (max_devs) {
            new_id = g_strdup_printf("%s%i%s%i", if_name[type], bus_id,
                                     mediastr, unit_id);
        } else {
            new_id = g_strdup_printf("%s%s%i", if_name[type],
                                     mediastr, unit_id);
        }
1040
        qdict_put_str(bs_opts, "id", new_id);
1041 1042 1043
        g_free(new_id);
    }

1044 1045 1046 1047 1048 1049 1050 1051 1052
    /* Add virtio block device */
    devaddr = qemu_opt_get(legacy_opts, "addr");
    if (devaddr && type != IF_VIRTIO) {
        error_report("addr is not supported by this bus type");
        goto fail;
    }

    if (type == IF_VIRTIO) {
        QemuOpts *devopts;
1053 1054
        devopts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                   &error_abort);
1055
        if (arch_type == QEMU_ARCH_S390X) {
1056
            qemu_opt_set(devopts, "driver", "virtio-blk-ccw", &error_abort);
1057
        } else {
1058
            qemu_opt_set(devopts, "driver", "virtio-blk-pci", &error_abort);
1059
        }
1060 1061
        qemu_opt_set(devopts, "drive", qdict_get_str(bs_opts, "id"),
                     &error_abort);
1062
        if (devaddr) {
1063
            qemu_opt_set(devopts, "addr", devaddr, &error_abort);
1064 1065 1066
        }
    }

M
Max Reitz 已提交
1067 1068
    filename = qemu_opt_get(legacy_opts, "file");

1069 1070 1071 1072 1073 1074 1075 1076
    /* Check werror/rerror compatibility with if=... */
    werror = qemu_opt_get(legacy_opts, "werror");
    if (werror != NULL) {
        if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO &&
            type != IF_NONE) {
            error_report("werror is not supported by this bus type");
            goto fail;
        }
1077
        qdict_put_str(bs_opts, "werror", werror);
1078 1079 1080 1081 1082 1083 1084 1085 1086
    }

    rerror = qemu_opt_get(legacy_opts, "rerror");
    if (rerror != NULL) {
        if (type != IF_IDE && type != IF_VIRTIO && type != IF_SCSI &&
            type != IF_NONE) {
            error_report("rerror is not supported by this bus type");
            goto fail;
        }
1087
        qdict_put_str(bs_opts, "rerror", rerror);
1088 1089
    }

1090
    /* Actual block device init: Functionality shared with blockdev-add */
1091
    blk = blockdev_init(filename, bs_opts, &local_err);
1092
    bs_opts = NULL;
1093
    if (!blk) {
1094
        if (local_err) {
1095
            error_report_err(local_err);
1096
        }
1097
        goto fail;
1098
    } else {
1099
        assert(!local_err);
1100 1101
    }

1102 1103
    /* Create legacy DriveInfo */
    dinfo = g_malloc0(sizeof(*dinfo));
1104
    dinfo->opts = all_opts;
1105

1106 1107 1108 1109 1110
    dinfo->cyls = cyls;
    dinfo->heads = heads;
    dinfo->secs = secs;
    dinfo->trans = translation;

1111
    dinfo->type = type;
1112 1113
    dinfo->bus = bus_id;
    dinfo->unit = unit_id;
1114
    dinfo->devaddr = devaddr;
1115 1116
    dinfo->serial = g_strdup(serial);

1117 1118
    blk_set_legacy_dinfo(blk, dinfo);

1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
    switch(type) {
    case IF_IDE:
    case IF_SCSI:
    case IF_XEN:
    case IF_NONE:
        dinfo->media_cd = media == MEDIA_CDROM;
        break;
    default:
        break;
    }

1130
fail:
1131
    qemu_opts_del(legacy_opts);
1132
    QDECREF(bs_opts);
1133
    return dinfo;
1134 1135
}

1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
static BlockDriverState *qmp_get_root_bs(const char *name, Error **errp)
{
    BlockDriverState *bs;

    bs = bdrv_lookup_bs(name, name, errp);
    if (bs == NULL) {
        return NULL;
    }

    if (!bdrv_is_root_node(bs)) {
        error_setg(errp, "Need a root block node");
        return NULL;
    }

    if (!bdrv_is_inserted(bs)) {
        error_setg(errp, "Device has no medium");
        return NULL;
    }

    return bs;
}

1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
static BlockBackend *qmp_get_blk(const char *blk_name, const char *qdev_id,
                                 Error **errp)
{
    BlockBackend *blk;

    if (!blk_name == !qdev_id) {
        error_setg(errp, "Need exactly one of 'device' and 'id'");
        return NULL;
    }

    if (qdev_id) {
        blk = blk_by_qdev_id(qdev_id, errp);
    } else {
        blk = blk_by_name(blk_name);
        if (blk == NULL) {
            error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                      "Device '%s' not found", blk_name);
        }
    }

    return blk;
}

1181
void hmp_commit(Monitor *mon, const QDict *qdict)
1182 1183
{
    const char *device = qdict_get_str(qdict, "device");
1184
    BlockBackend *blk;
1185
    int ret;
1186

1187
    if (!strcmp(device, "all")) {
1188
        ret = blk_commit_all();
1189
    } else {
1190 1191 1192
        BlockDriverState *bs;
        AioContext *aio_context;

1193 1194
        blk = blk_by_name(device);
        if (!blk) {
1195
            monitor_printf(mon, "Device '%s' not found\n", device);
1196
            return;
1197
        }
M
Max Reitz 已提交
1198 1199 1200 1201
        if (!blk_is_available(blk)) {
            monitor_printf(mon, "Device '%s' has no medium\n", device);
            return;
        }
1202 1203 1204 1205 1206 1207 1208 1209

        bs = blk_bs(blk);
        aio_context = bdrv_get_aio_context(bs);
        aio_context_acquire(aio_context);

        ret = bdrv_commit(bs);

        aio_context_release(aio_context);
1210 1211 1212 1213
    }
    if (ret < 0) {
        monitor_printf(mon, "'commit' error for '%s': %s\n", device,
                       strerror(-ret));
1214 1215 1216
    }
}

1217
static void blockdev_do_action(TransactionAction *action, Error **errp)
1218
{
1219
    TransactionActionList list;
1220

1221
    list.value = action;
1222
    list.next = NULL;
J
John Snow 已提交
1223
    qmp_transaction(&list, false, NULL, errp);
1224 1225
}

1226 1227 1228 1229 1230
void qmp_blockdev_snapshot_sync(bool has_device, const char *device,
                                bool has_node_name, const char *node_name,
                                const char *snapshot_file,
                                bool has_snapshot_node_name,
                                const char *snapshot_node_name,
1231
                                bool has_format, const char *format,
1232
                                bool has_mode, NewImageMode mode, Error **errp)
1233
{
1234
    BlockdevSnapshotSync snapshot = {
1235
        .has_device = has_device,
1236
        .device = (char *) device,
1237 1238
        .has_node_name = has_node_name,
        .node_name = (char *) node_name,
1239
        .snapshot_file = (char *) snapshot_file,
1240 1241
        .has_snapshot_node_name = has_snapshot_node_name,
        .snapshot_node_name = (char *) snapshot_node_name,
1242 1243 1244 1245 1246
        .has_format = has_format,
        .format = (char *) format,
        .has_mode = has_mode,
        .mode = mode,
    };
1247 1248
    TransactionAction action = {
        .type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC,
1249
        .u.blockdev_snapshot_sync.data = &snapshot,
1250 1251
    };
    blockdev_do_action(&action, errp);
1252 1253
}

1254 1255 1256 1257 1258 1259 1260
void qmp_blockdev_snapshot(const char *node, const char *overlay,
                           Error **errp)
{
    BlockdevSnapshot snapshot_data = {
        .node = (char *) node,
        .overlay = (char *) overlay
    };
1261 1262
    TransactionAction action = {
        .type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT,
1263
        .u.blockdev_snapshot.data = &snapshot_data,
1264 1265
    };
    blockdev_do_action(&action, errp);
1266 1267
}

1268 1269 1270 1271 1272 1273 1274 1275
void qmp_blockdev_snapshot_internal_sync(const char *device,
                                         const char *name,
                                         Error **errp)
{
    BlockdevSnapshotInternal snapshot = {
        .device = (char *) device,
        .name = (char *) name
    };
1276 1277
    TransactionAction action = {
        .type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC,
1278
        .u.blockdev_snapshot_internal_sync.data = &snapshot,
1279 1280
    };
    blockdev_do_action(&action, errp);
1281 1282
}

1283 1284 1285 1286 1287 1288 1289
SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device,
                                                         bool has_id,
                                                         const char *id,
                                                         bool has_name,
                                                         const char *name,
                                                         Error **errp)
{
1290
    BlockDriverState *bs;
1291
    AioContext *aio_context;
1292 1293 1294 1295 1296
    QEMUSnapshotInfo sn;
    Error *local_err = NULL;
    SnapshotInfo *info = NULL;
    int ret;

1297 1298
    bs = qmp_get_root_bs(device, errp);
    if (!bs) {
1299 1300
        return NULL;
    }
1301
    aio_context = bdrv_get_aio_context(bs);
M
Max Reitz 已提交
1302
    aio_context_acquire(aio_context);
1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313

    if (!has_id) {
        id = NULL;
    }

    if (!has_name) {
        name = NULL;
    }

    if (!id && !name) {
        error_setg(errp, "Name or id must be provided");
M
Max Reitz 已提交
1314
        goto out_aio_context;
1315 1316
    }

1317 1318 1319 1320
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE, errp)) {
        goto out_aio_context;
    }

1321
    ret = bdrv_snapshot_find_by_id_and_name(bs, id, name, &sn, &local_err);
1322
    if (local_err) {
1323
        error_propagate(errp, local_err);
1324
        goto out_aio_context;
1325 1326 1327 1328 1329 1330
    }
    if (!ret) {
        error_setg(errp,
                   "Snapshot with id '%s' and name '%s' does not exist on "
                   "device '%s'",
                   STR_OR_NULL(id), STR_OR_NULL(name), device);
1331
        goto out_aio_context;
1332 1333 1334
    }

    bdrv_snapshot_delete(bs, id, name, &local_err);
1335
    if (local_err) {
1336
        error_propagate(errp, local_err);
1337
        goto out_aio_context;
1338 1339
    }

1340 1341
    aio_context_release(aio_context);

1342
    info = g_new0(SnapshotInfo, 1);
1343 1344 1345 1346 1347 1348 1349 1350 1351
    info->id = g_strdup(sn.id_str);
    info->name = g_strdup(sn.name);
    info->date_nsec = sn.date_nsec;
    info->date_sec = sn.date_sec;
    info->vm_state_size = sn.vm_state_size;
    info->vm_clock_nsec = sn.vm_clock_nsec % 1000000000;
    info->vm_clock_sec = sn.vm_clock_nsec / 1000000000;

    return info;
1352 1353 1354 1355

out_aio_context:
    aio_context_release(aio_context);
    return NULL;
1356
}
1357

1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395
/**
 * block_dirty_bitmap_lookup:
 * Return a dirty bitmap (if present), after validating
 * the node reference and bitmap names.
 *
 * @node: The name of the BDS node to search for bitmaps
 * @name: The name of the bitmap to search for
 * @pbs: Output pointer for BDS lookup, if desired. Can be NULL.
 * @paio: Output pointer for aio_context acquisition, if desired. Can be NULL.
 * @errp: Output pointer for error information. Can be NULL.
 *
 * @return: A bitmap object on success, or NULL on failure.
 */
static BdrvDirtyBitmap *block_dirty_bitmap_lookup(const char *node,
                                                  const char *name,
                                                  BlockDriverState **pbs,
                                                  Error **errp)
{
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;

    if (!node) {
        error_setg(errp, "Node cannot be NULL");
        return NULL;
    }
    if (!name) {
        error_setg(errp, "Bitmap name cannot be NULL");
        return NULL;
    }
    bs = bdrv_lookup_bs(node, node, NULL);
    if (!bs) {
        error_setg(errp, "Node '%s' not found", node);
        return NULL;
    }

    bitmap = bdrv_find_dirty_bitmap(bs, name);
    if (!bitmap) {
        error_setg(errp, "Dirty bitmap '%s' not found", name);
1396
        return NULL;
1397 1398 1399 1400 1401 1402 1403 1404 1405
    }

    if (pbs) {
        *pbs = bs;
    }

    return bitmap;
}

1406
/* New and old BlockDriverState structs for atomic group operations */
1407

1408
typedef struct BlkActionState BlkActionState;
1409

1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
/**
 * BlkActionOps:
 * Table of operations that define an Action.
 *
 * @instance_size: Size of state struct, in bytes.
 * @prepare: Prepare the work, must NOT be NULL.
 * @commit: Commit the changes, can be NULL.
 * @abort: Abort the changes on fail, can be NULL.
 * @clean: Clean up resources after all transaction actions have called
 *         commit() or abort(). Can be NULL.
 *
 * Only prepare() may fail. In a single transaction, only one of commit() or
 * abort() will be called. clean() will always be called if it is present.
 */
typedef struct BlkActionOps {
1425
    size_t instance_size;
1426 1427 1428 1429 1430
    void (*prepare)(BlkActionState *common, Error **errp);
    void (*commit)(BlkActionState *common);
    void (*abort)(BlkActionState *common);
    void (*clean)(BlkActionState *common);
} BlkActionOps;
1431

1432 1433 1434 1435 1436 1437
/**
 * BlkActionState:
 * Describes one Action's state within a Transaction.
 *
 * @action: QAPI-defined enum identifying which Action to perform.
 * @ops: Table of ActionOps this Action can perform.
J
John Snow 已提交
1438
 * @block_job_txn: Transaction which this action belongs to.
1439 1440 1441 1442 1443
 * @entry: List membership for all Actions in this Transaction.
 *
 * This structure must be arranged as first member in a subclassed type,
 * assuming that the compiler will also arrange it to the same offsets as the
 * base class.
1444
 */
1445
struct BlkActionState {
1446
    TransactionAction *action;
1447
    const BlkActionOps *ops;
J
John Snow 已提交
1448 1449
    BlockJobTxn *block_job_txn;
    TransactionProperties *txn_props;
1450
    QSIMPLEQ_ENTRY(BlkActionState) entry;
1451 1452
};

1453 1454
/* internal snapshot private data */
typedef struct InternalSnapshotState {
1455
    BlkActionState common;
1456 1457
    BlockDriverState *bs;
    QEMUSnapshotInfo sn;
1458
    bool created;
1459 1460
} InternalSnapshotState;

J
John Snow 已提交
1461 1462 1463 1464 1465 1466 1467

static int action_check_completion_mode(BlkActionState *s, Error **errp)
{
    if (s->txn_props->completion_mode != ACTION_COMPLETION_MODE_INDIVIDUAL) {
        error_setg(errp,
                   "Action '%s' does not support Transaction property "
                   "completion-mode = %s",
1468 1469
                   TransactionActionKind_str(s->action->type),
                   ActionCompletionMode_str(s->txn_props->completion_mode));
J
John Snow 已提交
1470 1471 1472 1473 1474
        return -1;
    }
    return 0;
}

1475
static void internal_snapshot_prepare(BlkActionState *common,
1476 1477
                                      Error **errp)
{
1478
    Error *local_err = NULL;
1479 1480 1481 1482 1483 1484 1485 1486
    const char *device;
    const char *name;
    BlockDriverState *bs;
    QEMUSnapshotInfo old_sn, *sn;
    bool ret;
    qemu_timeval tv;
    BlockdevSnapshotInternal *internal;
    InternalSnapshotState *state;
1487
    AioContext *aio_context;
1488 1489
    int ret1;

1490
    g_assert(common->action->type ==
1491
             TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC);
1492
    internal = common->action->u.blockdev_snapshot_internal_sync.data;
1493 1494 1495 1496 1497 1498 1499
    state = DO_UPCAST(InternalSnapshotState, common, common);

    /* 1. parse input */
    device = internal->device;
    name = internal->name;

    /* 2. check for validation */
J
John Snow 已提交
1500 1501 1502 1503
    if (action_check_completion_mode(common, errp) < 0) {
        return;
    }

1504 1505
    bs = qmp_get_root_bs(device, errp);
    if (!bs) {
1506 1507 1508
        return;
    }

1509 1510
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);
1511

1512
    state->bs = bs;
1513 1514

    /* Paired with .clean() */
1515 1516
    bdrv_drained_begin(bs);

1517
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)) {
1518
        goto out;
1519 1520
    }

1521
    if (bdrv_is_read_only(bs)) {
1522
        error_setg(errp, "Device '%s' is read only", device);
1523
        goto out;
1524 1525 1526
    }

    if (!bdrv_can_snapshot(bs)) {
1527 1528 1529
        error_setg(errp, "Block format '%s' used by device '%s' "
                   "does not support internal snapshots",
                   bs->drv->format_name, device);
1530
        goto out;
1531 1532 1533 1534
    }

    if (!strlen(name)) {
        error_setg(errp, "Name is empty");
1535
        goto out;
1536 1537 1538
    }

    /* check whether a snapshot with name exist */
1539 1540 1541 1542
    ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn,
                                            &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
1543
        goto out;
1544 1545 1546 1547
    } else if (ret) {
        error_setg(errp,
                   "Snapshot with name '%s' already exists on device '%s'",
                   name, device);
1548
        goto out;
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
    }

    /* 3. take the snapshot */
    sn = &state->sn;
    pstrcpy(sn->name, sizeof(sn->name), name);
    qemu_gettimeofday(&tv);
    sn->date_sec = tv.tv_sec;
    sn->date_nsec = tv.tv_usec * 1000;
    sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);

    ret1 = bdrv_snapshot_create(bs, sn);
    if (ret1 < 0) {
        error_setg_errno(errp, -ret1,
                         "Failed to create snapshot '%s' on device '%s'",
                         name, device);
1564
        goto out;
1565 1566 1567
    }

    /* 4. succeed, mark a snapshot is created */
1568
    state->created = true;
1569 1570 1571

out:
    aio_context_release(aio_context);
1572 1573
}

1574
static void internal_snapshot_abort(BlkActionState *common)
1575 1576 1577 1578 1579
{
    InternalSnapshotState *state =
                             DO_UPCAST(InternalSnapshotState, common, common);
    BlockDriverState *bs = state->bs;
    QEMUSnapshotInfo *sn = &state->sn;
1580
    AioContext *aio_context;
1581 1582
    Error *local_error = NULL;

1583
    if (!state->created) {
1584 1585 1586
        return;
    }

1587 1588 1589
    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

1590
    if (bdrv_snapshot_delete(bs, sn->id_str, sn->name, &local_error) < 0) {
1591 1592 1593 1594 1595
        error_reportf_err(local_error,
                          "Failed to delete snapshot with id '%s' and "
                          "name '%s' on device '%s' in abort: ",
                          sn->id_str, sn->name,
                          bdrv_get_device_name(bs));
1596
    }
1597 1598

    aio_context_release(aio_context);
1599 1600
}

1601
static void internal_snapshot_clean(BlkActionState *common)
1602 1603 1604
{
    InternalSnapshotState *state = DO_UPCAST(InternalSnapshotState,
                                             common, common);
1605
    AioContext *aio_context;
1606

1607 1608
    if (!state->bs) {
        return;
1609
    }
1610 1611 1612 1613 1614 1615 1616

    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

    bdrv_drained_end(state->bs);

    aio_context_release(aio_context);
1617 1618
}

1619
/* external snapshot private data */
1620
typedef struct ExternalSnapshotState {
1621
    BlkActionState common;
1622 1623
    BlockDriverState *old_bs;
    BlockDriverState *new_bs;
1624
    bool overlay_appended;
1625
} ExternalSnapshotState;
1626

1627
static void external_snapshot_prepare(BlkActionState *common,
1628 1629
                                      Error **errp)
{
M
Max Reitz 已提交
1630
    int flags = 0;
1631
    QDict *options = NULL;
1632
    Error *local_err = NULL;
1633
    /* Device and node name of the image to generate the snapshot from */
1634
    const char *device;
1635
    const char *node_name;
1636 1637 1638
    /* Reference to the new image (for 'blockdev-snapshot') */
    const char *snapshot_ref;
    /* File name of the new image (for 'blockdev-snapshot-sync') */
1639
    const char *new_image_file;
1640 1641
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1642
    TransactionAction *action = common->action;
1643
    AioContext *aio_context;
1644

1645 1646 1647 1648 1649
    /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
     * purpose but a different set of parameters */
    switch (action->type) {
    case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT:
        {
1650
            BlockdevSnapshot *s = action->u.blockdev_snapshot.data;
1651 1652 1653 1654 1655 1656 1657 1658
            device = s->node;
            node_name = s->node;
            new_image_file = NULL;
            snapshot_ref = s->overlay;
        }
        break;
    case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC:
        {
1659
            BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data;
1660 1661 1662 1663 1664 1665 1666 1667
            device = s->has_device ? s->device : NULL;
            node_name = s->has_node_name ? s->node_name : NULL;
            new_image_file = s->snapshot_file;
            snapshot_ref = NULL;
        }
        break;
    default:
        g_assert_not_reached();
1668 1669 1670
    }

    /* start processing */
J
John Snow 已提交
1671 1672 1673 1674
    if (action_check_completion_mode(common, errp) < 0) {
        return;
    }

1675 1676
    state->old_bs = bdrv_lookup_bs(device, node_name, errp);
    if (!state->old_bs) {
1677 1678 1679
        return;
    }

1680 1681 1682 1683
    aio_context = bdrv_get_aio_context(state->old_bs);
    aio_context_acquire(aio_context);

    /* Paired with .clean() */
1684
    bdrv_drained_begin(state->old_bs);
1685

1686
    if (!bdrv_is_inserted(state->old_bs)) {
1687
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
1688
        goto out;
1689 1690
    }

1691 1692
    if (bdrv_op_is_blocked(state->old_bs,
                           BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT, errp)) {
1693
        goto out;
1694 1695
    }

1696 1697
    if (!bdrv_is_read_only(state->old_bs)) {
        if (bdrv_flush(state->old_bs)) {
1698
            error_setg(errp, QERR_IO_ERROR);
1699
            goto out;
1700 1701 1702
        }
    }

1703
    if (!bdrv_is_first_non_filter(state->old_bs)) {
1704
        error_setg(errp, QERR_FEATURE_DISABLED, "snapshot");
1705
        goto out;
1706 1707
    }

1708
    if (action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC) {
1709
        BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data;
1710 1711 1712 1713
        const char *format = s->has_format ? s->format : "qcow2";
        enum NewImageMode mode;
        const char *snapshot_node_name =
            s->has_snapshot_node_name ? s->snapshot_node_name : NULL;
1714

1715 1716
        if (node_name && !snapshot_node_name) {
            error_setg(errp, "New snapshot node name missing");
1717
            goto out;
1718 1719
        }

1720 1721 1722
        if (snapshot_node_name &&
            bdrv_lookup_bs(snapshot_node_name, snapshot_node_name, NULL)) {
            error_setg(errp, "New snapshot node name already in use");
1723
            goto out;
1724 1725 1726
        }

        flags = state->old_bs->open_flags;
1727 1728
        flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_COPY_ON_READ);
        flags |= BDRV_O_NO_BACKING;
1729 1730 1731 1732

        /* create new image w/backing file */
        mode = s->has_mode ? s->mode : NEW_IMAGE_MODE_ABSOLUTE_PATHS;
        if (mode != NEW_IMAGE_MODE_EXISTING) {
1733 1734 1735
            int64_t size = bdrv_getlength(state->old_bs);
            if (size < 0) {
                error_setg_errno(errp, -size, "bdrv_getlength failed");
1736
                goto out;
1737
            }
1738 1739 1740
            bdrv_img_create(new_image_file, format,
                            state->old_bs->filename,
                            state->old_bs->drv->format_name,
1741
                            NULL, size, flags, false, &local_err);
1742 1743
            if (local_err) {
                error_propagate(errp, local_err);
1744
                goto out;
1745 1746 1747 1748 1749
            }
        }

        options = qdict_new();
        if (s->has_snapshot_node_name) {
1750
            qdict_put_str(options, "node-name", snapshot_node_name);
1751
        }
1752
        qdict_put_str(options, "driver", format);
1753 1754
    }

M
Max Reitz 已提交
1755 1756
    state->new_bs = bdrv_open(new_image_file, snapshot_ref, options, flags,
                              errp);
1757
    /* We will manually add the backing_hd field to the bs later */
M
Max Reitz 已提交
1758
    if (!state->new_bs) {
1759
        goto out;
1760 1761
    }

K
Kevin Wolf 已提交
1762
    if (bdrv_has_blk(state->new_bs)) {
1763
        error_setg(errp, "The snapshot is already in use");
1764
        goto out;
1765 1766 1767 1768
    }

    if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
                           errp)) {
1769
        goto out;
1770 1771 1772 1773
    }

    if (state->new_bs->backing != NULL) {
        error_setg(errp, "The snapshot already has a backing image");
1774
        goto out;
1775 1776 1777 1778
    }

    if (!state->new_bs->drv->supports_backing) {
        error_setg(errp, "The snapshot does not support backing images");
1779
        goto out;
1780 1781
    }

1782
    bdrv_set_aio_context(state->new_bs, aio_context);
1783

1784 1785 1786 1787 1788 1789 1790
    /* This removes our old bs and adds the new bs. This is an operation that
     * can fail, so we need to do it in .prepare; undoing it for abort is
     * always possible. */
    bdrv_ref(state->new_bs);
    bdrv_append(state->new_bs, state->old_bs, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
1791
        goto out;
1792
    }
1793
    state->overlay_appended = true;
1794 1795 1796

out:
    aio_context_release(aio_context);
1797 1798
}

1799
static void external_snapshot_commit(BlkActionState *common)
1800
{
1801 1802
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1803 1804 1805 1806
    AioContext *aio_context;

    aio_context = bdrv_get_aio_context(state->old_bs);
    aio_context_acquire(aio_context);
1807

1808 1809 1810
    /* We don't need (or want) to use the transactional
     * bdrv_reopen_multiple() across all the entries at once, because we
     * don't want to abort all of them if one of them fails the reopen */
1811
    if (!atomic_read(&state->old_bs->copy_on_read)) {
1812 1813 1814
        bdrv_reopen(state->old_bs, state->old_bs->open_flags & ~BDRV_O_RDWR,
                    NULL);
    }
1815 1816

    aio_context_release(aio_context);
1817 1818
}

1819
static void external_snapshot_abort(BlkActionState *common)
1820
{
1821 1822 1823
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
    if (state->new_bs) {
1824
        if (state->overlay_appended) {
1825 1826 1827 1828 1829
            AioContext *aio_context;

            aio_context = bdrv_get_aio_context(state->old_bs);
            aio_context_acquire(aio_context);

1830 1831 1832
            bdrv_ref(state->old_bs);   /* we can't let bdrv_set_backind_hd()
                                          close state->old_bs; we need it */
            bdrv_set_backing_hd(state->new_bs, NULL, &error_abort);
1833
            bdrv_replace_node(state->new_bs, state->old_bs, &error_abort);
1834
            bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_bs */
1835 1836

            aio_context_release(aio_context);
1837
        }
1838
    }
1839 1840
}

1841
static void external_snapshot_clean(BlkActionState *common)
1842 1843 1844
{
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1845 1846 1847 1848
    AioContext *aio_context;

    if (!state->old_bs) {
        return;
1849
    }
1850 1851 1852 1853 1854 1855 1856 1857

    aio_context = bdrv_get_aio_context(state->old_bs);
    aio_context_acquire(aio_context);

    bdrv_drained_end(state->old_bs);
    bdrv_unref(state->new_bs);

    aio_context_release(aio_context);
1858 1859
}

1860
typedef struct DriveBackupState {
1861
    BlkActionState common;
1862 1863 1864 1865
    BlockDriverState *bs;
    BlockJob *job;
} DriveBackupState;

1866
static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
P
Pavel Butsykin 已提交
1867
                            Error **errp);
1868

1869
static void drive_backup_prepare(BlkActionState *common, Error **errp)
1870 1871
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
1872
    BlockDriverState *bs;
1873
    DriveBackup *backup;
1874
    AioContext *aio_context;
1875 1876
    Error *local_err = NULL;

1877
    assert(common->action->type == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
1878
    backup = common->action->u.drive_backup.data;
1879

1880 1881
    bs = qmp_get_root_bs(backup->device, errp);
    if (!bs) {
1882 1883 1884
        return;
    }

1885 1886 1887 1888
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

    /* Paired with .clean() */
1889
    bdrv_drained_begin(bs);
1890

1891
    state->bs = bs;
1892

1893
    state->job = do_drive_backup(backup, common->block_job_txn, &local_err);
1894
    if (local_err) {
1895
        error_propagate(errp, local_err);
1896
        goto out;
1897
    }
1898 1899 1900

out:
    aio_context_release(aio_context);
1901
}
1902

1903 1904 1905
static void drive_backup_commit(BlkActionState *common)
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
1906 1907 1908 1909 1910
    AioContext *aio_context;

    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

1911 1912
    assert(state->job);
    block_job_start(state->job);
1913 1914

    aio_context_release(aio_context);
1915 1916
}

1917
static void drive_backup_abort(BlkActionState *common)
1918 1919 1920
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);

1921
    if (state->job) {
1922 1923 1924 1925 1926
        AioContext *aio_context;

        aio_context = bdrv_get_aio_context(state->bs);
        aio_context_acquire(aio_context);

1927
        block_job_cancel_sync(state->job);
1928 1929

        aio_context_release(aio_context);
1930 1931 1932
    }
}

1933
static void drive_backup_clean(BlkActionState *common)
1934 1935
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
1936
    AioContext *aio_context;
1937

1938 1939
    if (!state->bs) {
        return;
1940
    }
1941 1942 1943 1944 1945 1946 1947

    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

    bdrv_drained_end(state->bs);

    aio_context_release(aio_context);
1948 1949
}

1950
typedef struct BlockdevBackupState {
1951
    BlkActionState common;
1952 1953 1954 1955
    BlockDriverState *bs;
    BlockJob *job;
} BlockdevBackupState;

1956 1957
static BlockJob *do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
                                    Error **errp);
1958

1959
static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
1960 1961 1962
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
    BlockdevBackup *backup;
1963
    BlockDriverState *bs, *target;
1964
    AioContext *aio_context;
1965 1966
    Error *local_err = NULL;

1967
    assert(common->action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
1968
    backup = common->action->u.blockdev_backup.data;
1969

1970 1971
    bs = qmp_get_root_bs(backup->device, errp);
    if (!bs) {
1972 1973 1974
        return;
    }

1975
    target = bdrv_lookup_bs(backup->target, backup->target, errp);
M
Max Reitz 已提交
1976
    if (!target) {
1977 1978 1979
        return;
    }

1980 1981
    aio_context = bdrv_get_aio_context(bs);
    if (aio_context != bdrv_get_aio_context(target)) {
1982 1983 1984
        error_setg(errp, "Backup between two IO threads is not implemented");
        return;
    }
1985
    aio_context_acquire(aio_context);
1986
    state->bs = bs;
1987 1988

    /* Paired with .clean() */
1989
    bdrv_drained_begin(state->bs);
1990

1991
    state->job = do_blockdev_backup(backup, common->block_job_txn, &local_err);
1992 1993
    if (local_err) {
        error_propagate(errp, local_err);
1994
        goto out;
1995
    }
1996 1997 1998

out:
    aio_context_release(aio_context);
1999
}
2000

2001 2002 2003
static void blockdev_backup_commit(BlkActionState *common)
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
2004 2005 2006 2007 2008
    AioContext *aio_context;

    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

2009 2010
    assert(state->job);
    block_job_start(state->job);
2011 2012

    aio_context_release(aio_context);
2013 2014
}

2015
static void blockdev_backup_abort(BlkActionState *common)
2016 2017 2018
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);

2019
    if (state->job) {
2020 2021 2022 2023 2024
        AioContext *aio_context;

        aio_context = bdrv_get_aio_context(state->bs);
        aio_context_acquire(aio_context);

2025
        block_job_cancel_sync(state->job);
2026 2027

        aio_context_release(aio_context);
2028 2029 2030
    }
}

2031
static void blockdev_backup_clean(BlkActionState *common)
2032 2033
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
2034
    AioContext *aio_context;
2035

2036 2037
    if (!state->bs) {
        return;
2038
    }
2039 2040 2041 2042 2043 2044 2045

    aio_context = bdrv_get_aio_context(state->bs);
    aio_context_acquire(aio_context);

    bdrv_drained_end(state->bs);

    aio_context_release(aio_context);
2046 2047
}

F
Fam Zheng 已提交
2048
typedef struct BlockDirtyBitmapState {
2049
    BlkActionState common;
F
Fam Zheng 已提交
2050 2051 2052 2053 2054 2055
    BdrvDirtyBitmap *bitmap;
    BlockDriverState *bs;
    HBitmap *backup;
    bool prepared;
} BlockDirtyBitmapState;

2056
static void block_dirty_bitmap_add_prepare(BlkActionState *common,
F
Fam Zheng 已提交
2057 2058 2059 2060 2061 2062 2063
                                           Error **errp)
{
    Error *local_err = NULL;
    BlockDirtyBitmapAdd *action;
    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                             common, common);

J
John Snow 已提交
2064 2065 2066 2067
    if (action_check_completion_mode(common, errp) < 0) {
        return;
    }

2068
    action = common->action->u.block_dirty_bitmap_add.data;
F
Fam Zheng 已提交
2069 2070 2071
    /* AIO context taken and released within qmp_block_dirty_bitmap_add */
    qmp_block_dirty_bitmap_add(action->node, action->name,
                               action->has_granularity, action->granularity,
2072
                               action->has_persistent, action->persistent,
2073
                               action->has_autoload, action->autoload,
F
Fam Zheng 已提交
2074 2075 2076 2077 2078 2079 2080 2081 2082
                               &local_err);

    if (!local_err) {
        state->prepared = true;
    } else {
        error_propagate(errp, local_err);
    }
}

2083
static void block_dirty_bitmap_add_abort(BlkActionState *common)
F
Fam Zheng 已提交
2084 2085 2086 2087 2088
{
    BlockDirtyBitmapAdd *action;
    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                             common, common);

2089
    action = common->action->u.block_dirty_bitmap_add.data;
F
Fam Zheng 已提交
2090 2091 2092 2093 2094 2095 2096 2097
    /* Should not be able to fail: IF the bitmap was added via .prepare(),
     * then the node reference and bitmap name must have been valid.
     */
    if (state->prepared) {
        qmp_block_dirty_bitmap_remove(action->node, action->name, &error_abort);
    }
}

2098
static void block_dirty_bitmap_clear_prepare(BlkActionState *common,
F
Fam Zheng 已提交
2099 2100 2101 2102 2103 2104
                                             Error **errp)
{
    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                             common, common);
    BlockDirtyBitmap *action;

J
John Snow 已提交
2105 2106 2107 2108
    if (action_check_completion_mode(common, errp) < 0) {
        return;
    }

2109
    action = common->action->u.block_dirty_bitmap_clear.data;
F
Fam Zheng 已提交
2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123
    state->bitmap = block_dirty_bitmap_lookup(action->node,
                                              action->name,
                                              &state->bs,
                                              errp);
    if (!state->bitmap) {
        return;
    }

    if (bdrv_dirty_bitmap_frozen(state->bitmap)) {
        error_setg(errp, "Cannot modify a frozen bitmap");
        return;
    } else if (!bdrv_dirty_bitmap_enabled(state->bitmap)) {
        error_setg(errp, "Cannot clear a disabled bitmap");
        return;
2124 2125 2126
    } else if (bdrv_dirty_bitmap_readonly(state->bitmap)) {
        error_setg(errp, "Cannot clear a readonly bitmap");
        return;
F
Fam Zheng 已提交
2127 2128 2129 2130 2131
    }

    bdrv_clear_dirty_bitmap(state->bitmap, &state->backup);
}

2132
static void block_dirty_bitmap_clear_abort(BlkActionState *common)
F
Fam Zheng 已提交
2133 2134 2135 2136
{
    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                             common, common);

J
John Snow 已提交
2137 2138 2139
    if (state->backup) {
        bdrv_undo_clear_dirty_bitmap(state->bitmap, state->backup);
    }
F
Fam Zheng 已提交
2140 2141
}

2142
static void block_dirty_bitmap_clear_commit(BlkActionState *common)
F
Fam Zheng 已提交
2143 2144 2145 2146 2147 2148 2149
{
    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                             common, common);

    hbitmap_free(state->backup);
}

2150
static void abort_prepare(BlkActionState *common, Error **errp)
2151 2152 2153 2154
{
    error_setg(errp, "Transaction aborted using Abort action");
}

2155
static void abort_commit(BlkActionState *common)
2156
{
2157
    g_assert_not_reached(); /* this action never succeeds */
2158 2159
}

2160
static const BlkActionOps actions[] = {
2161 2162 2163 2164 2165
    [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] = {
        .instance_size = sizeof(ExternalSnapshotState),
        .prepare  = external_snapshot_prepare,
        .commit   = external_snapshot_commit,
        .abort = external_snapshot_abort,
2166
        .clean = external_snapshot_clean,
2167
    },
2168
    [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC] = {
2169
        .instance_size = sizeof(ExternalSnapshotState),
2170 2171 2172
        .prepare  = external_snapshot_prepare,
        .commit   = external_snapshot_commit,
        .abort = external_snapshot_abort,
2173
        .clean = external_snapshot_clean,
2174
    },
2175 2176 2177
    [TRANSACTION_ACTION_KIND_DRIVE_BACKUP] = {
        .instance_size = sizeof(DriveBackupState),
        .prepare = drive_backup_prepare,
2178
        .commit = drive_backup_commit,
2179
        .abort = drive_backup_abort,
2180
        .clean = drive_backup_clean,
2181
    },
2182 2183 2184
    [TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP] = {
        .instance_size = sizeof(BlockdevBackupState),
        .prepare = blockdev_backup_prepare,
2185
        .commit = blockdev_backup_commit,
2186 2187 2188
        .abort = blockdev_backup_abort,
        .clean = blockdev_backup_clean,
    },
2189
    [TRANSACTION_ACTION_KIND_ABORT] = {
2190
        .instance_size = sizeof(BlkActionState),
2191 2192 2193
        .prepare = abort_prepare,
        .commit = abort_commit,
    },
2194 2195 2196 2197
    [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC] = {
        .instance_size = sizeof(InternalSnapshotState),
        .prepare  = internal_snapshot_prepare,
        .abort = internal_snapshot_abort,
2198
        .clean = internal_snapshot_clean,
2199
    },
F
Fam Zheng 已提交
2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210
    [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ADD] = {
        .instance_size = sizeof(BlockDirtyBitmapState),
        .prepare = block_dirty_bitmap_add_prepare,
        .abort = block_dirty_bitmap_add_abort,
    },
    [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_CLEAR] = {
        .instance_size = sizeof(BlockDirtyBitmapState),
        .prepare = block_dirty_bitmap_clear_prepare,
        .commit = block_dirty_bitmap_clear_commit,
        .abort = block_dirty_bitmap_clear_abort,
    }
2211 2212
};

J
John Snow 已提交
2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
/**
 * Allocate a TransactionProperties structure if necessary, and fill
 * that structure with desired defaults if they are unset.
 */
static TransactionProperties *get_transaction_properties(
    TransactionProperties *props)
{
    if (!props) {
        props = g_new0(TransactionProperties, 1);
    }

    if (!props->has_completion_mode) {
        props->has_completion_mode = true;
        props->completion_mode = ACTION_COMPLETION_MODE_INDIVIDUAL;
    }

    return props;
}

2232
/*
2233 2234
 * 'Atomic' group operations.  The operations are performed as a set, and if
 * any fail then we roll back all operations in the group.
2235
 */
J
John Snow 已提交
2236 2237 2238 2239
void qmp_transaction(TransactionActionList *dev_list,
                     bool has_props,
                     struct TransactionProperties *props,
                     Error **errp)
2240
{
2241
    TransactionActionList *dev_entry = dev_list;
J
John Snow 已提交
2242
    BlockJobTxn *block_job_txn = NULL;
2243
    BlkActionState *state, *next;
2244
    Error *local_err = NULL;
2245

2246
    QSIMPLEQ_HEAD(snap_bdrv_states, BlkActionState) snap_bdrv_states;
2247 2248
    QSIMPLEQ_INIT(&snap_bdrv_states);

J
John Snow 已提交
2249 2250 2251 2252 2253 2254 2255 2256
    /* Does this transaction get canceled as a group on failure?
     * If not, we don't really need to make a BlockJobTxn.
     */
    props = get_transaction_properties(props);
    if (props->completion_mode != ACTION_COMPLETION_MODE_INDIVIDUAL) {
        block_job_txn = block_job_txn_new();
    }

2257
    /* drain all i/o before any operations */
2258 2259
    bdrv_drain_all();

2260
    /* We don't do anything in this loop that commits us to the operations */
2261
    while (NULL != dev_entry) {
2262
        TransactionAction *dev_info = NULL;
2263
        const BlkActionOps *ops;
2264

2265 2266 2267
        dev_info = dev_entry->value;
        dev_entry = dev_entry->next;

2268
        assert(dev_info->type < ARRAY_SIZE(actions));
2269

2270
        ops = &actions[dev_info->type];
2271 2272
        assert(ops->instance_size > 0);

2273 2274 2275
        state = g_malloc0(ops->instance_size);
        state->ops = ops;
        state->action = dev_info;
J
John Snow 已提交
2276 2277
        state->block_job_txn = block_job_txn;
        state->txn_props = props;
2278
        QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, state, entry);
2279

2280
        state->ops->prepare(state, &local_err);
2281
        if (local_err) {
2282 2283
            error_propagate(errp, local_err);
            goto delete_and_fail;
2284 2285 2286
        }
    }

2287
    QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
2288 2289 2290
        if (state->ops->commit) {
            state->ops->commit(state);
        }
2291 2292 2293 2294 2295 2296
    }

    /* success */
    goto exit;

delete_and_fail:
2297
    /* failure, and it is all-or-none; roll back all operations */
2298 2299 2300
    QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
        if (state->ops->abort) {
            state->ops->abort(state);
2301
        }
2302 2303
    }
exit:
2304 2305 2306
    QSIMPLEQ_FOREACH_SAFE(state, &snap_bdrv_states, entry, next) {
        if (state->ops->clean) {
            state->ops->clean(state);
2307
        }
2308
        g_free(state);
2309
    }
J
John Snow 已提交
2310 2311 2312 2313
    if (!has_props) {
        qapi_free_TransactionProperties(props);
    }
    block_job_txn_unref(block_job_txn);
2314 2315
}

2316 2317 2318
void qmp_eject(bool has_device, const char *device,
               bool has_id, const char *id,
               bool has_force, bool force, Error **errp)
2319
{
2320
    Error *local_err = NULL;
2321 2322 2323 2324 2325
    int rc;

    if (!has_force) {
        force = false;
    }
2326

2327 2328 2329
    rc = do_open_tray(has_device ? device : NULL,
                      has_id ? id : NULL,
                      force, &local_err);
2330
    if (rc && rc != -ENOSYS) {
2331
        error_propagate(errp, local_err);
L
Luiz Capitulino 已提交
2332
        return;
2333
    }
2334
    error_free(local_err);
2335

2336
    blockdev_remove_medium(has_device, device, has_id, id, errp);
2337 2338
}

2339 2340 2341
void qmp_block_passwd(bool has_device, const char *device,
                      bool has_node_name, const char *node_name,
                      const char *password, Error **errp)
2342
{
2343 2344
    error_setg(errp,
               "Setting block passwords directly is no longer supported");
2345 2346
}

2347 2348 2349 2350 2351 2352 2353 2354 2355 2356
/*
 * Attempt to open the tray of @device.
 * If @force, ignore its tray lock.
 * Else, if the tray is locked, don't open it, but ask the guest to open it.
 * On error, store an error through @errp and return -errno.
 * If @device does not exist, return -ENODEV.
 * If it has no removable media, return -ENOTSUP.
 * If it has no tray, return -ENOSYS.
 * If the guest was asked to open the tray, return -EINPROGRESS.
 * Else, return 0.
2357
 */
2358 2359
static int do_open_tray(const char *blk_name, const char *qdev_id,
                        bool force, Error **errp)
M
Max Reitz 已提交
2360 2361
{
    BlockBackend *blk;
2362
    const char *device = qdev_id ?: blk_name;
M
Max Reitz 已提交
2363 2364
    bool locked;

2365
    blk = qmp_get_blk(blk_name, qdev_id, errp);
M
Max Reitz 已提交
2366
    if (!blk) {
2367
        return -ENODEV;
M
Max Reitz 已提交
2368 2369 2370 2371
    }

    if (!blk_dev_has_removable_media(blk)) {
        error_setg(errp, "Device '%s' is not removable", device);
2372
        return -ENOTSUP;
M
Max Reitz 已提交
2373 2374
    }

2375
    if (!blk_dev_has_tray(blk)) {
2376 2377
        error_setg(errp, "Device '%s' does not have a tray", device);
        return -ENOSYS;
2378 2379
    }

M
Max Reitz 已提交
2380
    if (blk_dev_is_tray_open(blk)) {
2381
        return 0;
M
Max Reitz 已提交
2382 2383 2384 2385 2386 2387 2388 2389
    }

    locked = blk_dev_is_medium_locked(blk);
    if (locked) {
        blk_dev_eject_request(blk, force);
    }

    if (!locked || force) {
2390
        blk_dev_change_media_cb(blk, false, &error_abort);
M
Max Reitz 已提交
2391
    }
2392 2393

    if (locked && !force) {
2394 2395 2396
        error_setg(errp, "Device '%s' is locked and force was not specified, "
                   "wait for tray to open and try again", device);
        return -EINPROGRESS;
2397 2398 2399 2400 2401
    }

    return 0;
}

2402 2403 2404
void qmp_blockdev_open_tray(bool has_device, const char *device,
                            bool has_id, const char *id,
                            bool has_force, bool force,
2405 2406
                            Error **errp)
{
2407 2408 2409
    Error *local_err = NULL;
    int rc;

2410 2411 2412
    if (!has_force) {
        force = false;
    }
2413 2414 2415
    rc = do_open_tray(has_device ? device : NULL,
                      has_id ? id : NULL,
                      force, &local_err);
2416 2417 2418 2419 2420
    if (rc && rc != -ENOSYS && rc != -EINPROGRESS) {
        error_propagate(errp, local_err);
        return;
    }
    error_free(local_err);
M
Max Reitz 已提交
2421 2422
}

2423 2424 2425
void qmp_blockdev_close_tray(bool has_device, const char *device,
                             bool has_id, const char *id,
                             Error **errp)
M
Max Reitz 已提交
2426 2427
{
    BlockBackend *blk;
2428
    Error *local_err = NULL;
M
Max Reitz 已提交
2429

2430 2431 2432 2433
    device = has_device ? device : NULL;
    id = has_id ? id : NULL;

    blk = qmp_get_blk(device, id, errp);
M
Max Reitz 已提交
2434 2435 2436 2437 2438
    if (!blk) {
        return;
    }

    if (!blk_dev_has_removable_media(blk)) {
2439
        error_setg(errp, "Device '%s' is not removable", device ?: id);
M
Max Reitz 已提交
2440 2441 2442
        return;
    }

2443 2444 2445 2446 2447
    if (!blk_dev_has_tray(blk)) {
        /* Ignore this command on tray-less devices */
        return;
    }

M
Max Reitz 已提交
2448 2449 2450 2451
    if (!blk_dev_is_tray_open(blk)) {
        return;
    }

2452 2453 2454 2455 2456
    blk_dev_change_media_cb(blk, true, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }
M
Max Reitz 已提交
2457 2458
}

2459 2460
static void blockdev_remove_medium(bool has_device, const char *device,
                                   bool has_id, const char *id, Error **errp)
M
Max Reitz 已提交
2461 2462 2463 2464
{
    BlockBackend *blk;
    BlockDriverState *bs;
    AioContext *aio_context;
2465
    bool has_attached_device;
M
Max Reitz 已提交
2466

2467 2468 2469 2470
    device = has_device ? device : NULL;
    id = has_id ? id : NULL;

    blk = qmp_get_blk(device, id, errp);
M
Max Reitz 已提交
2471 2472 2473 2474 2475
    if (!blk) {
        return;
    }

    /* For BBs without a device, we can exchange the BDS tree at will */
2476
    has_attached_device = blk_get_attached_dev(blk);
M
Max Reitz 已提交
2477

2478 2479
    if (has_attached_device && !blk_dev_has_removable_media(blk)) {
        error_setg(errp, "Device '%s' is not removable", device ?: id);
M
Max Reitz 已提交
2480 2481 2482
        return;
    }

2483 2484 2485 2486
    if (has_attached_device && blk_dev_has_tray(blk) &&
        !blk_dev_is_tray_open(blk))
    {
        error_setg(errp, "Tray of device '%s' is not open", device ?: id);
M
Max Reitz 已提交
2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503
        return;
    }

    bs = blk_bs(blk);
    if (!bs) {
        return;
    }

    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) {
        goto out;
    }

    blk_remove_bs(blk);

2504 2505 2506 2507 2508
    if (!blk_dev_has_tray(blk)) {
        /* For tray-less devices, blockdev-open-tray is a no-op (or may not be
         * called at all); therefore, the medium needs to be ejected here.
         * Do it after blk_remove_bs() so blk_is_inserted(blk) returns the @load
         * value passed here (i.e. false). */
2509
        blk_dev_change_media_cb(blk, false, &error_abort);
2510 2511
    }

M
Max Reitz 已提交
2512 2513 2514 2515
out:
    aio_context_release(aio_context);
}

2516
void qmp_blockdev_remove_medium(const char *id, Error **errp)
2517 2518 2519 2520
{
    blockdev_remove_medium(false, NULL, true, id, errp);
}

2521
static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
M
Max Reitz 已提交
2522 2523
                                            BlockDriverState *bs, Error **errp)
{
2524
    Error *local_err = NULL;
M
Max Reitz 已提交
2525
    bool has_device;
2526
    int ret;
M
Max Reitz 已提交
2527 2528 2529 2530 2531

    /* For BBs without a device, we can exchange the BDS tree at will */
    has_device = blk_get_attached_dev(blk);

    if (has_device && !blk_dev_has_removable_media(blk)) {
2532
        error_setg(errp, "Device is not removable");
M
Max Reitz 已提交
2533 2534 2535
        return;
    }

2536
    if (has_device && blk_dev_has_tray(blk) && !blk_dev_is_tray_open(blk)) {
2537
        error_setg(errp, "Tray of the device is not open");
M
Max Reitz 已提交
2538 2539 2540 2541
        return;
    }

    if (blk_bs(blk)) {
2542
        error_setg(errp, "There already is a medium in the device");
M
Max Reitz 已提交
2543 2544 2545
        return;
    }

2546 2547 2548 2549
    ret = blk_insert_bs(blk, bs, errp);
    if (ret < 0) {
        return;
    }
M
Max Reitz 已提交
2550

2551 2552 2553 2554 2555 2556
    if (!blk_dev_has_tray(blk)) {
        /* For tray-less devices, blockdev-close-tray is a no-op (or may not be
         * called at all); therefore, the medium needs to be pushed into the
         * slot here.
         * Do it after blk_insert_bs() so blk_is_inserted(blk) returns the @load
         * value passed here (i.e. true). */
2557 2558 2559 2560 2561 2562
        blk_dev_change_media_cb(blk, true, &local_err);
        if (local_err) {
            error_propagate(errp, local_err);
            blk_remove_bs(blk);
            return;
        }
2563
    }
M
Max Reitz 已提交
2564 2565
}

2566 2567 2568
static void blockdev_insert_medium(bool has_device, const char *device,
                                   bool has_id, const char *id,
                                   const char *node_name, Error **errp)
M
Max Reitz 已提交
2569
{
2570
    BlockBackend *blk;
M
Max Reitz 已提交
2571 2572
    BlockDriverState *bs;

2573 2574 2575 2576 2577 2578 2579
    blk = qmp_get_blk(has_device ? device : NULL,
                      has_id ? id : NULL,
                      errp);
    if (!blk) {
        return;
    }

M
Max Reitz 已提交
2580 2581 2582 2583 2584 2585
    bs = bdrv_find_node(node_name);
    if (!bs) {
        error_setg(errp, "Node '%s' not found", node_name);
        return;
    }

K
Kevin Wolf 已提交
2586
    if (bdrv_has_blk(bs)) {
2587
        error_setg(errp, "Node '%s' is already in use", node_name);
M
Max Reitz 已提交
2588 2589 2590
        return;
    }

2591
    qmp_blockdev_insert_anon_medium(blk, bs, errp);
M
Max Reitz 已提交
2592 2593
}

2594 2595
void qmp_blockdev_insert_medium(const char *id, const char *node_name,
                                Error **errp)
2596 2597 2598 2599
{
    blockdev_insert_medium(false, NULL, true, id, node_name, errp);
}

2600 2601 2602
void qmp_blockdev_change_medium(bool has_device, const char *device,
                                bool has_id, const char *id,
                                const char *filename,
M
Max Reitz 已提交
2603
                                bool has_format, const char *format,
2604 2605
                                bool has_read_only,
                                BlockdevChangeReadOnlyMode read_only,
M
Max Reitz 已提交
2606
                                Error **errp)
2607 2608 2609
{
    BlockBackend *blk;
    BlockDriverState *medium_bs = NULL;
M
Max Reitz 已提交
2610
    int bdrv_flags;
2611
    bool detect_zeroes;
2612
    int rc;
2613 2614 2615
    QDict *options = NULL;
    Error *err = NULL;

2616 2617 2618
    blk = qmp_get_blk(has_device ? device : NULL,
                      has_id ? id : NULL,
                      errp);
2619 2620 2621 2622 2623 2624 2625 2626 2627
    if (!blk) {
        goto fail;
    }

    if (blk_bs(blk)) {
        blk_update_root_state(blk);
    }

    bdrv_flags = blk_get_open_flags_from_root_state(blk);
2628 2629
    bdrv_flags &= ~(BDRV_O_TEMPORARY | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING |
        BDRV_O_PROTOCOL);
2630

2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650
    if (!has_read_only) {
        read_only = BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN;
    }

    switch (read_only) {
    case BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN:
        break;

    case BLOCKDEV_CHANGE_READ_ONLY_MODE_READ_ONLY:
        bdrv_flags &= ~BDRV_O_RDWR;
        break;

    case BLOCKDEV_CHANGE_READ_ONLY_MODE_READ_WRITE:
        bdrv_flags |= BDRV_O_RDWR;
        break;

    default:
        abort();
    }

2651 2652
    options = qdict_new();
    detect_zeroes = blk_get_detect_zeroes_from_root_state(blk);
2653
    qdict_put_str(options, "detect-zeroes", detect_zeroes ? "on" : "off");
2654

M
Max Reitz 已提交
2655
    if (has_format) {
2656
        qdict_put_str(options, "driver", format);
2657 2658
    }

M
Max Reitz 已提交
2659 2660
    medium_bs = bdrv_open(filename, NULL, options, bdrv_flags, errp);
    if (!medium_bs) {
2661 2662 2663
        goto fail;
    }

2664 2665 2666
    rc = do_open_tray(has_device ? device : NULL,
                      has_id ? id : NULL,
                      false, &err);
2667
    if (rc && rc != -ENOSYS) {
2668 2669 2670
        error_propagate(errp, err);
        goto fail;
    }
2671 2672
    error_free(err);
    err = NULL;
2673

2674
    blockdev_remove_medium(has_device, device, has_id, id, &err);
2675 2676 2677 2678 2679
    if (err) {
        error_propagate(errp, err);
        goto fail;
    }

2680
    qmp_blockdev_insert_anon_medium(blk, medium_bs, &err);
2681 2682 2683 2684 2685
    if (err) {
        error_propagate(errp, err);
        goto fail;
    }

2686
    qmp_blockdev_close_tray(has_device, device, has_id, id, errp);
2687 2688 2689 2690 2691 2692 2693 2694

fail:
    /* If the medium has been inserted, the device has its own reference, so
     * ours must be relinquished; and if it has not been inserted successfully,
     * the reference must be relinquished anyway */
    bdrv_unref(medium_bs);
}

Z
Zhi Yong Wu 已提交
2695
/* throttling disk I/O limits */
2696
void qmp_block_set_io_throttle(BlockIOThrottle *arg, Error **errp)
Z
Zhi Yong Wu 已提交
2697
{
2698
    ThrottleConfig cfg;
Z
Zhi Yong Wu 已提交
2699
    BlockDriverState *bs;
2700
    BlockBackend *blk;
2701
    AioContext *aio_context;
Z
Zhi Yong Wu 已提交
2702

2703 2704 2705
    blk = qmp_get_blk(arg->has_device ? arg->device : NULL,
                      arg->has_id ? arg->id : NULL,
                      errp);
2706
    if (!blk) {
2707
        return;
Z
Zhi Yong Wu 已提交
2708
    }
M
Max Reitz 已提交
2709 2710 2711 2712

    aio_context = blk_get_aio_context(blk);
    aio_context_acquire(aio_context);

2713
    bs = blk_bs(blk);
M
Max Reitz 已提交
2714
    if (!bs) {
2715
        error_setg(errp, "Device has no medium");
M
Max Reitz 已提交
2716 2717
        goto out;
    }
Z
Zhi Yong Wu 已提交
2718

2719
    throttle_config_init(&cfg);
2720 2721 2722
    cfg.buckets[THROTTLE_BPS_TOTAL].avg = arg->bps;
    cfg.buckets[THROTTLE_BPS_READ].avg  = arg->bps_rd;
    cfg.buckets[THROTTLE_BPS_WRITE].avg = arg->bps_wr;
2723

2724 2725 2726
    cfg.buckets[THROTTLE_OPS_TOTAL].avg = arg->iops;
    cfg.buckets[THROTTLE_OPS_READ].avg  = arg->iops_rd;
    cfg.buckets[THROTTLE_OPS_WRITE].avg = arg->iops_wr;
2727

2728 2729
    if (arg->has_bps_max) {
        cfg.buckets[THROTTLE_BPS_TOTAL].max = arg->bps_max;
2730
    }
2731 2732
    if (arg->has_bps_rd_max) {
        cfg.buckets[THROTTLE_BPS_READ].max = arg->bps_rd_max;
2733
    }
2734 2735
    if (arg->has_bps_wr_max) {
        cfg.buckets[THROTTLE_BPS_WRITE].max = arg->bps_wr_max;
2736
    }
2737 2738
    if (arg->has_iops_max) {
        cfg.buckets[THROTTLE_OPS_TOTAL].max = arg->iops_max;
2739
    }
2740 2741
    if (arg->has_iops_rd_max) {
        cfg.buckets[THROTTLE_OPS_READ].max = arg->iops_rd_max;
2742
    }
2743 2744
    if (arg->has_iops_wr_max) {
        cfg.buckets[THROTTLE_OPS_WRITE].max = arg->iops_wr_max;
2745
    }
Z
Zhi Yong Wu 已提交
2746

2747 2748
    if (arg->has_bps_max_length) {
        cfg.buckets[THROTTLE_BPS_TOTAL].burst_length = arg->bps_max_length;
2749
    }
2750 2751
    if (arg->has_bps_rd_max_length) {
        cfg.buckets[THROTTLE_BPS_READ].burst_length = arg->bps_rd_max_length;
2752
    }
2753 2754
    if (arg->has_bps_wr_max_length) {
        cfg.buckets[THROTTLE_BPS_WRITE].burst_length = arg->bps_wr_max_length;
2755
    }
2756 2757
    if (arg->has_iops_max_length) {
        cfg.buckets[THROTTLE_OPS_TOTAL].burst_length = arg->iops_max_length;
2758
    }
2759 2760
    if (arg->has_iops_rd_max_length) {
        cfg.buckets[THROTTLE_OPS_READ].burst_length = arg->iops_rd_max_length;
2761
    }
2762 2763
    if (arg->has_iops_wr_max_length) {
        cfg.buckets[THROTTLE_OPS_WRITE].burst_length = arg->iops_wr_max_length;
2764 2765
    }

2766 2767
    if (arg->has_iops_size) {
        cfg.op_size = arg->iops_size;
2768
    }
2769

2770
    if (!throttle_is_valid(&cfg, errp)) {
M
Max Reitz 已提交
2771
        goto out;
Z
Zhi Yong Wu 已提交
2772 2773
    }

2774 2775 2776
    if (throttle_enabled(&cfg)) {
        /* Enable I/O limits if they're not enabled yet, otherwise
         * just update the throttling group. */
2777
        if (!blk_get_public(blk)->throttle_group_member.throttle_state) {
2778
            blk_io_limits_enable(blk,
2779 2780 2781
                                 arg->has_group ? arg->group :
                                 arg->has_device ? arg->device :
                                 arg->id);
2782 2783
        } else if (arg->has_group) {
            blk_io_limits_update_group(blk, arg->group);
2784 2785
        }
        /* Set the new throttling configuration */
2786
        blk_set_io_limits(blk, &cfg);
2787
    } else if (blk_get_public(blk)->throttle_group_member.throttle_state) {
2788
        /* If all throttling settings are set to 0, disable I/O limits */
2789
        blk_io_limits_disable(blk);
Z
Zhi Yong Wu 已提交
2790
    }
2791

M
Max Reitz 已提交
2792
out:
2793
    aio_context_release(aio_context);
Z
Zhi Yong Wu 已提交
2794 2795
}

2796 2797
void qmp_block_dirty_bitmap_add(const char *node, const char *name,
                                bool has_granularity, uint32_t granularity,
2798
                                bool has_persistent, bool persistent,
2799
                                bool has_autoload, bool autoload,
2800 2801 2802
                                Error **errp)
{
    BlockDriverState *bs;
2803
    BdrvDirtyBitmap *bitmap;
2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818

    if (!name || name[0] == '\0') {
        error_setg(errp, "Bitmap name cannot be empty");
        return;
    }

    bs = bdrv_lookup_bs(node, node, errp);
    if (!bs) {
        return;
    }

    if (has_granularity) {
        if (granularity < 512 || !is_power_of_2(granularity)) {
            error_setg(errp, "Granularity must be power of 2 "
                             "and at least 512");
2819
            return;
2820 2821 2822 2823 2824 2825
        }
    } else {
        /* Default to cluster size, if available: */
        granularity = bdrv_get_default_bitmap_granularity(bs);
    }

2826 2827 2828
    if (!has_persistent) {
        persistent = false;
    }
2829

2830 2831
    if (has_autoload) {
        warn_report("Autoload option is deprecated and its value is ignored");
2832
    }
2833 2834 2835 2836 2837 2838 2839 2840

    if (persistent &&
        !bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp))
    {
        return;
    }

    bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
2841 2842
    if (bitmap == NULL) {
        return;
2843
    }
2844 2845

    bdrv_dirty_bitmap_set_persistance(bitmap, persistent);
2846 2847 2848 2849 2850 2851 2852
}

void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
                                   Error **errp)
{
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;
2853
    Error *local_err = NULL;
2854

2855
    bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
2856 2857 2858 2859
    if (!bitmap || !bs) {
        return;
    }

J
John Snow 已提交
2860 2861 2862 2863
    if (bdrv_dirty_bitmap_frozen(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently frozen and cannot be removed",
                   name);
2864
        return;
J
John Snow 已提交
2865
    }
2866 2867 2868 2869 2870 2871 2872 2873 2874

    if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
        bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err);
        if (local_err != NULL) {
            error_propagate(errp, local_err);
            return;
        }
    }

2875
    bdrv_dirty_bitmap_make_anon(bitmap);
2876 2877 2878
    bdrv_release_dirty_bitmap(bs, bitmap);
}

J
John Snow 已提交
2879 2880 2881 2882 2883 2884 2885 2886 2887 2888
/**
 * Completely clear a bitmap, for the purposes of synchronizing a bitmap
 * immediately after a full backup operation.
 */
void qmp_block_dirty_bitmap_clear(const char *node, const char *name,
                                  Error **errp)
{
    BdrvDirtyBitmap *bitmap;
    BlockDriverState *bs;

2889
    bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
J
John Snow 已提交
2890 2891 2892 2893 2894 2895 2896 2897
    if (!bitmap || !bs) {
        return;
    }

    if (bdrv_dirty_bitmap_frozen(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently frozen and cannot be modified",
                   name);
2898
        return;
J
John Snow 已提交
2899 2900 2901 2902
    } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently disabled and cannot be cleared",
                   name);
2903
        return;
2904 2905 2906
    } else if (bdrv_dirty_bitmap_readonly(bitmap)) {
        error_setg(errp, "Bitmap '%s' is readonly and cannot be cleared", name);
        return;
J
John Snow 已提交
2907 2908
    }

F
Fam Zheng 已提交
2909
    bdrv_clear_dirty_bitmap(bitmap, NULL);
J
John Snow 已提交
2910 2911
}

2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936
BlockDirtyBitmapSha256 *qmp_x_debug_block_dirty_bitmap_sha256(const char *node,
                                                              const char *name,
                                                              Error **errp)
{
    BdrvDirtyBitmap *bitmap;
    BlockDriverState *bs;
    BlockDirtyBitmapSha256 *ret = NULL;
    char *sha256;

    bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
    if (!bitmap || !bs) {
        return NULL;
    }

    sha256 = bdrv_dirty_bitmap_sha256(bitmap, errp);
    if (sha256 == NULL) {
        return NULL;
    }

    ret = g_new(BlockDirtyBitmapSha256, 1);
    ret->sha256 = sha256;

    return ret;
}

2937
void hmp_drive_del(Monitor *mon, const QDict *qdict)
2938 2939
{
    const char *id = qdict_get_str(qdict, "id");
2940
    BlockBackend *blk;
2941
    BlockDriverState *bs;
2942
    AioContext *aio_context;
2943
    Error *local_err = NULL;
2944

2945 2946
    bs = bdrv_find_node(id);
    if (bs) {
2947
        qmp_blockdev_del(id, &local_err);
2948 2949 2950 2951 2952 2953
        if (local_err) {
            error_report_err(local_err);
        }
        return;
    }

2954 2955
    blk = blk_by_name(id);
    if (!blk) {
2956
        error_report("Device '%s' not found", id);
2957
        return;
2958
    }
2959

2960
    if (!blk_legacy_dinfo(blk)) {
2961 2962
        error_report("Deleting device added with blockdev-add"
                     " is not supported");
2963
        return;
2964 2965
    }

M
Max Reitz 已提交
2966
    aio_context = blk_get_aio_context(blk);
2967 2968
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2969 2970 2971 2972 2973 2974 2975
    bs = blk_bs(blk);
    if (bs) {
        if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
            error_report_err(local_err);
            aio_context_release(aio_context);
            return;
        }
2976

2977
        blk_remove_bs(blk);
M
Max Reitz 已提交
2978
    }
2979

2980
    /* Make the BlockBackend and the attached BlockDriverState anonymous */
2981 2982
    monitor_remove_blk(blk);

2983 2984
    /* If this BlockBackend has a device attached to it, its refcount will be
     * decremented when the device is removed; otherwise we have to do so here.
2985
     */
2986
    if (blk_get_attached_dev(blk)) {
2987
        /* Further I/O must not pause the guest */
2988 2989
        blk_set_on_error(blk, BLOCKDEV_ON_ERROR_REPORT,
                         BLOCKDEV_ON_ERROR_REPORT);
2990
    } else {
2991
        blk_unref(blk);
2992 2993
    }

2994
    aio_context_release(aio_context);
2995
}
2996

2997 2998 2999
void qmp_block_resize(bool has_device, const char *device,
                      bool has_node_name, const char *node_name,
                      int64_t size, Error **errp)
3000
{
3001
    Error *local_err = NULL;
3002
    BlockBackend *blk = NULL;
3003
    BlockDriverState *bs;
3004
    AioContext *aio_context;
3005
    int ret;
3006

3007 3008 3009
    bs = bdrv_lookup_bs(has_device ? device : NULL,
                        has_node_name ? node_name : NULL,
                        &local_err);
3010
    if (local_err) {
3011 3012 3013 3014
        error_propagate(errp, local_err);
        return;
    }

3015 3016 3017
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

3018
    if (!bdrv_is_first_non_filter(bs)) {
3019
        error_setg(errp, QERR_FEATURE_DISABLED, "resize");
3020
        goto out;
3021 3022 3023
    }

    if (size < 0) {
3024
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 size");
3025
        goto out;
3026 3027
    }

3028
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, NULL)) {
3029
        error_setg(errp, QERR_DEVICE_IN_USE, device);
3030
        goto out;
3031 3032
    }

K
Kevin Wolf 已提交
3033
    blk = blk_new(BLK_PERM_RESIZE, BLK_PERM_ALL);
3034 3035 3036 3037
    ret = blk_insert_bs(blk, bs, errp);
    if (ret < 0) {
        goto out;
    }
3038

3039
    bdrv_drained_begin(bs);
3040
    ret = blk_truncate(blk, size, PREALLOC_MODE_OFF, errp);
3041
    bdrv_drained_end(bs);
3042 3043

out:
3044
    blk_unref(blk);
3045
    aio_context_release(aio_context);
3046
}
S
Stefan Hajnoczi 已提交
3047

3048
void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
3049
                      bool has_base, const char *base,
3050
                      bool has_base_node, const char *base_node,
3051 3052
                      bool has_backing_file, const char *backing_file,
                      bool has_speed, int64_t speed,
P
Paolo Bonzini 已提交
3053 3054
                      bool has_on_error, BlockdevOnError on_error,
                      Error **errp)
S
Stefan Hajnoczi 已提交
3055
{
3056
    BlockDriverState *bs, *iter;
3057
    BlockDriverState *base_bs = NULL;
3058
    AioContext *aio_context;
3059
    Error *local_err = NULL;
3060
    const char *base_name = NULL;
S
Stefan Hajnoczi 已提交
3061

P
Paolo Bonzini 已提交
3062 3063 3064 3065
    if (!has_on_error) {
        on_error = BLOCKDEV_ON_ERROR_REPORT;
    }

3066
    bs = bdrv_lookup_bs(device, device, errp);
3067
    if (!bs) {
S
Stefan Hajnoczi 已提交
3068 3069 3070
        return;
    }

3071
    aio_context = bdrv_get_aio_context(bs);
3072 3073
    aio_context_acquire(aio_context);

3074 3075 3076 3077 3078 3079
    if (has_base && has_base_node) {
        error_setg(errp, "'base' and 'base-node' cannot be specified "
                   "at the same time");
        goto out;
    }

3080
    if (has_base) {
3081 3082
        base_bs = bdrv_find_backing_image(bs, base);
        if (base_bs == NULL) {
3083
            error_setg(errp, QERR_BASE_NOT_FOUND, base);
3084
            goto out;
3085
        }
3086
        assert(bdrv_get_aio_context(base_bs) == aio_context);
3087
        base_name = base;
S
Stefan Hajnoczi 已提交
3088 3089
    }

3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103
    if (has_base_node) {
        base_bs = bdrv_lookup_bs(NULL, base_node, errp);
        if (!base_bs) {
            goto out;
        }
        if (bs == base_bs || !bdrv_chain_contains(bs, base_bs)) {
            error_setg(errp, "Node '%s' is not a backing image of '%s'",
                       base_node, device);
            goto out;
        }
        assert(bdrv_get_aio_context(base_bs) == aio_context);
        base_name = base_bs->filename;
    }

3104 3105 3106 3107 3108 3109 3110
    /* Check for op blockers in the whole chain between bs and base */
    for (iter = bs; iter && iter != base_bs; iter = backing_bs(iter)) {
        if (bdrv_op_is_blocked(iter, BLOCK_OP_TYPE_STREAM, errp)) {
            goto out;
        }
    }

3111 3112 3113 3114 3115
    /* if we are streaming the entire chain, the result will have no backing
     * file, and specifying one is therefore an error */
    if (base_bs == NULL && has_backing_file) {
        error_setg(errp, "backing file specified, but streaming the "
                         "entire chain");
3116
        goto out;
3117 3118 3119 3120 3121
    }

    /* backing_file string overrides base bs filename */
    base_name = has_backing_file ? backing_file : base_name;

3122
    stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
3123
                 has_speed ? speed : 0, on_error, &local_err);
3124
    if (local_err) {
3125
        error_propagate(errp, local_err);
3126
        goto out;
S
Stefan Hajnoczi 已提交
3127 3128 3129
    }

    trace_qmp_block_stream(bs, bs->job);
3130 3131 3132

out:
    aio_context_release(aio_context);
S
Stefan Hajnoczi 已提交
3133
}
3134

3135
void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
3136 3137
                      bool has_base, const char *base,
                      bool has_top, const char *top,
3138
                      bool has_backing_file, const char *backing_file,
3139
                      bool has_speed, int64_t speed,
3140
                      bool has_filter_node_name, const char *filter_node_name,
3141 3142 3143
                      Error **errp)
{
    BlockDriverState *bs;
3144
    BlockDriverState *iter;
3145
    BlockDriverState *base_bs, *top_bs;
3146
    AioContext *aio_context;
3147 3148 3149 3150
    Error *local_err = NULL;
    /* This will be part of the QMP command, if/when the
     * BlockdevOnError change for blkmirror makes it in
     */
3151
    BlockdevOnError on_error = BLOCKDEV_ON_ERROR_REPORT;
3152

3153 3154 3155
    if (!has_speed) {
        speed = 0;
    }
3156 3157 3158
    if (!has_filter_node_name) {
        filter_node_name = NULL;
    }
3159

3160 3161 3162 3163 3164
    /* Important Note:
     *  libvirt relies on the DeviceNotFound error class in order to probe for
     *  live commit feature versions; for this to work, we must make sure to
     *  perform the device lookup before any generic errors that may occur in a
     *  scenario in which all optional arguments are omitted. */
3165 3166 3167 3168 3169 3170 3171 3172 3173 3174
    bs = qmp_get_root_bs(device, &local_err);
    if (!bs) {
        bs = bdrv_lookup_bs(device, device, NULL);
        if (!bs) {
            error_free(local_err);
            error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                      "Device '%s' not found", device);
        } else {
            error_propagate(errp, local_err);
        }
3175
        return;
3176 3177
    }

3178
    aio_context = bdrv_get_aio_context(bs);
3179 3180
    aio_context_acquire(aio_context);

3181
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, errp)) {
3182
        goto out;
3183 3184 3185 3186 3187
    }

    /* default top_bs is the active layer */
    top_bs = bs;

3188
    if (has_top && top) {
3189 3190 3191 3192 3193 3194 3195
        if (strcmp(bs->filename, top) != 0) {
            top_bs = bdrv_find_backing_image(bs, top);
        }
    }

    if (top_bs == NULL) {
        error_setg(errp, "Top image file %s not found", top ? top : "NULL");
3196
        goto out;
3197 3198
    }

3199 3200
    assert(bdrv_get_aio_context(top_bs) == aio_context);

3201 3202 3203 3204 3205 3206 3207
    if (has_base && base) {
        base_bs = bdrv_find_backing_image(top_bs, base);
    } else {
        base_bs = bdrv_find_base(top_bs);
    }

    if (base_bs == NULL) {
3208
        error_setg(errp, QERR_BASE_NOT_FOUND, base ? base : "NULL");
3209
        goto out;
3210 3211
    }

3212 3213
    assert(bdrv_get_aio_context(base_bs) == aio_context);

3214 3215 3216 3217
    for (iter = top_bs; iter != backing_bs(base_bs); iter = backing_bs(iter)) {
        if (bdrv_op_is_blocked(iter, BLOCK_OP_TYPE_COMMIT_TARGET, errp)) {
            goto out;
        }
3218 3219
    }

3220 3221 3222
    /* Do not allow attempts to commit an image into itself */
    if (top_bs == base_bs) {
        error_setg(errp, "cannot commit an image into itself");
3223
        goto out;
3224 3225
    }

F
Fam Zheng 已提交
3226
    if (top_bs == bs) {
3227 3228 3229
        if (has_backing_file) {
            error_setg(errp, "'backing-file' specified,"
                             " but 'top' is the active layer");
3230
            goto out;
3231
        }
3232
        commit_active_start(has_job_id ? job_id : NULL, bs, base_bs,
3233
                            BLOCK_JOB_DEFAULT, speed, on_error,
3234
                            filter_node_name, NULL, NULL, false, &local_err);
F
Fam Zheng 已提交
3235
    } else {
3236 3237 3238 3239
        BlockDriverState *overlay_bs = bdrv_find_overlay(bs, top_bs);
        if (bdrv_op_is_blocked(overlay_bs, BLOCK_OP_TYPE_COMMIT_TARGET, errp)) {
            goto out;
        }
3240
        commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, speed,
3241
                     on_error, has_backing_file ? backing_file : NULL,
3242
                     filter_node_name, &local_err);
F
Fam Zheng 已提交
3243
    }
3244 3245
    if (local_err != NULL) {
        error_propagate(errp, local_err);
3246
        goto out;
3247
    }
3248 3249 3250

out:
    aio_context_release(aio_context);
3251 3252
}

3253 3254
static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
                                 Error **errp)
3255 3256 3257
{
    BlockDriverState *bs;
    BlockDriverState *target_bs;
3258
    BlockDriverState *source = NULL;
3259
    BlockJob *job = NULL;
3260
    BdrvDirtyBitmap *bmap = NULL;
3261
    AioContext *aio_context;
3262
    QDict *options = NULL;
3263 3264 3265
    Error *local_err = NULL;
    int flags;
    int64_t size;
3266
    bool set_backing_hd = false;
3267

P
Pavel Butsykin 已提交
3268 3269
    if (!backup->has_speed) {
        backup->speed = 0;
3270
    }
P
Pavel Butsykin 已提交
3271 3272
    if (!backup->has_on_source_error) {
        backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT;
3273
    }
P
Pavel Butsykin 已提交
3274 3275
    if (!backup->has_on_target_error) {
        backup->on_target_error = BLOCKDEV_ON_ERROR_REPORT;
3276
    }
P
Pavel Butsykin 已提交
3277 3278 3279 3280 3281
    if (!backup->has_mode) {
        backup->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
    }
    if (!backup->has_job_id) {
        backup->job_id = NULL;
3282
    }
3283 3284 3285
    if (!backup->has_compress) {
        backup->compress = false;
    }
3286

P
Pavel Butsykin 已提交
3287
    bs = qmp_get_root_bs(backup->device, errp);
3288
    if (!bs) {
3289
        return NULL;
3290 3291
    }

3292
    aio_context = bdrv_get_aio_context(bs);
3293 3294
    aio_context_acquire(aio_context);

P
Pavel Butsykin 已提交
3295 3296 3297
    if (!backup->has_format) {
        backup->format = backup->mode == NEW_IMAGE_MODE_EXISTING ?
                         NULL : (char*) bs->drv->format_name;
3298 3299
    }

F
Fam Zheng 已提交
3300
    /* Early check to avoid creating target */
3301
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
3302
        goto out;
3303 3304
    }

K
Kevin Wolf 已提交
3305
    flags = bs->open_flags | BDRV_O_RDWR;
3306

3307 3308
    /* See if we have a backing HD we can use to create our new image
     * on top of. */
P
Pavel Butsykin 已提交
3309
    if (backup->sync == MIRROR_SYNC_MODE_TOP) {
3310
        source = backing_bs(bs);
3311
        if (!source) {
P
Pavel Butsykin 已提交
3312
            backup->sync = MIRROR_SYNC_MODE_FULL;
3313 3314
        }
    }
P
Pavel Butsykin 已提交
3315
    if (backup->sync == MIRROR_SYNC_MODE_NONE) {
3316
        source = bs;
3317 3318
        flags |= BDRV_O_NO_BACKING;
        set_backing_hd = true;
3319 3320
    }

3321 3322 3323
    size = bdrv_getlength(bs);
    if (size < 0) {
        error_setg_errno(errp, -size, "bdrv_getlength failed");
3324
        goto out;
3325 3326
    }

P
Pavel Butsykin 已提交
3327 3328
    if (backup->mode != NEW_IMAGE_MODE_EXISTING) {
        assert(backup->format);
3329
        if (source) {
P
Pavel Butsykin 已提交
3330
            bdrv_img_create(backup->target, backup->format, source->filename,
3331
                            source->drv->format_name, NULL,
3332
                            size, flags, false, &local_err);
3333
        } else {
P
Pavel Butsykin 已提交
3334
            bdrv_img_create(backup->target, backup->format, NULL, NULL, NULL,
3335
                            size, flags, false, &local_err);
3336
        }
3337 3338
    }

3339
    if (local_err) {
3340
        error_propagate(errp, local_err);
3341
        goto out;
3342 3343
    }

P
Pavel Butsykin 已提交
3344
    if (backup->format) {
3345 3346 3347
        if (!options) {
            options = qdict_new();
        }
3348
        qdict_put_str(options, "driver", backup->format);
3349 3350
    }

P
Pavel Butsykin 已提交
3351
    target_bs = bdrv_open(backup->target, NULL, options, flags, errp);
M
Max Reitz 已提交
3352
    if (!target_bs) {
3353
        goto out;
3354 3355
    }

3356 3357
    bdrv_set_aio_context(target_bs, aio_context);

3358 3359 3360 3361 3362 3363 3364 3365
    if (set_backing_hd) {
        bdrv_set_backing_hd(target_bs, source, &local_err);
        if (local_err) {
            bdrv_unref(target_bs);
            goto out;
        }
    }

P
Pavel Butsykin 已提交
3366 3367
    if (backup->has_bitmap) {
        bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap);
3368
        if (!bmap) {
P
Pavel Butsykin 已提交
3369
            error_setg(errp, "Bitmap '%s' could not be found", backup->bitmap);
3370
            bdrv_unref(target_bs);
3371 3372 3373 3374
            goto out;
        }
    }

3375 3376 3377 3378
    job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
                            backup->sync, bmap, backup->compress,
                            backup->on_source_error, backup->on_target_error,
                            BLOCK_JOB_DEFAULT, NULL, NULL, txn, &local_err);
K
Kevin Wolf 已提交
3379
    bdrv_unref(target_bs);
3380 3381
    if (local_err != NULL) {
        error_propagate(errp, local_err);
3382
        goto out;
3383
    }
3384 3385 3386

out:
    aio_context_release(aio_context);
3387
    return job;
3388 3389
}

P
Pavel Butsykin 已提交
3390
void qmp_drive_backup(DriveBackup *arg, Error **errp)
3391
{
3392 3393 3394 3395 3396 3397

    BlockJob *job;
    job = do_drive_backup(arg, NULL, errp);
    if (job) {
        block_job_start(job);
    }
3398 3399
}

3400 3401
BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
{
3402
    return bdrv_named_nodes_list(errp);
3403 3404
}

3405 3406
BlockJob *do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
                             Error **errp)
F
Fam Zheng 已提交
3407 3408 3409 3410 3411
{
    BlockDriverState *bs;
    BlockDriverState *target_bs;
    Error *local_err = NULL;
    AioContext *aio_context;
3412
    BlockJob *job = NULL;
F
Fam Zheng 已提交
3413

P
Pavel Butsykin 已提交
3414 3415
    if (!backup->has_speed) {
        backup->speed = 0;
F
Fam Zheng 已提交
3416
    }
P
Pavel Butsykin 已提交
3417 3418 3419 3420 3421
    if (!backup->has_on_source_error) {
        backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!backup->has_on_target_error) {
        backup->on_target_error = BLOCKDEV_ON_ERROR_REPORT;
F
Fam Zheng 已提交
3422
    }
P
Pavel Butsykin 已提交
3423 3424
    if (!backup->has_job_id) {
        backup->job_id = NULL;
F
Fam Zheng 已提交
3425
    }
3426 3427 3428
    if (!backup->has_compress) {
        backup->compress = false;
    }
F
Fam Zheng 已提交
3429

P
Pavel Butsykin 已提交
3430
    bs = qmp_get_root_bs(backup->device, errp);
3431
    if (!bs) {
3432
        return NULL;
F
Fam Zheng 已提交
3433 3434
    }

3435
    aio_context = bdrv_get_aio_context(bs);
F
Fam Zheng 已提交
3436 3437
    aio_context_acquire(aio_context);

P
Pavel Butsykin 已提交
3438
    target_bs = bdrv_lookup_bs(backup->target, backup->target, errp);
3439
    if (!target_bs) {
M
Max Reitz 已提交
3440 3441
        goto out;
    }
F
Fam Zheng 已提交
3442

3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453
    if (bdrv_get_aio_context(target_bs) != aio_context) {
        if (!bdrv_has_blk(target_bs)) {
            /* The target BDS is not attached, we can safely move it to another
             * AioContext. */
            bdrv_set_aio_context(target_bs, aio_context);
        } else {
            error_setg(errp, "Target is attached to a different thread from "
                             "source.");
            goto out;
        }
    }
3454 3455 3456 3457
    job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
                            backup->sync, NULL, backup->compress,
                            backup->on_source_error, backup->on_target_error,
                            BLOCK_JOB_DEFAULT, NULL, NULL, txn, &local_err);
F
Fam Zheng 已提交
3458 3459 3460 3461 3462
    if (local_err != NULL) {
        error_propagate(errp, local_err);
    }
out:
    aio_context_release(aio_context);
3463
    return job;
F
Fam Zheng 已提交
3464 3465
}

P
Pavel Butsykin 已提交
3466 3467
void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
{
3468 3469 3470 3471 3472
    BlockJob *job;
    job = do_blockdev_backup(arg, NULL, errp);
    if (job) {
        block_job_start(job);
    }
3473 3474
}

3475 3476 3477
/* Parameter check and block job starting for drive mirroring.
 * Caller should hold @device and @target's aio context (must be the same).
 **/
3478
static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
3479 3480 3481
                                   BlockDriverState *target,
                                   bool has_replaces, const char *replaces,
                                   enum MirrorSyncMode sync,
M
Max Reitz 已提交
3482
                                   BlockMirrorBackingMode backing_mode,
3483 3484 3485 3486 3487 3488 3489 3490
                                   bool has_speed, int64_t speed,
                                   bool has_granularity, uint32_t granularity,
                                   bool has_buf_size, int64_t buf_size,
                                   bool has_on_source_error,
                                   BlockdevOnError on_source_error,
                                   bool has_on_target_error,
                                   BlockdevOnError on_target_error,
                                   bool has_unmap, bool unmap,
3491 3492
                                   bool has_filter_node_name,
                                   const char *filter_node_name,
3493
                                   Error **errp)
P
Paolo Bonzini 已提交
3494 3495 3496 3497 3498
{

    if (!has_speed) {
        speed = 0;
    }
3499 3500 3501 3502 3503 3504
    if (!has_on_source_error) {
        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_on_target_error) {
        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
    }
3505 3506 3507
    if (!has_granularity) {
        granularity = 0;
    }
3508
    if (!has_buf_size) {
W
Wen Congyang 已提交
3509
        buf_size = 0;
3510
    }
3511 3512 3513
    if (!has_unmap) {
        unmap = true;
    }
3514 3515 3516
    if (!has_filter_node_name) {
        filter_node_name = NULL;
    }
3517

3518
    if (granularity != 0 && (granularity < 512 || granularity > 1048576 * 64)) {
3519 3520
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity",
                   "a value in range [512B, 64MB]");
3521 3522 3523
        return;
    }
    if (granularity & (granularity - 1)) {
3524 3525
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity",
                   "power of 2");
3526 3527
        return;
    }
P
Paolo Bonzini 已提交
3528

3529 3530 3531
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_MIRROR_SOURCE, errp)) {
        return;
    }
F
Fam Zheng 已提交
3532 3533 3534
    if (bdrv_op_is_blocked(target, BLOCK_OP_TYPE_MIRROR_TARGET, errp)) {
        return;
    }
3535 3536 3537 3538 3539 3540 3541 3542

    if (!bs->backing && sync == MIRROR_SYNC_MODE_TOP) {
        sync = MIRROR_SYNC_MODE_FULL;
    }

    /* pass the node name to replace to mirror start since it's loose coupling
     * and will allow to check whether the node still exist at mirror completion
     */
3543
    mirror_start(job_id, bs, target,
3544
                 has_replaces ? replaces : NULL,
M
Max Reitz 已提交
3545
                 speed, granularity, buf_size, sync, backing_mode,
3546 3547
                 on_source_error, on_target_error, unmap, filter_node_name,
                 errp);
3548 3549
}

E
Eric Blake 已提交
3550
void qmp_drive_mirror(DriveMirror *arg, Error **errp)
3551 3552 3553 3554
{
    BlockDriverState *bs;
    BlockDriverState *source, *target_bs;
    AioContext *aio_context;
M
Max Reitz 已提交
3555
    BlockMirrorBackingMode backing_mode;
3556 3557 3558 3559
    Error *local_err = NULL;
    QDict *options = NULL;
    int flags;
    int64_t size;
E
Eric Blake 已提交
3560
    const char *format = arg->format;
3561

3562 3563
    bs = qmp_get_root_bs(arg->device, errp);
    if (!bs) {
P
Paolo Bonzini 已提交
3564 3565 3566
        return;
    }

3567 3568 3569 3570 3571
    /* Early check to avoid creating target */
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_MIRROR_SOURCE, errp)) {
        return;
    }

3572
    aio_context = bdrv_get_aio_context(bs);
3573 3574
    aio_context_acquire(aio_context);

E
Eric Blake 已提交
3575 3576
    if (!arg->has_mode) {
        arg->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
3577
    }
P
Paolo Bonzini 已提交
3578

E
Eric Blake 已提交
3579 3580 3581
    if (!arg->has_format) {
        format = (arg->mode == NEW_IMAGE_MODE_EXISTING
                  ? NULL : bs->drv->format_name);
P
Paolo Bonzini 已提交
3582 3583
    }

K
Kevin Wolf 已提交
3584
    flags = bs->open_flags | BDRV_O_RDWR;
3585
    source = backing_bs(bs);
E
Eric Blake 已提交
3586 3587
    if (!source && arg->sync == MIRROR_SYNC_MODE_TOP) {
        arg->sync = MIRROR_SYNC_MODE_FULL;
P
Paolo Bonzini 已提交
3588
    }
E
Eric Blake 已提交
3589
    if (arg->sync == MIRROR_SYNC_MODE_NONE) {
3590 3591
        source = bs;
    }
P
Paolo Bonzini 已提交
3592

3593 3594 3595
    size = bdrv_getlength(bs);
    if (size < 0) {
        error_setg_errno(errp, -size, "bdrv_getlength failed");
3596
        goto out;
3597 3598
    }

E
Eric Blake 已提交
3599
    if (arg->has_replaces) {
3600
        BlockDriverState *to_replace_bs;
3601 3602
        AioContext *replace_aio_context;
        int64_t replace_size;
3603

E
Eric Blake 已提交
3604
        if (!arg->has_node_name) {
3605 3606
            error_setg(errp, "a node-name must be provided when replacing a"
                             " named node of the graph");
3607
            goto out;
3608 3609
        }

E
Eric Blake 已提交
3610
        to_replace_bs = check_to_replace_node(bs, arg->replaces, &local_err);
3611 3612 3613

        if (!to_replace_bs) {
            error_propagate(errp, local_err);
3614
            goto out;
3615 3616
        }

3617 3618 3619 3620 3621 3622
        replace_aio_context = bdrv_get_aio_context(to_replace_bs);
        aio_context_acquire(replace_aio_context);
        replace_size = bdrv_getlength(to_replace_bs);
        aio_context_release(replace_aio_context);

        if (size != replace_size) {
3623 3624
            error_setg(errp, "cannot replace image with a mirror image of "
                             "different size");
3625
            goto out;
3626 3627 3628
        }
    }

E
Eric Blake 已提交
3629
    if (arg->mode == NEW_IMAGE_MODE_ABSOLUTE_PATHS) {
M
Max Reitz 已提交
3630 3631 3632 3633 3634
        backing_mode = MIRROR_SOURCE_BACKING_CHAIN;
    } else {
        backing_mode = MIRROR_OPEN_BACKING_CHAIN;
    }

3635 3636 3637
    /* Don't open backing image in create() */
    flags |= BDRV_O_NO_BACKING;

E
Eric Blake 已提交
3638 3639
    if ((arg->sync == MIRROR_SYNC_MODE_FULL || !source)
        && arg->mode != NEW_IMAGE_MODE_EXISTING)
3640
    {
P
Paolo Bonzini 已提交
3641
        /* create new image w/o backing file */
3642
        assert(format);
E
Eric Blake 已提交
3643
        bdrv_img_create(arg->target, format,
3644
                        NULL, NULL, NULL, size, flags, false, &local_err);
P
Paolo Bonzini 已提交
3645
    } else {
E
Eric Blake 已提交
3646
        switch (arg->mode) {
P
Paolo Bonzini 已提交
3647 3648 3649 3650
        case NEW_IMAGE_MODE_EXISTING:
            break;
        case NEW_IMAGE_MODE_ABSOLUTE_PATHS:
            /* create new image with backing file */
E
Eric Blake 已提交
3651
            bdrv_img_create(arg->target, format,
3652 3653
                            source->filename,
                            source->drv->format_name,
3654
                            NULL, size, flags, false, &local_err);
P
Paolo Bonzini 已提交
3655 3656 3657 3658 3659 3660
            break;
        default:
            abort();
        }
    }

3661
    if (local_err) {
3662
        error_propagate(errp, local_err);
3663
        goto out;
P
Paolo Bonzini 已提交
3664 3665
    }

3666
    options = qdict_new();
E
Eric Blake 已提交
3667
    if (arg->has_node_name) {
3668
        qdict_put_str(options, "node-name", arg->node_name);
3669
    }
3670
    if (format) {
3671
        qdict_put_str(options, "driver", format);
3672
    }
3673

3674 3675 3676
    /* Mirroring takes care of copy-on-write using the source's backing
     * file.
     */
3677
    target_bs = bdrv_open(arg->target, NULL, options, flags, errp);
M
Max Reitz 已提交
3678
    if (!target_bs) {
3679
        goto out;
P
Paolo Bonzini 已提交
3680 3681
    }

3682 3683
    bdrv_set_aio_context(target_bs, aio_context);

E
Eric Blake 已提交
3684 3685 3686 3687 3688 3689 3690 3691
    blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, target_bs,
                           arg->has_replaces, arg->replaces, arg->sync,
                           backing_mode, arg->has_speed, arg->speed,
                           arg->has_granularity, arg->granularity,
                           arg->has_buf_size, arg->buf_size,
                           arg->has_on_source_error, arg->on_source_error,
                           arg->has_on_target_error, arg->on_target_error,
                           arg->has_unmap, arg->unmap,
3692
                           false, NULL,
3693
                           &local_err);
K
Kevin Wolf 已提交
3694
    bdrv_unref(target_bs);
3695
    error_propagate(errp, local_err);
3696 3697
out:
    aio_context_release(aio_context);
P
Paolo Bonzini 已提交
3698 3699
}

3700 3701
void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
                         const char *device, const char *target,
F
Fam Zheng 已提交
3702 3703 3704 3705 3706 3707 3708 3709 3710
                         bool has_replaces, const char *replaces,
                         MirrorSyncMode sync,
                         bool has_speed, int64_t speed,
                         bool has_granularity, uint32_t granularity,
                         bool has_buf_size, int64_t buf_size,
                         bool has_on_source_error,
                         BlockdevOnError on_source_error,
                         bool has_on_target_error,
                         BlockdevOnError on_target_error,
3711 3712
                         bool has_filter_node_name,
                         const char *filter_node_name,
F
Fam Zheng 已提交
3713 3714 3715 3716 3717
                         Error **errp)
{
    BlockDriverState *bs;
    BlockDriverState *target_bs;
    AioContext *aio_context;
M
Max Reitz 已提交
3718
    BlockMirrorBackingMode backing_mode = MIRROR_LEAVE_BACKING_CHAIN;
F
Fam Zheng 已提交
3719 3720
    Error *local_err = NULL;

3721
    bs = qmp_get_root_bs(device, errp);
F
Fam Zheng 已提交
3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735
    if (!bs) {
        return;
    }

    target_bs = bdrv_lookup_bs(target, target, errp);
    if (!target_bs) {
        return;
    }

    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

    bdrv_set_aio_context(target_bs, aio_context);

3736
    blockdev_mirror_common(has_job_id ? job_id : NULL, bs, target_bs,
M
Max Reitz 已提交
3737
                           has_replaces, replaces, sync, backing_mode,
F
Fam Zheng 已提交
3738 3739 3740 3741 3742 3743
                           has_speed, speed,
                           has_granularity, granularity,
                           has_buf_size, buf_size,
                           has_on_source_error, on_source_error,
                           has_on_target_error, on_target_error,
                           true, true,
3744
                           has_filter_node_name, filter_node_name,
F
Fam Zheng 已提交
3745
                           &local_err);
3746
    error_propagate(errp, local_err);
F
Fam Zheng 已提交
3747 3748 3749 3750

    aio_context_release(aio_context);
}

3751 3752
/* Get a block job using its ID and acquire its AioContext */
static BlockJob *find_block_job(const char *id, AioContext **aio_context,
3753
                                Error **errp)
3754
{
3755
    BlockJob *job;
3756

3757
    assert(id != NULL);
M
Max Reitz 已提交
3758

3759
    *aio_context = NULL;
3760

3761
    job = block_job_get(id);
M
Max Reitz 已提交
3762

3763 3764 3765 3766
    if (!job) {
        error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
                  "Block job '%s' not found", id);
        return NULL;
3767
    }
3768

3769 3770
    *aio_context = blk_get_aio_context(job->blk);
    aio_context_acquire(*aio_context);
3771

3772
    return job;
3773 3774
}

3775
void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
3776
{
3777
    AioContext *aio_context;
3778
    BlockJob *job = find_block_job(device, &aio_context, errp);
3779 3780 3781 3782 3783

    if (!job) {
        return;
    }

3784
    block_job_set_speed(job, speed, errp);
3785
    aio_context_release(aio_context);
3786
}
3787

3788 3789
void qmp_block_job_cancel(const char *device,
                          bool has_force, bool force, Error **errp)
3790
{
3791
    AioContext *aio_context;
3792
    BlockJob *job = find_block_job(device, &aio_context, errp);
3793

3794 3795 3796
    if (!job) {
        return;
    }
3797 3798 3799 3800 3801

    if (!has_force) {
        force = false;
    }

3802
    if (block_job_user_paused(job) && !force) {
3803 3804
        error_setg(errp, "The block job for device '%s' is currently paused",
                   device);
3805
        goto out;
3806
    }
3807 3808 3809

    trace_qmp_block_job_cancel(job);
    block_job_cancel(job);
3810 3811
out:
    aio_context_release(aio_context);
3812
}
S
Stefan Hajnoczi 已提交
3813

3814 3815
void qmp_block_job_pause(const char *device, Error **errp)
{
3816
    AioContext *aio_context;
3817
    BlockJob *job = find_block_job(device, &aio_context, errp);
3818

3819
    if (!job || block_job_user_paused(job)) {
3820 3821 3822 3823
        return;
    }

    trace_qmp_block_job_pause(job);
3824
    block_job_user_pause(job);
3825
    aio_context_release(aio_context);
3826 3827 3828 3829
}

void qmp_block_job_resume(const char *device, Error **errp)
{
3830
    AioContext *aio_context;
3831
    BlockJob *job = find_block_job(device, &aio_context, errp);
3832

3833
    if (!job || !block_job_user_paused(job)) {
3834 3835 3836 3837
        return;
    }

    trace_qmp_block_job_resume(job);
3838
    block_job_user_resume(job);
3839
    aio_context_release(aio_context);
3840 3841
}

P
Paolo Bonzini 已提交
3842 3843
void qmp_block_job_complete(const char *device, Error **errp)
{
3844
    AioContext *aio_context;
3845
    BlockJob *job = find_block_job(device, &aio_context, errp);
P
Paolo Bonzini 已提交
3846 3847 3848 3849 3850 3851 3852

    if (!job) {
        return;
    }

    trace_qmp_block_job_complete(job);
    block_job_complete(job, errp);
3853
    aio_context_release(aio_context);
P
Paolo Bonzini 已提交
3854 3855
}

3856 3857 3858 3859 3860 3861
void qmp_change_backing_file(const char *device,
                             const char *image_node_name,
                             const char *backing_file,
                             Error **errp)
{
    BlockDriverState *bs = NULL;
3862
    AioContext *aio_context;
3863 3864 3865 3866 3867 3868
    BlockDriverState *image_bs = NULL;
    Error *local_err = NULL;
    bool ro;
    int open_flags;
    int ret;

3869 3870
    bs = qmp_get_root_bs(device, errp);
    if (!bs) {
3871 3872 3873
        return;
    }

3874
    aio_context = bdrv_get_aio_context(bs);
3875 3876
    aio_context_acquire(aio_context);

3877 3878 3879
    image_bs = bdrv_lookup_bs(NULL, image_node_name, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
3880
        goto out;
3881 3882 3883 3884
    }

    if (!image_bs) {
        error_setg(errp, "image file not found");
3885
        goto out;
3886 3887 3888 3889 3890
    }

    if (bdrv_find_base(image_bs) == image_bs) {
        error_setg(errp, "not allowing backing file change on an image "
                         "without a backing file");
3891
        goto out;
3892 3893 3894 3895 3896
    }

    /* even though we are not necessarily operating on bs, we need it to
     * determine if block ops are currently prohibited on the chain */
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_CHANGE, errp)) {
3897
        goto out;
3898 3899 3900 3901 3902 3903
    }

    /* final sanity check */
    if (!bdrv_chain_contains(bs, image_bs)) {
        error_setg(errp, "'%s' and image file are not in the same chain",
                   device);
3904
        goto out;
3905 3906 3907 3908 3909 3910 3911 3912 3913 3914
    }

    /* if not r/w, reopen to make r/w */
    open_flags = image_bs->open_flags;
    ro = bdrv_is_read_only(image_bs);

    if (ro) {
        bdrv_reopen(image_bs, open_flags | BDRV_O_RDWR, &local_err);
        if (local_err) {
            error_propagate(errp, local_err);
3915
            goto out;
3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930
        }
    }

    ret = bdrv_change_backing_file(image_bs, backing_file,
                               image_bs->drv ? image_bs->drv->format_name : "");

    if (ret < 0) {
        error_setg_errno(errp, -ret, "Could not change backing file to '%s'",
                         backing_file);
        /* don't exit here, so we can try to restore open flags if
         * appropriate */
    }

    if (ro) {
        bdrv_reopen(image_bs, open_flags, &local_err);
3931
        error_propagate(errp, local_err);
3932
    }
3933 3934 3935

out:
    aio_context_release(aio_context);
3936 3937
}

3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951
void hmp_drive_add_node(Monitor *mon, const char *optstr)
{
    QemuOpts *opts;
    QDict *qdict;
    Error *local_err = NULL;

    opts = qemu_opts_parse_noisily(&qemu_drive_opts, optstr, false);
    if (!opts) {
        return;
    }

    qdict = qemu_opts_to_qdict(opts, NULL);

    if (!qdict_get_try_str(qdict, "node-name")) {
3952
        QDECREF(qdict);
3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968
        error_report("'node-name' needs to be specified");
        goto out;
    }

    BlockDriverState *bs = bds_tree_init(qdict, &local_err);
    if (!bs) {
        error_report_err(local_err);
        goto out;
    }

    QTAILQ_INSERT_TAIL(&monitor_bdrv_states, bs, monitor_list);

out:
    qemu_opts_del(opts);
}

K
Kevin Wolf 已提交
3969 3970
void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
{
3971
    BlockDriverState *bs;
K
Kevin Wolf 已提交
3972
    QObject *obj;
3973
    Visitor *v = qobject_output_visitor_new(&obj);
K
Kevin Wolf 已提交
3974
    QDict *qdict;
3975
    const QDictEntry *ent;
K
Kevin Wolf 已提交
3976 3977
    Error *local_err = NULL;

3978
    visit_type_BlockdevOptions(v, NULL, &options, &local_err);
3979
    if (local_err) {
K
Kevin Wolf 已提交
3980 3981 3982 3983
        error_propagate(errp, local_err);
        goto fail;
    }

3984
    visit_complete(v, &obj);
K
Kevin Wolf 已提交
3985 3986 3987 3988
    qdict = qobject_to_qdict(obj);

    qdict_flatten(qdict);

3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001
    /*
     * Rewrite "backing": null to "backing": ""
     * TODO Rewrite "" to null instead, and perhaps not even here
     */
    for (ent = qdict_first(qdict); ent; ent = qdict_next(qdict, ent)) {
        char *dot = strrchr(ent->key, '.');

        if (!strcmp(dot ? dot + 1 : ent->key, "backing")
            && qobject_type(ent->value) == QTYPE_QNULL) {
            qdict_put(qdict, ent->key, qstring_new());
        }
    }

4002 4003 4004 4005
    if (!qdict_get_try_str(qdict, "node-name")) {
        error_setg(errp, "'node-name' must be specified for the root node");
        goto fail;
    }
4006

4007 4008 4009
    bs = bds_tree_init(qdict, errp);
    if (!bs) {
        goto fail;
K
Kevin Wolf 已提交
4010 4011
    }

4012 4013
    QTAILQ_INSERT_TAIL(&monitor_bdrv_states, bs, monitor_list);

K
Kevin Wolf 已提交
4014
fail:
4015
    visit_free(v);
K
Kevin Wolf 已提交
4016 4017
}

4018
void qmp_blockdev_del(const char *node_name, Error **errp)
4019 4020 4021 4022
{
    AioContext *aio_context;
    BlockDriverState *bs;

4023 4024 4025
    bs = bdrv_find_node(node_name);
    if (!bs) {
        error_setg(errp, "Cannot find node %s", node_name);
4026 4027
        return;
    }
4028 4029 4030
    if (bdrv_has_blk(bs)) {
        error_setg(errp, "Node %s is in use", node_name);
        return;
4031
    }
4032
    aio_context = bdrv_get_aio_context(bs);
4033 4034
    aio_context_acquire(aio_context);

4035 4036 4037
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, errp)) {
        goto out;
    }
4038

4039 4040 4041 4042
    if (!bs->monitor_list.tqe_prev) {
        error_setg(errp, "Node %s is not owned by the monitor",
                   bs->node_name);
        goto out;
4043 4044
    }

4045 4046 4047 4048
    if (bs->refcnt > 1) {
        error_setg(errp, "Block device %s is in use",
                   bdrv_get_device_or_node_name(bs));
        goto out;
4049 4050
    }

4051 4052 4053
    QTAILQ_REMOVE(&monitor_bdrv_states, bs, monitor_list);
    bdrv_unref(bs);

4054 4055 4056 4057
out:
    aio_context_release(aio_context);
}

4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112
static BdrvChild *bdrv_find_child(BlockDriverState *parent_bs,
                                  const char *child_name)
{
    BdrvChild *child;

    QLIST_FOREACH(child, &parent_bs->children, next) {
        if (strcmp(child->name, child_name) == 0) {
            return child;
        }
    }

    return NULL;
}

void qmp_x_blockdev_change(const char *parent, bool has_child,
                           const char *child, bool has_node,
                           const char *node, Error **errp)
{
    BlockDriverState *parent_bs, *new_bs = NULL;
    BdrvChild *p_child;

    parent_bs = bdrv_lookup_bs(parent, parent, errp);
    if (!parent_bs) {
        return;
    }

    if (has_child == has_node) {
        if (has_child) {
            error_setg(errp, "The parameters child and node are in conflict");
        } else {
            error_setg(errp, "Either child or node must be specified");
        }
        return;
    }

    if (has_child) {
        p_child = bdrv_find_child(parent_bs, child);
        if (!p_child) {
            error_setg(errp, "Node '%s' does not have child '%s'",
                       parent, child);
            return;
        }
        bdrv_del_child(parent_bs, p_child, errp);
    }

    if (has_node) {
        new_bs = bdrv_find_node(node);
        if (!new_bs) {
            error_setg(errp, "Node '%s' not found", node);
            return;
        }
        bdrv_add_child(parent_bs, new_bs, errp);
    }
}

4113
BlockJobInfoList *qmp_query_block_jobs(Error **errp)
S
Stefan Hajnoczi 已提交
4114
{
4115
    BlockJobInfoList *head = NULL, **p_next = &head;
4116
    BlockJob *job;
S
Stefan Hajnoczi 已提交
4117

4118
    for (job = block_job_next(NULL); job; job = block_job_next(job)) {
4119 4120
        BlockJobInfoList *elem;
        AioContext *aio_context;
4121

4122 4123 4124 4125 4126
        if (block_job_is_internal(job)) {
            continue;
        }
        elem = g_new0(BlockJobInfoList, 1);
        aio_context = blk_get_aio_context(job->blk);
4127
        aio_context_acquire(aio_context);
4128
        elem->value = block_job_query(job, errp);
4129
        aio_context_release(aio_context);
4130 4131 4132 4133 4134
        if (!elem->value) {
            g_free(elem);
            qapi_free_BlockJobInfoList(head);
            return NULL;
        }
4135 4136
        *p_next = elem;
        p_next = &elem->next;
S
Stefan Hajnoczi 已提交
4137 4138
    }

4139
    return head;
S
Stefan Hajnoczi 已提交
4140
}
4141

4142
void qmp_x_blockdev_set_iothread(const char *node_name, StrOrNull *iothread,
4143
                                 bool has_force, bool force, Error **errp)
4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154
{
    AioContext *old_context;
    AioContext *new_context;
    BlockDriverState *bs;

    bs = bdrv_find_node(node_name);
    if (!bs) {
        error_setg(errp, "Cannot find node %s", node_name);
        return;
    }

4155 4156 4157 4158 4159
    /* Protects against accidents. */
    if (!(has_force && force) && bdrv_has_blk(bs)) {
        error_setg(errp, "Node %s is associated with a BlockBackend and could "
                         "be in use (use force=true to override this check)",
                         node_name);
4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182
        return;
    }

    if (iothread->type == QTYPE_QSTRING) {
        IOThread *obj = iothread_by_id(iothread->u.s);
        if (!obj) {
            error_setg(errp, "Cannot find iothread %s", iothread->u.s);
            return;
        }

        new_context = iothread_get_aio_context(obj);
    } else {
        new_context = qemu_get_aio_context();
    }

    old_context = bdrv_get_aio_context(bs);
    aio_context_acquire(old_context);

    bdrv_set_aio_context(bs, new_context);

    aio_context_release(old_context);
}

4183
QemuOptsList qemu_common_drive_opts = {
4184
    .name = "drive",
4185
    .head = QTAILQ_HEAD_INITIALIZER(qemu_common_drive_opts.head),
4186 4187 4188 4189 4190 4191 4192 4193 4194
    .desc = {
        {
            .name = "snapshot",
            .type = QEMU_OPT_BOOL,
            .help = "enable/disable snapshot mode",
        },{
            .name = "aio",
            .type = QEMU_OPT_STRING,
            .help = "host AIO implementation (threads, native)",
4195 4196 4197 4198
        },{
            .name = BDRV_OPT_CACHE_WB,
            .type = QEMU_OPT_BOOL,
            .help = "Enable writeback mode",
4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211
        },{
            .name = "format",
            .type = QEMU_OPT_STRING,
            .help = "disk format (raw, qcow2, ...)",
        },{
            .name = "rerror",
            .type = QEMU_OPT_STRING,
            .help = "read error action",
        },{
            .name = "werror",
            .type = QEMU_OPT_STRING,
            .help = "write error action",
        },{
4212
            .name = BDRV_OPT_READ_ONLY,
4213 4214
            .type = QEMU_OPT_BOOL,
            .help = "open drive file as read-only",
4215 4216 4217 4218 4219
        },

        THROTTLE_OPTS,

        {
4220 4221 4222
            .name = "throttling.group",
            .type = QEMU_OPT_STRING,
            .help = "name of the block throttling group",
4223 4224 4225 4226
        },{
            .name = "copy-on-read",
            .type = QEMU_OPT_BOOL,
            .help = "copy read data from backing file into image file",
4227 4228 4229 4230
        },{
            .name = "detect-zeroes",
            .type = QEMU_OPT_STRING,
            .help = "try to optimize zero writes (off, on, unmap)",
4231 4232 4233 4234 4235 4236 4237 4238 4239 4240
        },{
            .name = "stats-account-invalid",
            .type = QEMU_OPT_BOOL,
            .help = "whether to account for invalid I/O operations "
                    "in the statistics",
        },{
            .name = "stats-account-failed",
            .type = QEMU_OPT_BOOL,
            .help = "whether to account for failed I/O operations "
                    "in the statistics",
4241 4242 4243 4244
        },
        { /* end of list */ }
    },
};
4245 4246 4247 4248 4249

QemuOptsList qemu_drive_opts = {
    .name = "drive",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
    .desc = {
4250 4251 4252 4253
        /*
         * no elements => accept any params
         * validation will happen later
         */
4254 4255 4256
        { /* end of list */ }
    },
};