From 2d246f01d374c1a10c48c45aa931aa18f0a56634 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Wed, 18 Sep 2013 15:14:47 +0200 Subject: 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: Kevin Wolf Reviewed-by: Eric Blake Reviewed-by: Wenchao Xia --- blockdev.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'blockdev.c') diff --git a/blockdev.c b/blockdev.c index ab79df7bff..52996eada3 100644 --- a/blockdev.c +++ b/blockdev.c @@ -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) -- cgit v1.2.1