Commit a0f1eab1 authored by Markus Armbruster's avatar Markus Armbruster Committed by Kevin Wolf
Browse files

blockdev: Disentangle BlockDriverState and DriveInfo creation



blockdev_init() mixes up BlockDriverState and DriveInfo initialization
Finish the BlockDriverState job before starting to mess with
DriveInfo.  Easier on the eyes.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarBenoît Canet <benoit.canet@nodalink.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent d4362d64
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -301,6 +301,7 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
    int ro = 0;
    int bdrv_flags = 0;
    int on_read_error, on_write_error;
    BlockDriverState *bs;
    DriveInfo *dinfo;
    ThrottleConfig cfg;
    int snapshot = 0;
@@ -456,26 +457,27 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
    }

    /* init */
    dinfo = g_malloc0(sizeof(*dinfo));
    dinfo->id = g_strdup(qemu_opts_id(opts));
    dinfo->bdrv = bdrv_new(dinfo->id, &error);
    if (error) {
        error_propagate(errp, error);
        goto bdrv_new_err;
    bs = bdrv_new(qemu_opts_id(opts), errp);
    if (!bs) {
        goto early_err;
    }
    dinfo->bdrv->open_flags = snapshot ? BDRV_O_SNAPSHOT : 0;
    dinfo->bdrv->read_only = ro;
    dinfo->bdrv->detect_zeroes = detect_zeroes;
    QTAILQ_INSERT_TAIL(&drives, dinfo, next);
    bs->open_flags = snapshot ? BDRV_O_SNAPSHOT : 0;
    bs->read_only = ro;
    bs->detect_zeroes = detect_zeroes;

    bdrv_set_on_error(dinfo->bdrv, on_read_error, on_write_error);
    bdrv_set_on_error(bs, on_read_error, on_write_error);

    /* disk I/O throttling */
    if (throttle_enabled(&cfg)) {
        bdrv_io_limits_enable(dinfo->bdrv);
        bdrv_set_io_limits(dinfo->bdrv, &cfg);
        bdrv_io_limits_enable(bs);
        bdrv_set_io_limits(bs, &cfg);
    }

    dinfo = g_malloc0(sizeof(*dinfo));
    dinfo->id = g_strdup(qemu_opts_id(opts));
    dinfo->bdrv = bs;
    QTAILQ_INSERT_TAIL(&drives, dinfo, next);

    if (!file || !*file) {
        if (has_driver_specific_opts) {
            file = NULL;
@@ -502,7 +504,8 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
    bdrv_flags |= ro ? 0 : BDRV_O_RDWR;

    QINCREF(bs_opts);
    ret = bdrv_open(&dinfo->bdrv, file, NULL, bs_opts, bdrv_flags, drv, &error);
    ret = bdrv_open(&bs, file, NULL, bs_opts, bdrv_flags, drv, &error);
    assert(bs == dinfo->bdrv);

    if (ret < 0) {
        error_setg(errp, "could not open disk image %s: %s",
@@ -511,8 +514,9 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
        goto err;
    }

    if (bdrv_key_required(dinfo->bdrv))
    if (bdrv_key_required(bs)) {
        autostart = 0;
    }

    QDECREF(bs_opts);
    qemu_opts_del(opts);
@@ -520,9 +524,8 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
    return dinfo;

err:
    bdrv_unref(dinfo->bdrv);
    bdrv_unref(bs);
    QTAILQ_REMOVE(&drives, dinfo, next);
bdrv_new_err:
    g_free(dinfo->id);
    g_free(dinfo);
early_err: