Commit 2d246f01 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

blockdev: Introduce DriveInfo.enable_auto_del



BlockDriverStates shouldn't be affected by an unplugged guest device,
except if created with the legacy -drive command line option or the
drive_add HMP command.

Make the automatic deletion as well as cancelling of jobs conditional on
an enable_auto_del boolean that is only set in drive_init().

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarWenchao Xia <xiawenc@linux.vnet.ibm.com>
parent 622f557f
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -89,6 +89,10 @@ void blockdev_mark_auto_del(BlockDriverState *bs)
{
    DriveInfo *dinfo = drive_get_by_blockdev(bs);

    if (dinfo && !dinfo->enable_auto_del) {
        return;
    }

    if (bs->job) {
        block_job_cancel(bs->job);
    }
@@ -746,6 +750,7 @@ static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to)
DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
{
    const char *value;
    DriveInfo *dinfo;

    /* Change legacy command line options into QMP ones */
    qemu_opt_rename(all_opts, "iops", "throttling.iops-total");
@@ -794,7 +799,17 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
        qemu_opt_unset(all_opts, "cache");
    }

    return blockdev_init(all_opts, block_default_type);
    /* Actual block device init: Functionality shared with blockdev-add */
    dinfo = blockdev_init(all_opts, block_default_type);
    if (dinfo == NULL) {
        goto fail;
    }

    /* Set legacy DriveInfo fields */
    dinfo->enable_auto_del = true;

fail:
    return dinfo;
}

void do_commit(Monitor *mon, const QDict *qdict)
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ struct DriveInfo {
    int bus;
    int unit;
    int auto_del;               /* see blockdev_mark_auto_del() */
    bool enable_auto_del; /* Only for legacy drive_init() */
    int media_cd;
    int cyls, heads, secs, trans;
    QemuOpts *opts;