blockdev.c 99.8 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
 */

M
Markus Armbruster 已提交
33
#include "sysemu/block-backend.h"
34
#include "sysemu/blockdev.h"
P
Paolo Bonzini 已提交
35
#include "hw/block/block.h"
36
#include "block/blockjob.h"
37
#include "block/throttle-groups.h"
38
#include "monitor/monitor.h"
39
#include "qemu/error-report.h"
40 41
#include "qemu/option.h"
#include "qemu/config-file.h"
42
#include "qapi/qmp/types.h"
K
Kevin Wolf 已提交
43
#include "qapi-visit.h"
44
#include "qapi/qmp/qerror.h"
K
Kevin Wolf 已提交
45
#include "qapi/qmp-output-visitor.h"
46
#include "qapi/util.h"
47
#include "sysemu/sysemu.h"
48
#include "block/block_int.h"
L
Luiz Capitulino 已提交
49
#include "qmp-commands.h"
S
Stefan Hajnoczi 已提交
50
#include "trace.h"
51
#include "sysemu/arch_init.h"
52

53 54 55 56 57 58 59 60 61 62 63 64
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",
};

65
static int if_max_devs[IF_COUNT] = {
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
    /*
     * Do not change these numbers!  They govern how drive option
     * index maps to unit and bus.  That mapping is ABI.
     *
     * All controllers used to imlement if=T drives need to support
     * 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,
82 83
};

84 85 86 87 88 89
/**
 * Boards may call this to offer board-by-board overrides
 * of the default, global values.
 */
void override_max_devs(BlockInterfaceType type, int max_devs)
{
90
    BlockBackend *blk;
91 92 93 94 95 96
    DriveInfo *dinfo;

    if (max_devs <= 0) {
        return;
    }

97 98
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
99 100 101 102 103 104 105 106 107 108 109
        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;
}

110 111 112 113 114 115 116
/*
 * 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.
 */
117
void blockdev_mark_auto_del(BlockBackend *blk)
118
{
119
    DriveInfo *dinfo = blk_legacy_dinfo(blk);
120
    BlockDriverState *bs = blk_bs(blk);
121
    AioContext *aio_context;
122

123
    if (!dinfo) {
124 125 126
        return;
    }

M
Max Reitz 已提交
127 128 129
    if (bs) {
        aio_context = bdrv_get_aio_context(bs);
        aio_context_acquire(aio_context);
130

M
Max Reitz 已提交
131 132 133
        if (bs->job) {
            block_job_cancel(bs->job);
        }
134

M
Max Reitz 已提交
135 136
        aio_context_release(aio_context);
    }
137

138
    dinfo->auto_del = 1;
139 140
}

141
void blockdev_auto_del(BlockBackend *blk)
142
{
143
    DriveInfo *dinfo = blk_legacy_dinfo(blk);
144

145
    if (dinfo && dinfo->auto_del) {
146
        blk_unref(blk);
147 148 149
    }
}

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
/**
 * 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;
}

167 168 169 170 171 172 173 174 175 176 177 178
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;
}

179 180
QemuOpts *drive_def(const char *optstr)
{
181
    return qemu_opts_parse_noisily(qemu_find_opts("drive"), optstr, false);
182 183 184
}

QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
185
                    const char *optstr)
186 187 188
{
    QemuOpts *opts;

189
    opts = drive_def(optstr);
190 191 192
    if (!opts) {
        return NULL;
    }
193
    if (type != IF_DEFAULT) {
194
        qemu_opt_set(opts, "if", if_name[type], &error_abort);
195 196
    }
    if (index >= 0) {
197
        qemu_opt_set_number(opts, "index", index, &error_abort);
198
    }
199
    if (file)
200
        qemu_opt_set(opts, "file", file, &error_abort);
201 202 203 204 205
    return opts;
}

DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
{
206
    BlockBackend *blk;
207 208
    DriveInfo *dinfo;

209 210 211 212
    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) {
213
            return dinfo;
214
        }
215 216 217 218 219
    }

    return NULL;
}

J
John Snow 已提交
220 221
bool drive_check_orphaned(void)
{
222
    BlockBackend *blk;
J
John Snow 已提交
223 224 225
    DriveInfo *dinfo;
    bool rs = false;

226 227
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
J
John Snow 已提交
228 229
        /* If dinfo->bdrv->dev is NULL, it has no device attached. */
        /* Unless this is a default drive, this may be an oversight. */
230
        if (!blk_get_attached_dev(blk) && !dinfo->is_default &&
J
John Snow 已提交
231 232 233
            dinfo->type != IF_NONE) {
            fprintf(stderr, "Warning: Orphaned drive without device: "
                    "id=%s,file=%s,if=%s,bus=%d,unit=%d\n",
M
Max Reitz 已提交
234 235
                    blk_name(blk), blk_bs(blk) ? blk_bs(blk)->filename : "",
                    if_name[dinfo->type], dinfo->bus, dinfo->unit);
J
John Snow 已提交
236 237 238 239 240 241 242
            rs = true;
        }
    }

    return rs;
}

243 244 245 246 247 248 249
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));
}

250 251 252
int drive_get_max_bus(BlockInterfaceType type)
{
    int max_bus;
253
    BlockBackend *blk;
254 255 256
    DriveInfo *dinfo;

    max_bus = -1;
257 258 259
    for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
        dinfo = blk_legacy_dinfo(blk);
        if (dinfo && dinfo->type == type && dinfo->bus > max_bus) {
260
            max_bus = dinfo->bus;
261
        }
262 263 264 265
    }
    return max_bus;
}

266 267 268 269 270 271 272 273 274 275
/* 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]++);
}

276 277
static void bdrv_format_print(void *opaque, const char *name)
{
278
    error_printf(" %s", name);
279 280
}

281 282
typedef struct {
    QEMUBH *bh;
F
Fam Zheng 已提交
283 284
    BlockDriverState *bs;
} BDRVPutRefBH;
285

F
Fam Zheng 已提交
286
static void bdrv_put_ref_bh(void *opaque)
287
{
F
Fam Zheng 已提交
288
    BDRVPutRefBH *s = opaque;
289

F
Fam Zheng 已提交
290
    bdrv_unref(s->bs);
291 292 293 294 295
    qemu_bh_delete(s->bh);
    g_free(s);
}

/*
F
Fam Zheng 已提交
296
 * Release a BDS reference in a BH
297
 *
F
Fam Zheng 已提交
298 299 300
 * It is not safe to use bdrv_unref() from a callback function when the callers
 * still need the BlockDriverState.  In such cases we schedule a BH to release
 * the reference.
301
 */
F
Fam Zheng 已提交
302
static void bdrv_put_ref_bh_schedule(BlockDriverState *bs)
303
{
F
Fam Zheng 已提交
304
    BDRVPutRefBH *s;
305

F
Fam Zheng 已提交
306 307 308
    s = g_new(BDRVPutRefBH, 1);
    s->bh = qemu_bh_new(bdrv_put_ref_bh, s);
    s->bs = bs;
309 310 311
    qemu_bh_schedule(s->bh);
}

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

329
static bool check_throttle_config(ThrottleConfig *cfg, Error **errp)
330
{
331 332 333
    if (throttle_conflicting(cfg)) {
        error_setg(errp, "bps/iops/max total values and read/write values"
                         " cannot be used at the same time");
334 335 336
        return false;
    }

337 338
    if (!throttle_is_valid(cfg)) {
        error_setg(errp, "bps/iops/maxs values must be 0 or greater");
339 340 341
        return false;
    }

342 343 344 345 346 347
    if (throttle_max_is_missing_limit(cfg)) {
        error_setg(errp, "bps_max/iops_max require corresponding"
                         " bps/iops values");
        return false;
    }

348 349 350
    return true;
}

351 352
typedef enum { MEDIA_DISK, MEDIA_CDROM } DriveMediaType;

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 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 401 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 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
/* 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)
{
    const char *discard;
    Error *local_error = NULL;
    const char *aio;

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

        if ((discard = qemu_opt_get(opts, "discard")) != NULL) {
            if (bdrv_parse_discard_flags(discard, bdrv_flags) != 0) {
                error_setg(errp, "Invalid discard option");
                return;
            }
        }

        if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_WB, true)) {
            *bdrv_flags |= BDRV_O_CACHE_WB;
        }
        if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_DIRECT, false)) {
            *bdrv_flags |= BDRV_O_NOCACHE;
        }
        if (qemu_opt_get_bool(opts, BDRV_OPT_CACHE_NO_FLUSH, false)) {
            *bdrv_flags |= BDRV_O_NO_FLUSH;
        }

        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) {
        memset(throttle_cfg, 0, sizeof(*throttle_cfg));
        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);

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

        if (!check_throttle_config(throttle_cfg, errp)) {
            return;
        }
    }

    if (detect_zeroes) {
        *detect_zeroes =
            qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
                            qemu_opt_get(opts, "detect-zeroes"),
                            BLOCKDEV_DETECT_ZEROES_OPTIONS_MAX,
                            BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                            &local_error);
        if (local_error) {
            error_propagate(errp, local_error);
            return;
        }

        if (bdrv_flags &&
            *detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
            !(*bdrv_flags & BDRV_O_UNMAP))
        {
            error_setg(errp, "setting detect-zeroes to unmap is not allowed "
                             "without setting discard operation to unmap");
            return;
        }
    }
}

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

482 483 484
    /* 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");
485
    opts = qemu_opts_create(&qemu_common_drive_opts, id, 1, &error);
486
    if (error) {
487
        error_propagate(errp, error);
488
        goto err_no_opts;
489 490 491
    }

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

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

501 502
    has_driver_specific_opts = !!qdict_size(bs_opts);

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

506 507 508 509 510
    extract_common_blockdev_options(opts, &bdrv_flags, &throttling_group, &cfg,
                                    &detect_zeroes, &error);
    if (error) {
        error_propagate(errp, error);
        goto early_err;
511 512 513
    }

    if ((buf = qemu_opt_get(opts, "format")) != NULL) {
514 515 516 517
        if (is_help_option(buf)) {
            error_printf("Supported formats:");
            bdrv_iterate_format(bdrv_format_print, NULL);
            error_printf("\n");
518
            goto early_err;
519
        }
520

521 522
        if (qdict_haskey(bs_opts, "driver")) {
            error_setg(errp, "Cannot specify both 'driver' and 'format'");
523
            goto early_err;
524
        }
525
        qdict_put(bs_opts, "driver", qstring_from_str(buf));
526 527
    }

528
    on_write_error = BLOCKDEV_ON_ERROR_ENOSPC;
529
    if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
530
        on_write_error = parse_block_error_action(buf, 0, &error);
531
        if (error) {
532
            error_propagate(errp, error);
533
            goto early_err;
534 535 536
        }
    }

537
    on_read_error = BLOCKDEV_ON_ERROR_REPORT;
538
    if ((buf = qemu_opt_get(opts, "rerror")) != NULL) {
539
        on_read_error = parse_block_error_action(buf, 1, &error);
540
        if (error) {
541
            error_propagate(errp, error);
542
            goto early_err;
543 544 545
        }
    }

546 547 548 549 550 551
    if (snapshot) {
        /* always use cache=unsafe with snapshot */
        bdrv_flags &= ~BDRV_O_CACHE_MASK;
        bdrv_flags |= (BDRV_O_SNAPSHOT|BDRV_O_CACHE_WB|BDRV_O_NO_FLUSH);
    }

552
    /* init */
553
    if ((!file || !*file) && !has_driver_specific_opts) {
554 555 556
        BlockBackendRootState *blk_rs;

        blk = blk_new(qemu_opts_id(opts), errp);
557 558 559
        if (!blk) {
            goto early_err;
        }
560

561 562
        blk_rs = blk_get_root_state(blk);
        blk_rs->open_flags    = bdrv_flags;
563
        blk_rs->read_only     = !(bdrv_flags & BDRV_O_RDWR);
564 565 566 567 568 569 570 571 572 573
        blk_rs->detect_zeroes = detect_zeroes;

        if (throttle_enabled(&cfg)) {
            if (!throttling_group) {
                throttling_group = blk_name(blk);
            }
            blk_rs->throttle_group = g_strdup(throttling_group);
            blk_rs->throttle_state = throttle_group_incref(throttling_group);
            blk_rs->throttle_state->cfg = cfg;
        }
574

575 576 577
        QDECREF(bs_opts);
    } else {
        if (file && !*file) {
578 579
            file = NULL;
        }
580

581 582 583 584 585 586
        blk = blk_new_open(qemu_opts_id(opts), file, NULL, bs_opts, bdrv_flags,
                           errp);
        if (!blk) {
            goto err_no_bs_opts;
        }
        bs = blk_bs(blk);
587

588
        bs->detect_zeroes = detect_zeroes;
589

590 591 592 593 594 595 596 597
        /* disk I/O throttling */
        if (throttle_enabled(&cfg)) {
            if (!throttling_group) {
                throttling_group = blk_name(blk);
            }
            bdrv_io_limits_enable(bs, throttling_group);
            bdrv_set_io_limits(bs, &cfg);
        }
598

599 600
        if (bdrv_key_required(bs)) {
            autostart = 0;
601
        }
602 603
    }

604
    blk_set_on_error(blk, on_read_error, on_write_error);
605

606
err_no_bs_opts:
607
    qemu_opts_del(opts);
608
    return blk;
609

610 611
early_err:
    qemu_opts_del(opts);
612 613
err_no_opts:
    QDECREF(bs_opts);
614
    return NULL;
615 616
}

617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
static QemuOptsList qemu_root_bds_opts;

/* Takes the ownership of bs_opts */
static BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp)
{
    BlockDriverState *bs;
    QemuOpts *opts;
    Error *local_error = NULL;
    BlockdevDetectZeroesOptions detect_zeroes;
    int ret;
    int bdrv_flags = 0;

    opts = qemu_opts_create(&qemu_root_bds_opts, NULL, 1, errp);
    if (!opts) {
        goto fail;
    }

    qemu_opts_absorb_qdict(opts, bs_opts, &local_error);
    if (local_error) {
        error_propagate(errp, local_error);
        goto fail;
    }

    extract_common_blockdev_options(opts, &bdrv_flags, NULL, NULL,
                                    &detect_zeroes, &local_error);
    if (local_error) {
        error_propagate(errp, local_error);
        goto fail;
    }

    bs = NULL;
    ret = bdrv_open(&bs, NULL, NULL, bs_opts, bdrv_flags, errp);
    if (ret < 0) {
        goto fail_no_bs_opts;
    }

    bs->detect_zeroes = detect_zeroes;

fail_no_bs_opts:
    qemu_opts_del(opts);
    return bs;

fail:
    qemu_opts_del(opts);
    QDECREF(bs_opts);
    return NULL;
}

665 666
static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
                            Error **errp)
667 668 669 670 671
{
    const char *value;

    value = qemu_opt_get(opts, from);
    if (value) {
672 673 674 675 676
        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;
        }
677 678 679 680
    }

    /* rename all items in opts */
    while ((value = qemu_opt_get(opts, from))) {
681
        qemu_opt_set(opts, to, value, &error_abort);
682 683 684 685
        qemu_opt_unset(opts, from);
    }
}

686 687 688 689 690
QemuOptsList qemu_legacy_drive_opts = {
    .name = "drive",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_legacy_drive_opts.head),
    .desc = {
        {
691 692 693 694 695 696 697 698 699 700 701 702
            .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",
        },{
703 704 705
            .name = "media",
            .type = QEMU_OPT_STRING,
            .help = "media type (disk, cdrom)",
706 707 708 709
        },{
            .name = "if",
            .type = QEMU_OPT_STRING,
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
        },{
            .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)",
726 727 728 729
        },{
            .name = "boot",
            .type = QEMU_OPT_BOOL,
            .help = "(deprecated, ignored)",
730 731 732 733
        },{
            .name = "addr",
            .type = QEMU_OPT_STRING,
            .help = "pci address (virtio only)",
734 735 736 737
        },{
            .name = "serial",
            .type = QEMU_OPT_STRING,
            .help = "disk serial number",
M
Max Reitz 已提交
738 739 740 741
        },{
            .name = "file",
            .type = QEMU_OPT_STRING,
            .help = "file name",
742
        },
743 744 745 746 747 748

        /* Options that are passed on, but have special semantics with -drive */
        {
            .name = "read-only",
            .type = QEMU_OPT_BOOL,
            .help = "open drive file as read-only",
749 750 751 752 753 754 755 756
        },{
            .name = "rerror",
            .type = QEMU_OPT_STRING,
            .help = "read error action",
        },{
            .name = "werror",
            .type = QEMU_OPT_STRING,
            .help = "write error action",
757 758 759 760 761 762
        },{
            .name = "copy-on-read",
            .type = QEMU_OPT_BOOL,
            .help = "copy read data from backing file into image file",
        },

763 764 765 766
        { /* end of list */ }
    },
};

767
DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
768
{
K
Kevin Wolf 已提交
769
    const char *value;
770
    BlockBackend *blk;
771
    DriveInfo *dinfo = NULL;
772
    QDict *bs_opts;
773 774
    QemuOpts *legacy_opts;
    DriveMediaType media = MEDIA_DISK;
775
    BlockInterfaceType type;
776
    int cyls, heads, secs, translation;
777
    int max_devs, bus_id, unit_id, index;
778
    const char *devaddr;
779
    const char *werror, *rerror;
F
Fam Zheng 已提交
780 781
    bool read_only = false;
    bool copy_on_read;
782
    const char *serial;
M
Max Reitz 已提交
783
    const char *filename;
784
    Error *local_err = NULL;
785
    int i;
K
Kevin Wolf 已提交
786

787
    /* Change legacy command line options into QMP ones */
788 789 790 791 792 793 794
    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" },
795

796 797 798
        { "bps",            "throttling.bps-total" },
        { "bps_rd",         "throttling.bps-read" },
        { "bps_wr",         "throttling.bps-write" },
799

800 801 802
        { "iops_max",       "throttling.iops-total-max" },
        { "iops_rd_max",    "throttling.iops-read-max" },
        { "iops_wr_max",    "throttling.iops-write-max" },
803

804 805 806
        { "bps_max",        "throttling.bps-total-max" },
        { "bps_rd_max",     "throttling.bps-read-max" },
        { "bps_wr_max",     "throttling.bps-write-max" },
807

808
        { "iops_size",      "throttling.iops-size" },
809

810 811
        { "group",          "throttling.group" },

812 813 814 815
        { "readonly",       "read-only" },
    };

    for (i = 0; i < ARRAY_SIZE(opt_renames); i++) {
816 817 818
        qemu_opt_rename(all_opts, opt_renames[i].from, opt_renames[i].to,
                        &local_err);
        if (local_err) {
819
            error_report_err(local_err);
820 821
            return NULL;
        }
822
    }
823

K
Kevin Wolf 已提交
824 825 826 827 828 829 830 831 832 833
    value = qemu_opt_get(all_opts, "cache");
    if (value) {
        int flags = 0;

        if (bdrv_parse_cache_flags(value, &flags) != 0) {
            error_report("invalid cache option");
            return NULL;
        }

        /* Specific options take precedence */
834 835
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_WB)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_WB,
836
                              !!(flags & BDRV_O_CACHE_WB), &error_abort);
K
Kevin Wolf 已提交
837
        }
838 839
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_DIRECT)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_DIRECT,
840
                              !!(flags & BDRV_O_NOCACHE), &error_abort);
K
Kevin Wolf 已提交
841
        }
842 843
        if (!qemu_opt_get(all_opts, BDRV_OPT_CACHE_NO_FLUSH)) {
            qemu_opt_set_bool(all_opts, BDRV_OPT_CACHE_NO_FLUSH,
844
                              !!(flags & BDRV_O_NO_FLUSH), &error_abort);
K
Kevin Wolf 已提交
845 846 847 848
        }
        qemu_opt_unset(all_opts, "cache");
    }

849 850 851 852
    /* Get a QDict for processing the options */
    bs_opts = qdict_new();
    qemu_opts_to_qdict(all_opts, bs_opts);

853 854
    legacy_opts = qemu_opts_create(&qemu_legacy_drive_opts, NULL, 0,
                                   &error_abort);
855
    qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
856
    if (local_err) {
857
        error_report_err(local_err);
858 859 860
        goto fail;
    }

861 862 863 864 865 866 867
    /* Deprecated option boot=[on|off] */
    if (qemu_opt_get(legacy_opts, "boot") != NULL) {
        fprintf(stderr, "qemu-kvm: boot=on|off is deprecated and will be "
                "ignored. Future versions will reject this parameter. Please "
                "update your scripts.\n");
    }

868 869 870 871 872 873 874
    /* 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 已提交
875
            read_only = true;
876 877 878 879 880 881
        } else {
            error_report("'%s' invalid media", value);
            goto fail;
        }
    }

882
    /* copy-on-read is disabled with a warning for read-only devices */
F
Fam Zheng 已提交
883
    read_only |= qemu_opt_get_bool(legacy_opts, "read-only", false);
884 885 886 887 888 889 890 891 892 893 894 895
    copy_on_read = qemu_opt_get_bool(legacy_opts, "copy-on-read", false);

    if (read_only && copy_on_read) {
        error_report("warning: disabling copy-on-read on read-only drive");
        copy_on_read = false;
    }

    qdict_put(bs_opts, "read-only",
              qstring_from_str(read_only ? "on" : "off"));
    qdict_put(bs_opts, "copy-on-read",
              qstring_from_str(copy_on_read ? "on" :"off"));

896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
    /* 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;
    }

911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
    /* 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;
943 944 945 946
        } else if (!strcmp(value, "large")) {
            translation = BIOS_ATA_TRANSLATION_LARGE;
        } else if (!strcmp(value, "rechs")) {
            translation = BIOS_ATA_TRANSLATION_RECHS;
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
        } 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;
        }
    }

962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
    /* 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;
    }

1001 1002 1003
    /* Serial number */
    serial = qemu_opt_get(legacy_opts, "serial");

1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
    /* 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);
        }
        qdict_put(bs_opts, "id", qstring_from_str(new_id));
        g_free(new_id);
    }

1022 1023 1024 1025 1026 1027 1028 1029 1030
    /* 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;
1031 1032
        devopts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                   &error_abort);
1033
        if (arch_type == QEMU_ARCH_S390X) {
1034
            qemu_opt_set(devopts, "driver", "virtio-blk-ccw", &error_abort);
1035
        } else {
1036
            qemu_opt_set(devopts, "driver", "virtio-blk-pci", &error_abort);
1037
        }
1038 1039
        qemu_opt_set(devopts, "drive", qdict_get_str(bs_opts, "id"),
                     &error_abort);
1040
        if (devaddr) {
1041
            qemu_opt_set(devopts, "addr", devaddr, &error_abort);
1042 1043 1044
        }
    }

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

1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
    /* 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;
        }
        qdict_put(bs_opts, "werror", qstring_from_str(werror));
    }

    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;
        }
        qdict_put(bs_opts, "rerror", qstring_from_str(rerror));
    }

1068
    /* Actual block device init: Functionality shared with blockdev-add */
1069
    blk = blockdev_init(filename, bs_opts, &local_err);
1070
    bs_opts = NULL;
1071
    if (!blk) {
1072
        if (local_err) {
1073
            error_report_err(local_err);
1074
        }
1075
        goto fail;
1076
    } else {
1077
        assert(!local_err);
1078 1079
    }

1080 1081
    /* Create legacy DriveInfo */
    dinfo = g_malloc0(sizeof(*dinfo));
1082
    dinfo->opts = all_opts;
1083

1084 1085 1086 1087 1088
    dinfo->cyls = cyls;
    dinfo->heads = heads;
    dinfo->secs = secs;
    dinfo->trans = translation;

1089
    dinfo->type = type;
1090 1091
    dinfo->bus = bus_id;
    dinfo->unit = unit_id;
1092
    dinfo->devaddr = devaddr;
1093 1094
    dinfo->serial = g_strdup(serial);

1095 1096
    blk_set_legacy_dinfo(blk, dinfo);

1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
    switch(type) {
    case IF_IDE:
    case IF_SCSI:
    case IF_XEN:
    case IF_NONE:
        dinfo->media_cd = media == MEDIA_CDROM;
        break;
    default:
        break;
    }

1108
fail:
1109
    qemu_opts_del(legacy_opts);
1110
    QDECREF(bs_opts);
1111
    return dinfo;
1112 1113
}

1114
void hmp_commit(Monitor *mon, const QDict *qdict)
1115 1116
{
    const char *device = qdict_get_str(qdict, "device");
1117
    BlockBackend *blk;
1118
    int ret;
1119

1120
    if (!strcmp(device, "all")) {
1121
        ret = bdrv_commit_all();
1122
    } else {
1123 1124
        blk = blk_by_name(device);
        if (!blk) {
1125
            monitor_printf(mon, "Device '%s' not found\n", device);
1126
            return;
1127
        }
M
Max Reitz 已提交
1128 1129 1130 1131
        if (!blk_is_available(blk)) {
            monitor_printf(mon, "Device '%s' has no medium\n", device);
            return;
        }
1132
        ret = bdrv_commit(blk_bs(blk));
1133 1134 1135 1136
    }
    if (ret < 0) {
        monitor_printf(mon, "'commit' error for '%s': %s\n", device,
                       strerror(-ret));
1137 1138 1139
    }
}

1140 1141
static void blockdev_do_action(int kind, void *data, Error **errp)
{
1142 1143
    TransactionAction action;
    TransactionActionList list;
1144 1145 1146 1147 1148 1149 1150 1151

    action.kind = kind;
    action.data = data;
    list.value = &action;
    list.next = NULL;
    qmp_transaction(&list, errp);
}

1152 1153 1154 1155 1156
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,
1157
                                bool has_format, const char *format,
1158
                                bool has_mode, NewImageMode mode, Error **errp)
1159
{
1160
    BlockdevSnapshot snapshot = {
1161
        .has_device = has_device,
1162
        .device = (char *) device,
1163 1164
        .has_node_name = has_node_name,
        .node_name = (char *) node_name,
1165
        .snapshot_file = (char *) snapshot_file,
1166 1167
        .has_snapshot_node_name = has_snapshot_node_name,
        .snapshot_node_name = (char *) snapshot_node_name,
1168 1169 1170 1171 1172
        .has_format = has_format,
        .format = (char *) format,
        .has_mode = has_mode,
        .mode = mode,
    };
1173 1174
    blockdev_do_action(TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC,
                       &snapshot, errp);
1175 1176
}

1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
void qmp_blockdev_snapshot_internal_sync(const char *device,
                                         const char *name,
                                         Error **errp)
{
    BlockdevSnapshotInternal snapshot = {
        .device = (char *) device,
        .name = (char *) name
    };

    blockdev_do_action(TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC,
                       &snapshot, errp);
}

1190 1191 1192 1193 1194 1195 1196
SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device,
                                                         bool has_id,
                                                         const char *id,
                                                         bool has_name,
                                                         const char *name,
                                                         Error **errp)
{
1197 1198
    BlockDriverState *bs;
    BlockBackend *blk;
1199
    AioContext *aio_context;
1200 1201 1202 1203 1204
    QEMUSnapshotInfo sn;
    Error *local_err = NULL;
    SnapshotInfo *info = NULL;
    int ret;

1205 1206
    blk = blk_by_name(device);
    if (!blk) {
1207 1208
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
1209 1210
        return NULL;
    }
M
Max Reitz 已提交
1211 1212 1213

    aio_context = blk_get_aio_context(blk);
    aio_context_acquire(aio_context);
1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224

    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 已提交
1225
        goto out_aio_context;
1226 1227
    }

M
Max Reitz 已提交
1228 1229 1230 1231 1232
    if (!blk_is_available(blk)) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out_aio_context;
    }
    bs = blk_bs(blk);
1233

1234 1235 1236 1237
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE, errp)) {
        goto out_aio_context;
    }

1238
    ret = bdrv_snapshot_find_by_id_and_name(bs, id, name, &sn, &local_err);
1239
    if (local_err) {
1240
        error_propagate(errp, local_err);
1241
        goto out_aio_context;
1242 1243 1244 1245 1246 1247
    }
    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);
1248
        goto out_aio_context;
1249 1250 1251
    }

    bdrv_snapshot_delete(bs, id, name, &local_err);
1252
    if (local_err) {
1253
        error_propagate(errp, local_err);
1254
        goto out_aio_context;
1255 1256
    }

1257 1258
    aio_context_release(aio_context);

1259
    info = g_new0(SnapshotInfo, 1);
1260 1261 1262 1263 1264 1265 1266 1267 1268
    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;
1269 1270 1271 1272

out_aio_context:
    aio_context_release(aio_context);
    return NULL;
1273
}
1274

1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336
/**
 * 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,
                                                  AioContext **paio,
                                                  Error **errp)
{
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;
    AioContext *aio_context;

    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;
    }

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

    bitmap = bdrv_find_dirty_bitmap(bs, name);
    if (!bitmap) {
        error_setg(errp, "Dirty bitmap '%s' not found", name);
        goto fail;
    }

    if (pbs) {
        *pbs = bs;
    }
    if (paio) {
        *paio = aio_context;
    } else {
        aio_context_release(aio_context);
    }

    return bitmap;

 fail:
    aio_context_release(aio_context);
    return NULL;
}

1337
/* New and old BlockDriverState structs for atomic group operations */
1338

1339
typedef struct BlkTransactionState BlkTransactionState;
1340 1341 1342 1343 1344 1345 1346

/* Only prepare() may fail. In a single transaction, only one of commit() or
   abort() will be called, clean() will always be called if it present. */
typedef struct BdrvActionOps {
    /* Size of state struct, in bytes. */
    size_t instance_size;
    /* Prepare the work, must NOT be NULL. */
1347
    void (*prepare)(BlkTransactionState *common, Error **errp);
1348
    /* Commit the changes, can be NULL. */
1349
    void (*commit)(BlkTransactionState *common);
1350
    /* Abort the changes on fail, can be NULL. */
1351
    void (*abort)(BlkTransactionState *common);
1352
    /* Clean up resource in the end, can be NULL. */
1353
    void (*clean)(BlkTransactionState *common);
1354 1355 1356 1357 1358 1359 1360
} BdrvActionOps;

/*
 * This structure must be arranged as first member in child type, assuming
 * that compiler will also arrange it to the same address with parent instance.
 * Later it will be used in free().
 */
1361
struct BlkTransactionState {
1362
    TransactionAction *action;
1363
    const BdrvActionOps *ops;
1364
    QSIMPLEQ_ENTRY(BlkTransactionState) entry;
1365 1366
};

1367 1368 1369 1370
/* internal snapshot private data */
typedef struct InternalSnapshotState {
    BlkTransactionState common;
    BlockDriverState *bs;
1371
    AioContext *aio_context;
1372 1373 1374 1375 1376 1377
    QEMUSnapshotInfo sn;
} InternalSnapshotState;

static void internal_snapshot_prepare(BlkTransactionState *common,
                                      Error **errp)
{
1378
    Error *local_err = NULL;
1379 1380
    const char *device;
    const char *name;
1381
    BlockBackend *blk;
1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
    BlockDriverState *bs;
    QEMUSnapshotInfo old_sn, *sn;
    bool ret;
    qemu_timeval tv;
    BlockdevSnapshotInternal *internal;
    InternalSnapshotState *state;
    int ret1;

    g_assert(common->action->kind ==
             TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC);
    internal = common->action->blockdev_snapshot_internal_sync;
    state = DO_UPCAST(InternalSnapshotState, common, common);

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

    /* 2. check for validation */
1400 1401
    blk = blk_by_name(device);
    if (!blk) {
1402 1403
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
1404 1405 1406
        return;
    }

1407
    /* AioContext is released in .clean() */
M
Max Reitz 已提交
1408
    state->aio_context = blk_get_aio_context(blk);
1409 1410
    aio_context_acquire(state->aio_context);

M
Max Reitz 已提交
1411
    if (!blk_is_available(blk)) {
1412
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
1413 1414
        return;
    }
M
Max Reitz 已提交
1415
    bs = blk_bs(blk);
1416

1417 1418 1419 1420
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)) {
        return;
    }

1421
    if (bdrv_is_read_only(bs)) {
1422
        error_setg(errp, "Device '%s' is read only", device);
1423 1424 1425 1426
        return;
    }

    if (!bdrv_can_snapshot(bs)) {
1427 1428 1429
        error_setg(errp, "Block format '%s' used by device '%s' "
                   "does not support internal snapshots",
                   bs->drv->format_name, device);
1430 1431 1432 1433 1434 1435 1436 1437 1438
        return;
    }

    if (!strlen(name)) {
        error_setg(errp, "Name is empty");
        return;
    }

    /* check whether a snapshot with name exist */
1439 1440 1441 1442
    ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn,
                                            &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
        return;
    } else if (ret) {
        error_setg(errp,
                   "Snapshot with name '%s' already exists on device '%s'",
                   name, device);
        return;
    }

    /* 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);
        return;
    }

    /* 4. succeed, mark a snapshot is created */
    state->bs = bs;
}

static void internal_snapshot_abort(BlkTransactionState *common)
{
    InternalSnapshotState *state =
                             DO_UPCAST(InternalSnapshotState, common, common);
    BlockDriverState *bs = state->bs;
    QEMUSnapshotInfo *sn = &state->sn;
    Error *local_error = NULL;

    if (!bs) {
        return;
    }

    if (bdrv_snapshot_delete(bs, sn->id_str, sn->name, &local_error) < 0) {
        error_report("Failed to delete snapshot with id '%s' and name '%s' on "
                     "device '%s' in abort: %s",
                     sn->id_str,
                     sn->name,
                     bdrv_get_device_name(bs),
                     error_get_pretty(local_error));
        error_free(local_error);
    }
}

1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
static void internal_snapshot_clean(BlkTransactionState *common)
{
    InternalSnapshotState *state = DO_UPCAST(InternalSnapshotState,
                                             common, common);

    if (state->aio_context) {
        aio_context_release(state->aio_context);
    }
}

1504
/* external snapshot private data */
1505 1506
typedef struct ExternalSnapshotState {
    BlkTransactionState common;
1507 1508
    BlockDriverState *old_bs;
    BlockDriverState *new_bs;
1509
    AioContext *aio_context;
1510
} ExternalSnapshotState;
1511

1512
static void external_snapshot_prepare(BlkTransactionState *common,
1513 1514 1515
                                      Error **errp)
{
    int flags, ret;
1516
    QDict *options;
1517
    Error *local_err = NULL;
1518
    bool has_device = false;
1519
    const char *device;
1520 1521 1522 1523
    bool has_node_name = false;
    const char *node_name;
    bool has_snapshot_node_name = false;
    const char *snapshot_node_name;
1524 1525 1526
    const char *new_image_file;
    const char *format = "qcow2";
    enum NewImageMode mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
1527 1528
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1529
    TransactionAction *action = common->action;
1530

1531
    /* get parameters */
1532
    g_assert(action->kind == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC);
1533

1534
    has_device = action->blockdev_snapshot_sync->has_device;
1535
    device = action->blockdev_snapshot_sync->device;
1536 1537 1538 1539 1540 1541
    has_node_name = action->blockdev_snapshot_sync->has_node_name;
    node_name = action->blockdev_snapshot_sync->node_name;
    has_snapshot_node_name =
        action->blockdev_snapshot_sync->has_snapshot_node_name;
    snapshot_node_name = action->blockdev_snapshot_sync->snapshot_node_name;

1542 1543 1544 1545 1546 1547 1548 1549 1550
    new_image_file = action->blockdev_snapshot_sync->snapshot_file;
    if (action->blockdev_snapshot_sync->has_format) {
        format = action->blockdev_snapshot_sync->format;
    }
    if (action->blockdev_snapshot_sync->has_mode) {
        mode = action->blockdev_snapshot_sync->mode;
    }

    /* start processing */
1551 1552 1553
    state->old_bs = bdrv_lookup_bs(has_device ? device : NULL,
                                   has_node_name ? node_name : NULL,
                                   &local_err);
1554
    if (local_err) {
1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565
        error_propagate(errp, local_err);
        return;
    }

    if (has_node_name && !has_snapshot_node_name) {
        error_setg(errp, "New snapshot node name missing");
        return;
    }

    if (has_snapshot_node_name && bdrv_find_node(snapshot_node_name)) {
        error_setg(errp, "New snapshot node name already existing");
1566 1567 1568
        return;
    }

1569 1570 1571
    /* Acquire AioContext now so any threads operating on old_bs stop */
    state->aio_context = bdrv_get_aio_context(state->old_bs);
    aio_context_acquire(state->aio_context);
1572
    bdrv_drained_begin(state->old_bs);
1573

1574
    if (!bdrv_is_inserted(state->old_bs)) {
1575
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
1576 1577 1578
        return;
    }

1579 1580
    if (bdrv_op_is_blocked(state->old_bs,
                           BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT, errp)) {
1581 1582 1583
        return;
    }

1584 1585
    if (!bdrv_is_read_only(state->old_bs)) {
        if (bdrv_flush(state->old_bs)) {
1586
            error_setg(errp, QERR_IO_ERROR);
1587 1588 1589 1590
            return;
        }
    }

1591
    if (!bdrv_is_first_non_filter(state->old_bs)) {
1592
        error_setg(errp, QERR_FEATURE_DISABLED, "snapshot");
1593 1594 1595
        return;
    }

1596
    flags = state->old_bs->open_flags;
1597 1598 1599 1600

    /* create new image w/backing file */
    if (mode != NEW_IMAGE_MODE_EXISTING) {
        bdrv_img_create(new_image_file, format,
1601 1602
                        state->old_bs->filename,
                        state->old_bs->drv->format_name,
1603
                        NULL, -1, flags, &local_err, false);
1604
        if (local_err) {
1605 1606 1607 1608 1609
            error_propagate(errp, local_err);
            return;
        }
    }

1610
    options = qdict_new();
1611 1612 1613 1614
    if (has_snapshot_node_name) {
        qdict_put(options, "node-name",
                  qstring_from_str(snapshot_node_name));
    }
1615
    qdict_put(options, "driver", qstring_from_str(format));
1616

1617 1618
    /* TODO Inherit bs->options or only take explicit options with an
     * extended QMP command? */
1619
    assert(state->new_bs == NULL);
1620
    ret = bdrv_open(&state->new_bs, new_image_file, NULL, options,
1621
                    flags | BDRV_O_NO_BACKING, &local_err);
1622
    /* We will manually add the backing_hd field to the bs later */
1623
    if (ret != 0) {
1624
        error_propagate(errp, local_err);
1625 1626 1627
    }
}

1628
static void external_snapshot_commit(BlkTransactionState *common)
1629
{
1630 1631
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1632

1633 1634
    bdrv_set_aio_context(state->new_bs, state->aio_context);

1635 1636
    /* This removes our old bs and adds the new bs */
    bdrv_append(state->new_bs, state->old_bs);
1637 1638 1639
    /* 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 */
1640
    bdrv_reopen(state->old_bs, state->old_bs->open_flags & ~BDRV_O_RDWR,
1641 1642 1643
                NULL);
}

1644
static void external_snapshot_abort(BlkTransactionState *common)
1645
{
1646 1647 1648
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
    if (state->new_bs) {
F
Fam Zheng 已提交
1649
        bdrv_unref(state->new_bs);
1650
    }
1651 1652 1653 1654 1655 1656
}

static void external_snapshot_clean(BlkTransactionState *common)
{
    ExternalSnapshotState *state =
                             DO_UPCAST(ExternalSnapshotState, common, common);
1657
    if (state->aio_context) {
1658
        bdrv_drained_end(state->old_bs);
1659 1660
        aio_context_release(state->aio_context);
    }
1661 1662
}

1663 1664 1665
typedef struct DriveBackupState {
    BlkTransactionState common;
    BlockDriverState *bs;
1666
    AioContext *aio_context;
1667 1668 1669 1670 1671 1672
    BlockJob *job;
} DriveBackupState;

static void drive_backup_prepare(BlkTransactionState *common, Error **errp)
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
1673
    BlockBackend *blk;
1674 1675 1676 1677 1678 1679
    DriveBackup *backup;
    Error *local_err = NULL;

    assert(common->action->kind == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
    backup = common->action->drive_backup;

1680 1681
    blk = blk_by_name(backup->device);
    if (!blk) {
1682 1683
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", backup->device);
1684 1685 1686 1687
        return;
    }

    /* AioContext is released in .clean() */
M
Max Reitz 已提交
1688
    state->aio_context = blk_get_aio_context(blk);
1689 1690
    aio_context_acquire(state->aio_context);

1691 1692
    qmp_drive_backup(backup->device, backup->target,
                     backup->has_format, backup->format,
1693
                     backup->sync,
1694 1695
                     backup->has_mode, backup->mode,
                     backup->has_speed, backup->speed,
1696
                     backup->has_bitmap, backup->bitmap,
1697 1698 1699
                     backup->has_on_source_error, backup->on_source_error,
                     backup->has_on_target_error, backup->on_target_error,
                     &local_err);
1700
    if (local_err) {
1701 1702 1703 1704
        error_propagate(errp, local_err);
        return;
    }

M
Max Reitz 已提交
1705
    state->bs = blk_bs(blk);
1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719
    state->job = state->bs->job;
}

static void drive_backup_abort(BlkTransactionState *common)
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
    BlockDriverState *bs = state->bs;

    /* Only cancel if it's the job we started */
    if (bs && bs->job && bs->job == state->job) {
        block_job_cancel_sync(bs->job);
    }
}

1720 1721 1722 1723 1724 1725 1726 1727 1728
static void drive_backup_clean(BlkTransactionState *common)
{
    DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);

    if (state->aio_context) {
        aio_context_release(state->aio_context);
    }
}

1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
typedef struct BlockdevBackupState {
    BlkTransactionState common;
    BlockDriverState *bs;
    BlockJob *job;
    AioContext *aio_context;
} BlockdevBackupState;

static void blockdev_backup_prepare(BlkTransactionState *common, Error **errp)
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
    BlockdevBackup *backup;
M
Max Reitz 已提交
1740
    BlockBackend *blk, *target;
1741 1742 1743 1744 1745
    Error *local_err = NULL;

    assert(common->action->kind == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
    backup = common->action->blockdev_backup;

1746 1747
    blk = blk_by_name(backup->device);
    if (!blk) {
1748
        error_setg(errp, "Device '%s' not found", backup->device);
1749 1750 1751
        return;
    }

M
Max Reitz 已提交
1752 1753
    target = blk_by_name(backup->target);
    if (!target) {
1754
        error_setg(errp, "Device '%s' not found", backup->target);
1755 1756 1757 1758
        return;
    }

    /* AioContext is released in .clean() */
M
Max Reitz 已提交
1759 1760
    state->aio_context = blk_get_aio_context(blk);
    if (state->aio_context != blk_get_aio_context(target)) {
1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777
        state->aio_context = NULL;
        error_setg(errp, "Backup between two IO threads is not implemented");
        return;
    }
    aio_context_acquire(state->aio_context);

    qmp_blockdev_backup(backup->device, backup->target,
                        backup->sync,
                        backup->has_speed, backup->speed,
                        backup->has_on_source_error, backup->on_source_error,
                        backup->has_on_target_error, backup->on_target_error,
                        &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

M
Max Reitz 已提交
1778
    state->bs = blk_bs(blk);
1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
    state->job = state->bs->job;
}

static void blockdev_backup_abort(BlkTransactionState *common)
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
    BlockDriverState *bs = state->bs;

    /* Only cancel if it's the job we started */
    if (bs && bs->job && bs->job == state->job) {
        block_job_cancel_sync(bs->job);
    }
}

static void blockdev_backup_clean(BlkTransactionState *common)
{
    BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);

    if (state->aio_context) {
        aio_context_release(state->aio_context);
    }
}

1802 1803 1804 1805 1806 1807 1808
static void abort_prepare(BlkTransactionState *common, Error **errp)
{
    error_setg(errp, "Transaction aborted using Abort action");
}

static void abort_commit(BlkTransactionState *common)
{
1809
    g_assert_not_reached(); /* this action never succeeds */
1810 1811
}

1812
static const BdrvActionOps actions[] = {
1813
    [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC] = {
1814
        .instance_size = sizeof(ExternalSnapshotState),
1815 1816 1817
        .prepare  = external_snapshot_prepare,
        .commit   = external_snapshot_commit,
        .abort = external_snapshot_abort,
1818
        .clean = external_snapshot_clean,
1819
    },
1820 1821 1822 1823
    [TRANSACTION_ACTION_KIND_DRIVE_BACKUP] = {
        .instance_size = sizeof(DriveBackupState),
        .prepare = drive_backup_prepare,
        .abort = drive_backup_abort,
1824
        .clean = drive_backup_clean,
1825
    },
1826 1827 1828 1829 1830 1831
    [TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP] = {
        .instance_size = sizeof(BlockdevBackupState),
        .prepare = blockdev_backup_prepare,
        .abort = blockdev_backup_abort,
        .clean = blockdev_backup_clean,
    },
1832 1833 1834 1835 1836
    [TRANSACTION_ACTION_KIND_ABORT] = {
        .instance_size = sizeof(BlkTransactionState),
        .prepare = abort_prepare,
        .commit = abort_commit,
    },
1837 1838 1839 1840
    [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC] = {
        .instance_size = sizeof(InternalSnapshotState),
        .prepare  = internal_snapshot_prepare,
        .abort = internal_snapshot_abort,
1841
        .clean = internal_snapshot_clean,
1842
    },
1843 1844
};

1845
/*
1846 1847
 * 'Atomic' group operations.  The operations are performed as a set, and if
 * any fail then we roll back all operations in the group.
1848
 */
1849
void qmp_transaction(TransactionActionList *dev_list, Error **errp)
1850
{
1851
    TransactionActionList *dev_entry = dev_list;
1852
    BlkTransactionState *state, *next;
1853
    Error *local_err = NULL;
1854

1855
    QSIMPLEQ_HEAD(snap_bdrv_states, BlkTransactionState) snap_bdrv_states;
1856 1857
    QSIMPLEQ_INIT(&snap_bdrv_states);

1858
    /* drain all i/o before any operations */
1859 1860
    bdrv_drain_all();

1861
    /* We don't do anything in this loop that commits us to the operations */
1862
    while (NULL != dev_entry) {
1863
        TransactionAction *dev_info = NULL;
1864
        const BdrvActionOps *ops;
1865

1866 1867 1868
        dev_info = dev_entry->value;
        dev_entry = dev_entry->next;

1869 1870 1871
        assert(dev_info->kind < ARRAY_SIZE(actions));

        ops = &actions[dev_info->kind];
1872 1873
        assert(ops->instance_size > 0);

1874 1875 1876 1877
        state = g_malloc0(ops->instance_size);
        state->ops = ops;
        state->action = dev_info;
        QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, state, entry);
1878

1879
        state->ops->prepare(state, &local_err);
1880
        if (local_err) {
1881 1882
            error_propagate(errp, local_err);
            goto delete_and_fail;
1883 1884 1885
        }
    }

1886
    QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
1887 1888 1889
        if (state->ops->commit) {
            state->ops->commit(state);
        }
1890 1891 1892 1893 1894 1895
    }

    /* success */
    goto exit;

delete_and_fail:
1896
    /* failure, and it is all-or-none; roll back all operations */
1897 1898 1899
    QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
        if (state->ops->abort) {
            state->ops->abort(state);
1900
        }
1901 1902
    }
exit:
1903 1904 1905
    QSIMPLEQ_FOREACH_SAFE(state, &snap_bdrv_states, entry, next) {
        if (state->ops->clean) {
            state->ops->clean(state);
1906
        }
1907
        g_free(state);
1908 1909 1910 1911
    }
}


1912
static void eject_device(BlockBackend *blk, int force, Error **errp)
1913
{
1914
    BlockDriverState *bs = blk_bs(blk);
1915 1916
    AioContext *aio_context;

M
Max Reitz 已提交
1917 1918 1919 1920 1921
    if (!bs) {
        /* No medium inserted, so there is nothing to do */
        return;
    }

1922 1923
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);
1924

1925
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) {
1926
        goto out;
1927
    }
1928
    if (!blk_dev_has_removable_media(blk)) {
1929 1930
        error_setg(errp, "Device '%s' is not removable",
                   bdrv_get_device_name(bs));
1931
        goto out;
1932
    }
1933

1934 1935
    if (blk_dev_is_medium_locked(blk) && !blk_dev_is_tray_open(blk)) {
        blk_dev_eject_request(blk, force);
P
Paolo Bonzini 已提交
1936
        if (!force) {
1937 1938
            error_setg(errp, "Device '%s' is locked",
                       bdrv_get_device_name(bs));
1939
            goto out;
P
Paolo Bonzini 已提交
1940
        }
1941
    }
1942

1943
    bdrv_close(bs);
1944 1945 1946

out:
    aio_context_release(aio_context);
1947 1948
}

L
Luiz Capitulino 已提交
1949
void qmp_eject(const char *device, bool has_force, bool force, Error **errp)
1950
{
1951
    BlockBackend *blk;
1952

1953 1954
    blk = blk_by_name(device);
    if (!blk) {
1955 1956
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
L
Luiz Capitulino 已提交
1957
        return;
1958 1959
    }

1960
    eject_device(blk, force, errp);
1961 1962
}

1963 1964 1965
void qmp_block_passwd(bool has_device, const char *device,
                      bool has_node_name, const char *node_name,
                      const char *password, Error **errp)
1966
{
1967
    Error *local_err = NULL;
1968
    BlockDriverState *bs;
1969
    AioContext *aio_context;
1970

1971 1972 1973
    bs = bdrv_lookup_bs(has_device ? device : NULL,
                        has_node_name ? node_name : NULL,
                        &local_err);
1974
    if (local_err) {
1975
        error_propagate(errp, local_err);
L
Luiz Capitulino 已提交
1976
        return;
1977 1978
    }

1979 1980 1981
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

1982
    bdrv_add_key(bs, password, errp);
1983 1984

    aio_context_release(aio_context);
1985 1986
}

1987
/* Assumes AioContext is held */
M
Max Reitz 已提交
1988 1989
static void qmp_bdrv_open_encrypted(BlockDriverState **pbs,
                                    const char *filename,
1990
                                    int bdrv_flags, const char *format,
L
Luiz Capitulino 已提交
1991 1992
                                    const char *password, Error **errp)
{
1993
    Error *local_err = NULL;
1994
    QDict *options = NULL;
1995 1996
    int ret;

1997 1998 1999 2000 2001
    if (format) {
        options = qdict_new();
        qdict_put(options, "driver", qstring_from_str(format));
    }

M
Max Reitz 已提交
2002
    ret = bdrv_open(pbs, filename, NULL, options, bdrv_flags, &local_err);
2003
    if (ret < 0) {
2004
        error_propagate(errp, local_err);
L
Luiz Capitulino 已提交
2005 2006 2007
        return;
    }

M
Max Reitz 已提交
2008
    bdrv_add_key(*pbs, password, errp);
L
Luiz Capitulino 已提交
2009 2010 2011
}

void qmp_change_blockdev(const char *device, const char *filename,
2012
                         const char *format, Error **errp)
2013
{
2014
    BlockBackend *blk;
2015
    BlockDriverState *bs;
2016
    AioContext *aio_context;
2017
    int bdrv_flags;
M
Max Reitz 已提交
2018
    bool new_bs;
2019
    Error *err = NULL;
2020

2021 2022
    blk = blk_by_name(device);
    if (!blk) {
2023 2024
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
L
Luiz Capitulino 已提交
2025
        return;
2026
    }
2027
    bs = blk_bs(blk);
M
Max Reitz 已提交
2028
    new_bs = !bs;
L
Luiz Capitulino 已提交
2029

M
Max Reitz 已提交
2030
    aio_context = blk_get_aio_context(blk);
2031 2032
    aio_context_acquire(aio_context);

2033
    eject_device(blk, 0, &err);
2034
    if (err) {
L
Luiz Capitulino 已提交
2035
        error_propagate(errp, err);
2036
        goto out;
2037
    }
L
Luiz Capitulino 已提交
2038

M
Max Reitz 已提交
2039 2040 2041 2042 2043 2044 2045 2046
    bdrv_flags = blk_is_read_only(blk) ? 0 : BDRV_O_RDWR;
    bdrv_flags |= blk_get_root_state(blk)->open_flags & ~BDRV_O_RDWR;

    qmp_bdrv_open_encrypted(&bs, filename, bdrv_flags, format, NULL, &err);
    if (err) {
        error_propagate(errp, err);
        goto out;
    }
L
Luiz Capitulino 已提交
2047

M
Max Reitz 已提交
2048 2049 2050 2051 2052 2053
    if (new_bs) {
        blk_insert_bs(blk, bs);
        /* Has been sent automatically by bdrv_open() if blk_bs(blk) was not
         * NULL */
        blk_dev_change_media_cb(blk, true);
    }
2054 2055 2056

out:
    aio_context_release(aio_context);
2057
}
2058

Z
Zhi Yong Wu 已提交
2059
/* throttling disk I/O limits */
2060
void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
                               int64_t bps_wr,
                               int64_t iops,
                               int64_t iops_rd,
                               int64_t iops_wr,
                               bool has_bps_max,
                               int64_t bps_max,
                               bool has_bps_rd_max,
                               int64_t bps_rd_max,
                               bool has_bps_wr_max,
                               int64_t bps_wr_max,
                               bool has_iops_max,
                               int64_t iops_max,
                               bool has_iops_rd_max,
                               int64_t iops_rd_max,
                               bool has_iops_wr_max,
2076 2077
                               int64_t iops_wr_max,
                               bool has_iops_size,
2078 2079 2080
                               int64_t iops_size,
                               bool has_group,
                               const char *group, Error **errp)
Z
Zhi Yong Wu 已提交
2081
{
2082
    ThrottleConfig cfg;
Z
Zhi Yong Wu 已提交
2083
    BlockDriverState *bs;
2084
    BlockBackend *blk;
2085
    AioContext *aio_context;
Z
Zhi Yong Wu 已提交
2086

2087 2088
    blk = blk_by_name(device);
    if (!blk) {
2089 2090
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
2091
        return;
Z
Zhi Yong Wu 已提交
2092
    }
M
Max Reitz 已提交
2093 2094 2095 2096

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

2097
    bs = blk_bs(blk);
M
Max Reitz 已提交
2098 2099 2100 2101
    if (!bs) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out;
    }
Z
Zhi Yong Wu 已提交
2102

2103 2104 2105 2106 2107 2108 2109 2110 2111
    memset(&cfg, 0, sizeof(cfg));
    cfg.buckets[THROTTLE_BPS_TOTAL].avg = bps;
    cfg.buckets[THROTTLE_BPS_READ].avg  = bps_rd;
    cfg.buckets[THROTTLE_BPS_WRITE].avg = bps_wr;

    cfg.buckets[THROTTLE_OPS_TOTAL].avg = iops;
    cfg.buckets[THROTTLE_OPS_READ].avg  = iops_rd;
    cfg.buckets[THROTTLE_OPS_WRITE].avg = iops_wr;

2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
    if (has_bps_max) {
        cfg.buckets[THROTTLE_BPS_TOTAL].max = bps_max;
    }
    if (has_bps_rd_max) {
        cfg.buckets[THROTTLE_BPS_READ].max = bps_rd_max;
    }
    if (has_bps_wr_max) {
        cfg.buckets[THROTTLE_BPS_WRITE].max = bps_wr_max;
    }
    if (has_iops_max) {
        cfg.buckets[THROTTLE_OPS_TOTAL].max = iops_max;
    }
    if (has_iops_rd_max) {
        cfg.buckets[THROTTLE_OPS_READ].max = iops_rd_max;
    }
    if (has_iops_wr_max) {
        cfg.buckets[THROTTLE_OPS_WRITE].max = iops_wr_max;
    }
Z
Zhi Yong Wu 已提交
2130

2131 2132 2133
    if (has_iops_size) {
        cfg.op_size = iops_size;
    }
2134 2135

    if (!check_throttle_config(&cfg, errp)) {
M
Max Reitz 已提交
2136
        goto out;
Z
Zhi Yong Wu 已提交
2137 2138
    }

2139 2140 2141 2142 2143 2144 2145 2146 2147
    if (throttle_enabled(&cfg)) {
        /* Enable I/O limits if they're not enabled yet, otherwise
         * just update the throttling group. */
        if (!bs->io_limits_enabled) {
            bdrv_io_limits_enable(bs, has_group ? group : device);
        } else if (has_group) {
            bdrv_io_limits_update_group(bs, group);
        }
        /* Set the new throttling configuration */
2148
        bdrv_set_io_limits(bs, &cfg);
2149 2150 2151
    } else if (bs->io_limits_enabled) {
        /* If all throttling settings are set to 0, disable I/O limits */
        bdrv_io_limits_disable(bs);
Z
Zhi Yong Wu 已提交
2152
    }
2153

M
Max Reitz 已提交
2154
out:
2155
    aio_context_release(aio_context);
Z
Zhi Yong Wu 已提交
2156 2157
}

2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206
void qmp_block_dirty_bitmap_add(const char *node, const char *name,
                                bool has_granularity, uint32_t granularity,
                                Error **errp)
{
    AioContext *aio_context;
    BlockDriverState *bs;

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

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

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

    if (has_granularity) {
        if (granularity < 512 || !is_power_of_2(granularity)) {
            error_setg(errp, "Granularity must be power of 2 "
                             "and at least 512");
            goto out;
        }
    } else {
        /* Default to cluster size, if available: */
        granularity = bdrv_get_default_bitmap_granularity(bs);
    }

    bdrv_create_dirty_bitmap(bs, granularity, name, errp);

 out:
    aio_context_release(aio_context);
}

void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
                                   Error **errp)
{
    AioContext *aio_context;
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;

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

J
John Snow 已提交
2207 2208 2209 2210 2211 2212
    if (bdrv_dirty_bitmap_frozen(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently frozen and cannot be removed",
                   name);
        goto out;
    }
2213
    bdrv_dirty_bitmap_make_anon(bitmap);
2214 2215
    bdrv_release_dirty_bitmap(bs, bitmap);

J
John Snow 已提交
2216
 out:
2217 2218 2219
    aio_context_release(aio_context);
}

J
John Snow 已提交
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253
/**
 * 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)
{
    AioContext *aio_context;
    BdrvDirtyBitmap *bitmap;
    BlockDriverState *bs;

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

    if (bdrv_dirty_bitmap_frozen(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently frozen and cannot be modified",
                   name);
        goto out;
    } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
        error_setg(errp,
                   "Bitmap '%s' is currently disabled and cannot be cleared",
                   name);
        goto out;
    }

    bdrv_clear_dirty_bitmap(bitmap);

 out:
    aio_context_release(aio_context);
}

2254
void hmp_drive_del(Monitor *mon, const QDict *qdict)
2255 2256
{
    const char *id = qdict_get_str(qdict, "id");
2257
    BlockBackend *blk;
2258
    BlockDriverState *bs;
2259
    AioContext *aio_context;
2260
    Error *local_err = NULL;
2261

2262 2263
    blk = blk_by_name(id);
    if (!blk) {
2264
        error_report("Device '%s' not found", id);
2265
        return;
2266
    }
2267

2268
    if (!blk_legacy_dinfo(blk)) {
2269 2270
        error_report("Deleting device added with blockdev-add"
                     " is not supported");
2271
        return;
2272 2273
    }

M
Max Reitz 已提交
2274
    aio_context = blk_get_aio_context(blk);
2275 2276
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2277 2278 2279 2280 2281 2282 2283
    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;
        }
2284

M
Max Reitz 已提交
2285 2286
        bdrv_close(bs);
    }
2287

2288
    /* if we have a device attached to this BlockDriverState
2289 2290 2291 2292
     * then we need to make the drive anonymous until the device
     * can be removed.  If this is a drive with no device backing
     * then we can just get rid of the block driver state right here.
     */
2293
    if (blk_get_attached_dev(blk)) {
2294
        blk_hide_on_behalf_of_hmp_drive_del(blk);
2295
        /* Further I/O must not pause the guest */
2296 2297
        blk_set_on_error(blk, BLOCKDEV_ON_ERROR_REPORT,
                         BLOCKDEV_ON_ERROR_REPORT);
2298
    } else {
2299
        blk_unref(blk);
2300 2301
    }

2302
    aio_context_release(aio_context);
2303
}
2304

2305 2306 2307
void qmp_block_resize(bool has_device, const char *device,
                      bool has_node_name, const char *node_name,
                      int64_t size, Error **errp)
2308
{
2309
    Error *local_err = NULL;
2310
    BlockDriverState *bs;
2311
    AioContext *aio_context;
2312
    int ret;
2313

2314 2315 2316
    bs = bdrv_lookup_bs(has_device ? device : NULL,
                        has_node_name ? node_name : NULL,
                        &local_err);
2317
    if (local_err) {
2318 2319 2320 2321
        error_propagate(errp, local_err);
        return;
    }

2322 2323 2324
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

2325
    if (!bdrv_is_first_non_filter(bs)) {
2326
        error_setg(errp, QERR_FEATURE_DISABLED, "resize");
2327
        goto out;
2328 2329 2330
    }

    if (size < 0) {
2331
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 size");
2332
        goto out;
2333 2334
    }

2335
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, NULL)) {
2336
        error_setg(errp, QERR_DEVICE_IN_USE, device);
2337
        goto out;
2338 2339
    }

2340 2341 2342
    /* complete all in-flight operations before resizing the device */
    bdrv_drain_all();

2343 2344
    ret = bdrv_truncate(bs, size);
    switch (ret) {
2345 2346 2347
    case 0:
        break;
    case -ENOMEDIUM:
2348
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
2349 2350
        break;
    case -ENOTSUP:
2351
        error_setg(errp, QERR_UNSUPPORTED);
2352 2353
        break;
    case -EACCES:
2354
        error_setg(errp, "Device '%s' is read only", device);
2355 2356
        break;
    case -EBUSY:
2357
        error_setg(errp, QERR_DEVICE_IN_USE, device);
2358 2359
        break;
    default:
2360
        error_setg_errno(errp, -ret, "Could not resize");
2361
        break;
2362
    }
2363 2364 2365

out:
    aio_context_release(aio_context);
2366
}
S
Stefan Hajnoczi 已提交
2367

2368
static void block_job_cb(void *opaque, int ret)
S
Stefan Hajnoczi 已提交
2369
{
2370 2371 2372 2373 2374
    /* Note that this function may be executed from another AioContext besides
     * the QEMU main loop.  If you need to access anything that assumes the
     * QEMU global mutex, use a BH or introduce a mutex.
     */

S
Stefan Hajnoczi 已提交
2375
    BlockDriverState *bs = opaque;
2376
    const char *msg = NULL;
S
Stefan Hajnoczi 已提交
2377

2378
    trace_block_job_cb(bs, bs->job, ret);
S
Stefan Hajnoczi 已提交
2379 2380

    assert(bs->job);
2381

S
Stefan Hajnoczi 已提交
2382
    if (ret < 0) {
2383
        msg = strerror(-ret);
S
Stefan Hajnoczi 已提交
2384 2385
    }

2386
    if (block_job_is_cancelled(bs->job)) {
2387
        block_job_event_cancelled(bs->job);
2388
    } else {
2389
        block_job_event_completed(bs->job, msg);
2390
    }
2391

F
Fam Zheng 已提交
2392
    bdrv_put_ref_bh_schedule(bs);
S
Stefan Hajnoczi 已提交
2393 2394
}

2395 2396 2397 2398
void qmp_block_stream(const char *device,
                      bool has_base, const char *base,
                      bool has_backing_file, const char *backing_file,
                      bool has_speed, int64_t speed,
P
Paolo Bonzini 已提交
2399 2400
                      bool has_on_error, BlockdevOnError on_error,
                      Error **errp)
S
Stefan Hajnoczi 已提交
2401
{
2402
    BlockBackend *blk;
S
Stefan Hajnoczi 已提交
2403
    BlockDriverState *bs;
2404
    BlockDriverState *base_bs = NULL;
2405
    AioContext *aio_context;
2406
    Error *local_err = NULL;
2407
    const char *base_name = NULL;
S
Stefan Hajnoczi 已提交
2408

P
Paolo Bonzini 已提交
2409 2410 2411 2412
    if (!has_on_error) {
        on_error = BLOCKDEV_ON_ERROR_REPORT;
    }

2413 2414
    blk = blk_by_name(device);
    if (!blk) {
2415 2416
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
S
Stefan Hajnoczi 已提交
2417 2418 2419
        return;
    }

M
Max Reitz 已提交
2420
    aio_context = blk_get_aio_context(blk);
2421 2422
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2423 2424 2425 2426 2427 2428
    if (!blk_is_available(blk)) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out;
    }
    bs = blk_bs(blk);

2429
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_STREAM, errp)) {
2430
        goto out;
2431 2432
    }

2433
    if (has_base) {
2434 2435
        base_bs = bdrv_find_backing_image(bs, base);
        if (base_bs == NULL) {
2436
            error_setg(errp, QERR_BASE_NOT_FOUND, base);
2437
            goto out;
2438
        }
2439
        assert(bdrv_get_aio_context(base_bs) == aio_context);
2440
        base_name = base;
S
Stefan Hajnoczi 已提交
2441 2442
    }

2443 2444 2445 2446 2447
    /* 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");
2448
        goto out;
2449 2450 2451 2452 2453 2454
    }

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

    stream_start(bs, base_bs, base_name, has_speed ? speed : 0,
P
Paolo Bonzini 已提交
2455
                 on_error, block_job_cb, bs, &local_err);
2456
    if (local_err) {
2457
        error_propagate(errp, local_err);
2458
        goto out;
S
Stefan Hajnoczi 已提交
2459 2460 2461
    }

    trace_qmp_block_stream(bs, bs->job);
2462 2463 2464

out:
    aio_context_release(aio_context);
S
Stefan Hajnoczi 已提交
2465
}
2466

2467
void qmp_block_commit(const char *device,
2468 2469
                      bool has_base, const char *base,
                      bool has_top, const char *top,
2470
                      bool has_backing_file, const char *backing_file,
2471 2472 2473
                      bool has_speed, int64_t speed,
                      Error **errp)
{
2474
    BlockBackend *blk;
2475 2476
    BlockDriverState *bs;
    BlockDriverState *base_bs, *top_bs;
2477
    AioContext *aio_context;
2478 2479 2480 2481
    Error *local_err = NULL;
    /* This will be part of the QMP command, if/when the
     * BlockdevOnError change for blkmirror makes it in
     */
2482
    BlockdevOnError on_error = BLOCKDEV_ON_ERROR_REPORT;
2483

2484 2485 2486 2487
    if (!has_speed) {
        speed = 0;
    }

2488 2489 2490 2491 2492
    /* 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. */
2493 2494
    blk = blk_by_name(device);
    if (!blk) {
2495 2496
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
2497
        return;
2498 2499
    }

M
Max Reitz 已提交
2500
    aio_context = blk_get_aio_context(blk);
2501 2502
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2503 2504 2505 2506 2507 2508
    if (!blk_is_available(blk)) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out;
    }
    bs = blk_bs(blk);

2509
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, errp)) {
2510
        goto out;
2511 2512 2513 2514 2515
    }

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

2516
    if (has_top && top) {
2517 2518 2519 2520 2521 2522 2523
        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");
2524
        goto out;
2525 2526
    }

2527 2528
    assert(bdrv_get_aio_context(top_bs) == aio_context);

2529 2530 2531 2532 2533 2534 2535
    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) {
2536
        error_setg(errp, QERR_BASE_NOT_FOUND, base ? base : "NULL");
2537
        goto out;
2538 2539
    }

2540 2541
    assert(bdrv_get_aio_context(base_bs) == aio_context);

2542 2543 2544 2545
    if (bdrv_op_is_blocked(base_bs, BLOCK_OP_TYPE_COMMIT_TARGET, errp)) {
        goto out;
    }

2546 2547 2548
    /* Do not allow attempts to commit an image into itself */
    if (top_bs == base_bs) {
        error_setg(errp, "cannot commit an image into itself");
2549
        goto out;
2550 2551
    }

F
Fam Zheng 已提交
2552
    if (top_bs == bs) {
2553 2554 2555
        if (has_backing_file) {
            error_setg(errp, "'backing-file' specified,"
                             " but 'top' is the active layer");
2556
            goto out;
2557
        }
F
Fam Zheng 已提交
2558 2559 2560 2561
        commit_active_start(bs, base_bs, speed, on_error, block_job_cb,
                            bs, &local_err);
    } else {
        commit_start(bs, base_bs, top_bs, speed, on_error, block_job_cb, bs,
2562
                     has_backing_file ? backing_file : NULL, &local_err);
F
Fam Zheng 已提交
2563
    }
2564 2565
    if (local_err != NULL) {
        error_propagate(errp, local_err);
2566
        goto out;
2567
    }
2568 2569 2570

out:
    aio_context_release(aio_context);
2571 2572
}

2573 2574
void qmp_drive_backup(const char *device, const char *target,
                      bool has_format, const char *format,
2575
                      enum MirrorSyncMode sync,
2576 2577
                      bool has_mode, enum NewImageMode mode,
                      bool has_speed, int64_t speed,
2578
                      bool has_bitmap, const char *bitmap,
2579 2580 2581 2582
                      bool has_on_source_error, BlockdevOnError on_source_error,
                      bool has_on_target_error, BlockdevOnError on_target_error,
                      Error **errp)
{
2583
    BlockBackend *blk;
2584 2585
    BlockDriverState *bs;
    BlockDriverState *target_bs;
2586
    BlockDriverState *source = NULL;
2587
    BdrvDirtyBitmap *bmap = NULL;
2588
    AioContext *aio_context;
2589
    QDict *options = NULL;
2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607
    Error *local_err = NULL;
    int flags;
    int64_t size;
    int ret;

    if (!has_speed) {
        speed = 0;
    }
    if (!has_on_source_error) {
        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_on_target_error) {
        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_mode) {
        mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
    }

2608 2609
    blk = blk_by_name(device);
    if (!blk) {
2610 2611
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
2612 2613 2614
        return;
    }

M
Max Reitz 已提交
2615
    aio_context = blk_get_aio_context(blk);
2616 2617
    aio_context_acquire(aio_context);

F
Fam Zheng 已提交
2618 2619
    /* Although backup_run has this check too, we need to use bs->drv below, so
     * do an early check redundantly. */
M
Max Reitz 已提交
2620
    if (!blk_is_available(blk)) {
2621
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
2622
        goto out;
2623
    }
M
Max Reitz 已提交
2624
    bs = blk_bs(blk);
2625 2626 2627 2628 2629

    if (!has_format) {
        format = mode == NEW_IMAGE_MODE_EXISTING ? NULL : bs->drv->format_name;
    }

F
Fam Zheng 已提交
2630
    /* Early check to avoid creating target */
2631
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
2632
        goto out;
2633 2634 2635 2636
    }

    flags = bs->open_flags | BDRV_O_RDWR;

2637 2638 2639
    /* See if we have a backing HD we can use to create our new image
     * on top of. */
    if (sync == MIRROR_SYNC_MODE_TOP) {
2640
        source = backing_bs(bs);
2641 2642 2643 2644 2645 2646 2647 2648
        if (!source) {
            sync = MIRROR_SYNC_MODE_FULL;
        }
    }
    if (sync == MIRROR_SYNC_MODE_NONE) {
        source = bs;
    }

2649 2650 2651
    size = bdrv_getlength(bs);
    if (size < 0) {
        error_setg_errno(errp, -size, "bdrv_getlength failed");
2652
        goto out;
2653 2654 2655
    }

    if (mode != NEW_IMAGE_MODE_EXISTING) {
2656
        assert(format);
2657 2658 2659 2660 2661 2662 2663 2664
        if (source) {
            bdrv_img_create(target, format, source->filename,
                            source->drv->format_name, NULL,
                            size, flags, &local_err, false);
        } else {
            bdrv_img_create(target, format, NULL, NULL, NULL,
                            size, flags, &local_err, false);
        }
2665 2666
    }

2667
    if (local_err) {
2668
        error_propagate(errp, local_err);
2669
        goto out;
2670 2671
    }

2672 2673 2674 2675 2676
    if (format) {
        options = qdict_new();
        qdict_put(options, "driver", qstring_from_str(format));
    }

2677
    target_bs = NULL;
2678
    ret = bdrv_open(&target_bs, target, NULL, options, flags, &local_err);
2679
    if (ret < 0) {
2680
        error_propagate(errp, local_err);
2681
        goto out;
2682 2683
    }

2684 2685
    bdrv_set_aio_context(target_bs, aio_context);

2686 2687 2688 2689 2690 2691 2692 2693 2694 2695
    if (has_bitmap) {
        bmap = bdrv_find_dirty_bitmap(bs, bitmap);
        if (!bmap) {
            error_setg(errp, "Bitmap '%s' could not be found", bitmap);
            goto out;
        }
    }

    backup_start(bs, target_bs, speed, sync, bmap,
                 on_source_error, on_target_error,
2696 2697
                 block_job_cb, bs, &local_err);
    if (local_err != NULL) {
F
Fam Zheng 已提交
2698
        bdrv_unref(target_bs);
2699
        error_propagate(errp, local_err);
2700
        goto out;
2701
    }
2702 2703 2704

out:
    aio_context_release(aio_context);
2705 2706
}

2707 2708
BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
{
2709
    return bdrv_named_nodes_list(errp);
2710 2711
}

F
Fam Zheng 已提交
2712 2713 2714 2715 2716 2717 2718 2719 2720
void qmp_blockdev_backup(const char *device, const char *target,
                         enum MirrorSyncMode sync,
                         bool has_speed, int64_t speed,
                         bool has_on_source_error,
                         BlockdevOnError on_source_error,
                         bool has_on_target_error,
                         BlockdevOnError on_target_error,
                         Error **errp)
{
M
Max Reitz 已提交
2721
    BlockBackend *blk, *target_blk;
F
Fam Zheng 已提交
2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736
    BlockDriverState *bs;
    BlockDriverState *target_bs;
    Error *local_err = NULL;
    AioContext *aio_context;

    if (!has_speed) {
        speed = 0;
    }
    if (!has_on_source_error) {
        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_on_target_error) {
        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
    }

2737 2738
    blk = blk_by_name(device);
    if (!blk) {
2739
        error_setg(errp, "Device '%s' not found", device);
F
Fam Zheng 已提交
2740 2741 2742
        return;
    }

M
Max Reitz 已提交
2743
    aio_context = blk_get_aio_context(blk);
F
Fam Zheng 已提交
2744 2745
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2746 2747 2748 2749 2750 2751 2752 2753
    if (!blk_is_available(blk)) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out;
    }
    bs = blk_bs(blk);

    target_blk = blk_by_name(target);
    if (!target_blk) {
2754
        error_setg(errp, "Device '%s' not found", target);
F
Fam Zheng 已提交
2755 2756
        goto out;
    }
M
Max Reitz 已提交
2757 2758 2759 2760 2761 2762

    if (!blk_is_available(target_blk)) {
        error_setg(errp, "Device '%s' has no medium", target);
        goto out;
    }
    target_bs = blk_bs(target_blk);
F
Fam Zheng 已提交
2763 2764 2765

    bdrv_ref(target_bs);
    bdrv_set_aio_context(target_bs, aio_context);
2766 2767
    backup_start(bs, target_bs, speed, sync, NULL, on_source_error,
                 on_target_error, block_job_cb, bs, &local_err);
F
Fam Zheng 已提交
2768 2769 2770 2771 2772 2773 2774 2775
    if (local_err != NULL) {
        bdrv_unref(target_bs);
        error_propagate(errp, local_err);
    }
out:
    aio_context_release(aio_context);
}

P
Paolo Bonzini 已提交
2776 2777
void qmp_drive_mirror(const char *device, const char *target,
                      bool has_format, const char *format,
2778
                      bool has_node_name, const char *node_name,
2779
                      bool has_replaces, const char *replaces,
P
Paolo Bonzini 已提交
2780 2781
                      enum MirrorSyncMode sync,
                      bool has_mode, enum NewImageMode mode,
2782
                      bool has_speed, int64_t speed,
2783
                      bool has_granularity, uint32_t granularity,
2784
                      bool has_buf_size, int64_t buf_size,
2785 2786
                      bool has_on_source_error, BlockdevOnError on_source_error,
                      bool has_on_target_error, BlockdevOnError on_target_error,
2787
                      bool has_unmap, bool unmap,
2788
                      Error **errp)
P
Paolo Bonzini 已提交
2789
{
2790
    BlockBackend *blk;
P
Paolo Bonzini 已提交
2791 2792
    BlockDriverState *bs;
    BlockDriverState *source, *target_bs;
2793
    AioContext *aio_context;
P
Paolo Bonzini 已提交
2794
    Error *local_err = NULL;
2795
    QDict *options;
P
Paolo Bonzini 已提交
2796
    int flags;
2797
    int64_t size;
P
Paolo Bonzini 已提交
2798 2799 2800 2801 2802
    int ret;

    if (!has_speed) {
        speed = 0;
    }
2803 2804 2805 2806 2807 2808
    if (!has_on_source_error) {
        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_on_target_error) {
        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
    }
P
Paolo Bonzini 已提交
2809 2810 2811
    if (!has_mode) {
        mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
    }
2812 2813 2814
    if (!has_granularity) {
        granularity = 0;
    }
2815
    if (!has_buf_size) {
W
Wen Congyang 已提交
2816
        buf_size = 0;
2817
    }
2818 2819 2820
    if (!has_unmap) {
        unmap = true;
    }
2821

2822
    if (granularity != 0 && (granularity < 512 || granularity > 1048576 * 64)) {
2823 2824
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity",
                   "a value in range [512B, 64MB]");
2825 2826 2827
        return;
    }
    if (granularity & (granularity - 1)) {
2828 2829
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity",
                   "power of 2");
2830 2831
        return;
    }
P
Paolo Bonzini 已提交
2832

2833 2834
    blk = blk_by_name(device);
    if (!blk) {
2835 2836
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
P
Paolo Bonzini 已提交
2837 2838 2839
        return;
    }

M
Max Reitz 已提交
2840
    aio_context = blk_get_aio_context(blk);
2841 2842
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
2843
    if (!blk_is_available(blk)) {
2844
        error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
2845
        goto out;
P
Paolo Bonzini 已提交
2846
    }
M
Max Reitz 已提交
2847
    bs = blk_bs(blk);
P
Paolo Bonzini 已提交
2848 2849 2850 2851 2852

    if (!has_format) {
        format = mode == NEW_IMAGE_MODE_EXISTING ? NULL : bs->drv->format_name;
    }

2853
    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_MIRROR, errp)) {
2854
        goto out;
P
Paolo Bonzini 已提交
2855 2856 2857
    }

    flags = bs->open_flags | BDRV_O_RDWR;
2858
    source = backing_bs(bs);
P
Paolo Bonzini 已提交
2859 2860 2861
    if (!source && sync == MIRROR_SYNC_MODE_TOP) {
        sync = MIRROR_SYNC_MODE_FULL;
    }
2862 2863 2864
    if (sync == MIRROR_SYNC_MODE_NONE) {
        source = bs;
    }
P
Paolo Bonzini 已提交
2865

2866 2867 2868
    size = bdrv_getlength(bs);
    if (size < 0) {
        error_setg_errno(errp, -size, "bdrv_getlength failed");
2869
        goto out;
2870 2871
    }

2872 2873
    if (has_replaces) {
        BlockDriverState *to_replace_bs;
2874 2875
        AioContext *replace_aio_context;
        int64_t replace_size;
2876 2877 2878 2879

        if (!has_node_name) {
            error_setg(errp, "a node-name must be provided when replacing a"
                             " named node of the graph");
2880
            goto out;
2881 2882
        }

2883
        to_replace_bs = check_to_replace_node(bs, replaces, &local_err);
2884 2885 2886

        if (!to_replace_bs) {
            error_propagate(errp, local_err);
2887
            goto out;
2888 2889
        }

2890 2891 2892 2893 2894 2895
        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) {
2896 2897
            error_setg(errp, "cannot replace image with a mirror image of "
                             "different size");
2898
            goto out;
2899 2900 2901
        }
    }

2902 2903 2904
    if ((sync == MIRROR_SYNC_MODE_FULL || !source)
        && mode != NEW_IMAGE_MODE_EXISTING)
    {
P
Paolo Bonzini 已提交
2905
        /* create new image w/o backing file */
2906
        assert(format);
2907
        bdrv_img_create(target, format,
2908
                        NULL, NULL, NULL, size, flags, &local_err, false);
P
Paolo Bonzini 已提交
2909 2910 2911 2912 2913 2914
    } else {
        switch (mode) {
        case NEW_IMAGE_MODE_EXISTING:
            break;
        case NEW_IMAGE_MODE_ABSOLUTE_PATHS:
            /* create new image with backing file */
2915 2916 2917
            bdrv_img_create(target, format,
                            source->filename,
                            source->drv->format_name,
2918
                            NULL, size, flags, &local_err, false);
P
Paolo Bonzini 已提交
2919 2920 2921 2922 2923 2924
            break;
        default:
            abort();
        }
    }

2925
    if (local_err) {
2926
        error_propagate(errp, local_err);
2927
        goto out;
P
Paolo Bonzini 已提交
2928 2929
    }

2930
    options = qdict_new();
2931 2932 2933
    if (has_node_name) {
        qdict_put(options, "node-name", qstring_from_str(node_name));
    }
2934 2935 2936
    if (format) {
        qdict_put(options, "driver", qstring_from_str(format));
    }
2937

2938 2939 2940
    /* Mirroring takes care of copy-on-write using the source's backing
     * file.
     */
2941
    target_bs = NULL;
2942
    ret = bdrv_open(&target_bs, target, NULL, options,
2943
                    flags | BDRV_O_NO_BACKING, &local_err);
P
Paolo Bonzini 已提交
2944
    if (ret < 0) {
2945
        error_propagate(errp, local_err);
2946
        goto out;
P
Paolo Bonzini 已提交
2947 2948
    }

2949 2950
    bdrv_set_aio_context(target_bs, aio_context);

2951 2952 2953 2954 2955 2956
    /* 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
     */
    mirror_start(bs, target_bs,
                 has_replaces ? replaces : NULL,
                 speed, granularity, buf_size, sync,
2957
                 on_source_error, on_target_error,
2958
                 unmap,
2959
                 block_job_cb, bs, &local_err);
P
Paolo Bonzini 已提交
2960
    if (local_err != NULL) {
F
Fam Zheng 已提交
2961
        bdrv_unref(target_bs);
P
Paolo Bonzini 已提交
2962
        error_propagate(errp, local_err);
2963
        goto out;
P
Paolo Bonzini 已提交
2964
    }
2965 2966 2967

out:
    aio_context_release(aio_context);
P
Paolo Bonzini 已提交
2968 2969
}

2970
/* Get the block job for a given device name and acquire its AioContext */
2971 2972
static BlockJob *find_block_job(const char *device, AioContext **aio_context,
                                Error **errp)
2973
{
2974
    BlockBackend *blk;
2975 2976
    BlockDriverState *bs;

M
Max Reitz 已提交
2977 2978
    *aio_context = NULL;

2979 2980
    blk = blk_by_name(device);
    if (!blk) {
2981 2982 2983
        goto notfound;
    }

M
Max Reitz 已提交
2984
    *aio_context = blk_get_aio_context(blk);
2985 2986
    aio_context_acquire(*aio_context);

M
Max Reitz 已提交
2987 2988 2989 2990 2991
    if (!blk_is_available(blk)) {
        goto notfound;
    }
    bs = blk_bs(blk);

2992 2993
    if (!bs->job) {
        goto notfound;
2994
    }
2995

2996
    return bs->job;
2997 2998

notfound:
2999 3000
    error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
              "No active block job on device '%s'", device);
M
Max Reitz 已提交
3001 3002 3003 3004
    if (*aio_context) {
        aio_context_release(*aio_context);
        *aio_context = NULL;
    }
3005
    return NULL;
3006 3007
}

3008
void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
3009
{
3010
    AioContext *aio_context;
3011
    BlockJob *job = find_block_job(device, &aio_context, errp);
3012 3013 3014 3015 3016

    if (!job) {
        return;
    }

3017
    block_job_set_speed(job, speed, errp);
3018
    aio_context_release(aio_context);
3019
}
3020

3021 3022
void qmp_block_job_cancel(const char *device,
                          bool has_force, bool force, Error **errp)
3023
{
3024
    AioContext *aio_context;
3025
    BlockJob *job = find_block_job(device, &aio_context, errp);
3026

3027 3028 3029
    if (!job) {
        return;
    }
3030 3031 3032 3033 3034

    if (!has_force) {
        force = false;
    }

F
Fam Zheng 已提交
3035
    if (job->user_paused && !force) {
3036 3037
        error_setg(errp, "The block job for device '%s' is currently paused",
                   device);
3038
        goto out;
3039
    }
3040 3041 3042

    trace_qmp_block_job_cancel(job);
    block_job_cancel(job);
3043 3044
out:
    aio_context_release(aio_context);
3045
}
S
Stefan Hajnoczi 已提交
3046

3047 3048
void qmp_block_job_pause(const char *device, Error **errp)
{
3049
    AioContext *aio_context;
3050
    BlockJob *job = find_block_job(device, &aio_context, errp);
3051

F
Fam Zheng 已提交
3052
    if (!job || job->user_paused) {
3053 3054 3055
        return;
    }

F
Fam Zheng 已提交
3056
    job->user_paused = true;
3057 3058
    trace_qmp_block_job_pause(job);
    block_job_pause(job);
3059
    aio_context_release(aio_context);
3060 3061 3062 3063
}

void qmp_block_job_resume(const char *device, Error **errp)
{
3064
    AioContext *aio_context;
3065
    BlockJob *job = find_block_job(device, &aio_context, errp);
3066

F
Fam Zheng 已提交
3067
    if (!job || !job->user_paused) {
3068 3069 3070
        return;
    }

F
Fam Zheng 已提交
3071
    job->user_paused = false;
3072 3073
    trace_qmp_block_job_resume(job);
    block_job_resume(job);
3074
    aio_context_release(aio_context);
3075 3076
}

P
Paolo Bonzini 已提交
3077 3078
void qmp_block_job_complete(const char *device, Error **errp)
{
3079
    AioContext *aio_context;
3080
    BlockJob *job = find_block_job(device, &aio_context, errp);
P
Paolo Bonzini 已提交
3081 3082 3083 3084 3085 3086 3087

    if (!job) {
        return;
    }

    trace_qmp_block_job_complete(job);
    block_job_complete(job, errp);
3088
    aio_context_release(aio_context);
P
Paolo Bonzini 已提交
3089 3090
}

3091 3092 3093 3094 3095
void qmp_change_backing_file(const char *device,
                             const char *image_node_name,
                             const char *backing_file,
                             Error **errp)
{
3096
    BlockBackend *blk;
3097
    BlockDriverState *bs = NULL;
3098
    AioContext *aio_context;
3099 3100 3101 3102 3103 3104
    BlockDriverState *image_bs = NULL;
    Error *local_err = NULL;
    bool ro;
    int open_flags;
    int ret;

3105 3106
    blk = blk_by_name(device);
    if (!blk) {
3107 3108
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", device);
3109 3110 3111
        return;
    }

M
Max Reitz 已提交
3112
    aio_context = blk_get_aio_context(blk);
3113 3114
    aio_context_acquire(aio_context);

M
Max Reitz 已提交
3115 3116 3117 3118 3119 3120
    if (!blk_is_available(blk)) {
        error_setg(errp, "Device '%s' has no medium", device);
        goto out;
    }
    bs = blk_bs(blk);

3121 3122 3123
    image_bs = bdrv_lookup_bs(NULL, image_node_name, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
3124
        goto out;
3125 3126 3127 3128
    }

    if (!image_bs) {
        error_setg(errp, "image file not found");
3129
        goto out;
3130 3131 3132 3133 3134
    }

    if (bdrv_find_base(image_bs) == image_bs) {
        error_setg(errp, "not allowing backing file change on an image "
                         "without a backing file");
3135
        goto out;
3136 3137 3138 3139 3140
    }

    /* 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)) {
3141
        goto out;
3142 3143 3144 3145 3146 3147
    }

    /* final sanity check */
    if (!bdrv_chain_contains(bs, image_bs)) {
        error_setg(errp, "'%s' and image file are not in the same chain",
                   device);
3148
        goto out;
3149 3150 3151 3152 3153 3154 3155 3156 3157 3158
    }

    /* 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);
3159
            goto out;
3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178
        }
    }

    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);
        if (local_err) {
            error_propagate(errp, local_err); /* will preserve prior errp */
        }
    }
3179 3180 3181

out:
    aio_context_release(aio_context);
3182 3183
}

K
Kevin Wolf 已提交
3184 3185 3186
void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
{
    QmpOutputVisitor *ov = qmp_output_visitor_new();
3187 3188
    BlockDriverState *bs;
    BlockBackend *blk = NULL;
K
Kevin Wolf 已提交
3189 3190 3191 3192
    QObject *obj;
    QDict *qdict;
    Error *local_err = NULL;

3193
    /* TODO Sort it out in raw-posix and drive_new(): Reject aio=native with
K
Kevin Wolf 已提交
3194
     * cache.direct=false instead of silently switching to aio=threads, except
3195
     * when called from drive_new().
K
Kevin Wolf 已提交
3196 3197 3198
     *
     * For now, simply forbidding the combination for all drivers will do. */
    if (options->has_aio && options->aio == BLOCKDEV_AIO_OPTIONS_NATIVE) {
3199 3200 3201 3202
        bool direct = options->has_cache &&
                      options->cache->has_direct &&
                      options->cache->direct;
        if (!direct) {
K
Kevin Wolf 已提交
3203 3204 3205 3206 3207 3208 3209
            error_setg(errp, "aio=native requires cache.direct=true");
            goto fail;
        }
    }

    visit_type_BlockdevOptions(qmp_output_get_visitor(ov),
                               &options, NULL, &local_err);
3210
    if (local_err) {
K
Kevin Wolf 已提交
3211 3212 3213 3214 3215 3216 3217 3218 3219
        error_propagate(errp, local_err);
        goto fail;
    }

    obj = qmp_output_get_qobject(ov);
    qdict = qobject_to_qdict(obj);

    qdict_flatten(qdict);

3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234
    if (options->has_id) {
        blk = blockdev_init(NULL, qdict, &local_err);
        if (local_err) {
            error_propagate(errp, local_err);
            goto fail;
        }

        bs = blk_bs(blk);
    } else {
        if (!qdict_get_try_str(qdict, "node-name")) {
            error_setg(errp, "'id' and/or 'node-name' need to be specified for "
                       "the root node");
            goto fail;
        }

3235 3236
        bs = bds_tree_init(qdict, errp);
        if (!bs) {
3237 3238
            goto fail;
        }
K
Kevin Wolf 已提交
3239 3240
    }

3241 3242 3243 3244 3245 3246
    if (bs && bdrv_key_required(bs)) {
        if (blk) {
            blk_unref(blk);
        } else {
            bdrv_unref(bs);
        }
3247 3248 3249 3250
        error_setg(errp, "blockdev-add doesn't support encrypted devices");
        goto fail;
    }

K
Kevin Wolf 已提交
3251 3252 3253 3254
fail:
    qmp_output_visitor_cleanup(ov);
}

3255
BlockJobInfoList *qmp_query_block_jobs(Error **errp)
S
Stefan Hajnoczi 已提交
3256
{
3257 3258
    BlockJobInfoList *head = NULL, **p_next = &head;
    BlockDriverState *bs;
S
Stefan Hajnoczi 已提交
3259

3260
    for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
3261 3262 3263 3264
        AioContext *aio_context = bdrv_get_aio_context(bs);

        aio_context_acquire(aio_context);

3265 3266 3267 3268 3269 3270
        if (bs->job) {
            BlockJobInfoList *elem = g_new0(BlockJobInfoList, 1);
            elem->value = block_job_query(bs->job);
            *p_next = elem;
            p_next = &elem->next;
        }
3271 3272

        aio_context_release(aio_context);
S
Stefan Hajnoczi 已提交
3273 3274
    }

3275
    return head;
S
Stefan Hajnoczi 已提交
3276
}
3277

3278
QemuOptsList qemu_common_drive_opts = {
3279
    .name = "drive",
3280
    .head = QTAILQ_HEAD_INITIALIZER(qemu_common_drive_opts.head),
3281 3282 3283 3284 3285
    .desc = {
        {
            .name = "snapshot",
            .type = QEMU_OPT_BOOL,
            .help = "enable/disable snapshot mode",
3286 3287 3288 3289
        },{
            .name = "discard",
            .type = QEMU_OPT_STRING,
            .help = "discard operation (ignore/off, unmap/on)",
3290
        },{
3291
            .name = BDRV_OPT_CACHE_WB,
K
Kevin Wolf 已提交
3292 3293 3294
            .type = QEMU_OPT_BOOL,
            .help = "enables writeback mode for any caches",
        },{
3295
            .name = BDRV_OPT_CACHE_DIRECT,
K
Kevin Wolf 已提交
3296 3297 3298
            .type = QEMU_OPT_BOOL,
            .help = "enables use of O_DIRECT (bypass the host page cache)",
        },{
3299
            .name = BDRV_OPT_CACHE_NO_FLUSH,
K
Kevin Wolf 已提交
3300 3301
            .type = QEMU_OPT_BOOL,
            .help = "ignore any flush requests for the device",
3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318
        },{
            .name = "aio",
            .type = QEMU_OPT_STRING,
            .help = "host AIO implementation (threads, native)",
        },{
            .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",
        },{
3319
            .name = "read-only",
3320 3321 3322
            .type = QEMU_OPT_BOOL,
            .help = "open drive file as read-only",
        },{
3323
            .name = "throttling.iops-total",
3324 3325 3326
            .type = QEMU_OPT_NUMBER,
            .help = "limit total I/O operations per second",
        },{
3327
            .name = "throttling.iops-read",
3328 3329 3330
            .type = QEMU_OPT_NUMBER,
            .help = "limit read operations per second",
        },{
3331
            .name = "throttling.iops-write",
3332 3333 3334
            .type = QEMU_OPT_NUMBER,
            .help = "limit write operations per second",
        },{
3335
            .name = "throttling.bps-total",
3336 3337 3338
            .type = QEMU_OPT_NUMBER,
            .help = "limit total bytes per second",
        },{
3339
            .name = "throttling.bps-read",
3340 3341 3342
            .type = QEMU_OPT_NUMBER,
            .help = "limit read bytes per second",
        },{
3343
            .name = "throttling.bps-write",
3344 3345
            .type = QEMU_OPT_NUMBER,
            .help = "limit write bytes per second",
3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369
        },{
            .name = "throttling.iops-total-max",
            .type = QEMU_OPT_NUMBER,
            .help = "I/O operations burst",
        },{
            .name = "throttling.iops-read-max",
            .type = QEMU_OPT_NUMBER,
            .help = "I/O operations read burst",
        },{
            .name = "throttling.iops-write-max",
            .type = QEMU_OPT_NUMBER,
            .help = "I/O operations write burst",
        },{
            .name = "throttling.bps-total-max",
            .type = QEMU_OPT_NUMBER,
            .help = "total bytes burst",
        },{
            .name = "throttling.bps-read-max",
            .type = QEMU_OPT_NUMBER,
            .help = "total bytes read burst",
        },{
            .name = "throttling.bps-write-max",
            .type = QEMU_OPT_NUMBER,
            .help = "total bytes write burst",
3370 3371 3372 3373
        },{
            .name = "throttling.iops-size",
            .type = QEMU_OPT_NUMBER,
            .help = "when limiting by iops max size of an I/O in bytes",
3374 3375 3376 3377
        },{
            .name = "throttling.group",
            .type = QEMU_OPT_STRING,
            .help = "name of the block throttling group",
3378 3379 3380 3381
        },{
            .name = "copy-on-read",
            .type = QEMU_OPT_BOOL,
            .help = "copy read data from backing file into image file",
3382 3383 3384 3385
        },{
            .name = "detect-zeroes",
            .type = QEMU_OPT_STRING,
            .help = "try to optimize zero writes (off, on, unmap)",
3386 3387 3388 3389
        },
        { /* end of list */ }
    },
};
3390

3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431
static QemuOptsList qemu_root_bds_opts = {
    .name = "root-bds",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_common_drive_opts.head),
    .desc = {
        {
            .name = "discard",
            .type = QEMU_OPT_STRING,
            .help = "discard operation (ignore/off, unmap/on)",
        },{
            .name = "cache.writeback",
            .type = QEMU_OPT_BOOL,
            .help = "enables writeback mode for any caches",
        },{
            .name = "cache.direct",
            .type = QEMU_OPT_BOOL,
            .help = "enables use of O_DIRECT (bypass the host page cache)",
        },{
            .name = "cache.no-flush",
            .type = QEMU_OPT_BOOL,
            .help = "ignore any flush requests for the device",
        },{
            .name = "aio",
            .type = QEMU_OPT_STRING,
            .help = "host AIO implementation (threads, native)",
        },{
            .name = "read-only",
            .type = QEMU_OPT_BOOL,
            .help = "open drive file as read-only",
        },{
            .name = "copy-on-read",
            .type = QEMU_OPT_BOOL,
            .help = "copy read data from backing file into image file",
        },{
            .name = "detect-zeroes",
            .type = QEMU_OPT_STRING,
            .help = "try to optimize zero writes (off, on, unmap)",
        },
        { /* end of list */ }
    },
};

3432 3433 3434 3435
QemuOptsList qemu_drive_opts = {
    .name = "drive",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
    .desc = {
3436 3437 3438 3439
        /*
         * no elements => accept any params
         * validation will happen later
         */
3440 3441 3442
        { /* end of list */ }
    },
};