blockdev: Deprecate -drive with bogus interface type

Drives with interface types other than if=none are for onboard
devices.  Unfortunately, any such drives the board doesn't pick up can
still be used with -device, like this:

    $ qemu-system-x86_64 -nodefaults -display none -S -drive if=floppy,id=bogus,unit=7 -device ide-cd,drive=bogus -monitor stdio
    QEMU 5.0.50 monitor - type 'help' for more information
    (qemu) info block
    bogus: [not inserted]
	Attached to:      /machine/peripheral-anon/device[0]
	Removable device: not locked, tray closed
    (qemu) info qtree
    bus: main-system-bus
      type System
      [...]
	    bus: ide.1
	      type IDE
	      dev: ide-cd, id ""
--->		drive = "bogus"
		[...]
		unit = 0 (0x0)
      [...]

This kind of abuse has always worked.  Deprecate it:

    qemu-system-x86_64: -drive if=floppy,id=bogus,unit=7: warning: bogus if=floppy is deprecated, use if=none

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20200622094227.1271650-9-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2020-06-22 11:42:19 +02:00
parent 63d5dfbe0d
commit a1b40bda08
4 changed files with 43 additions and 2 deletions

View File

@ -239,6 +239,19 @@ DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
return NULL; return NULL;
} }
void drive_mark_claimed_by_board(void)
{
BlockBackend *blk;
DriveInfo *dinfo;
for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
dinfo = blk_legacy_dinfo(blk);
if (dinfo && blk_get_attached_dev(blk)) {
dinfo->claimed_by_board = true;
}
}
}
void drive_check_orphaned(void) void drive_check_orphaned(void)
{ {
BlockBackend *blk; BlockBackend *blk;
@ -248,8 +261,10 @@ void drive_check_orphaned(void)
for (blk = blk_next(NULL); blk; blk = blk_next(blk)) { for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
dinfo = blk_legacy_dinfo(blk); dinfo = blk_legacy_dinfo(blk);
if (!blk_get_attached_dev(blk) && !dinfo->is_default && if (dinfo->is_default || dinfo->type == IF_NONE) {
dinfo->type != IF_NONE) { continue;
}
if (!blk_get_attached_dev(blk)) {
loc_push_none(&loc); loc_push_none(&loc);
qemu_opts_loc_restore(dinfo->opts); qemu_opts_loc_restore(dinfo->opts);
error_report("machine type does not support" error_report("machine type does not support"
@ -257,6 +272,14 @@ void drive_check_orphaned(void)
if_name[dinfo->type], dinfo->bus, dinfo->unit); if_name[dinfo->type], dinfo->bus, dinfo->unit);
loc_pop(&loc); loc_pop(&loc);
orphans = true; orphans = true;
continue;
}
if (!dinfo->claimed_by_board && dinfo->type != IF_VIRTIO) {
loc_push_none(&loc);
qemu_opts_loc_restore(dinfo->opts);
warn_report("bogus if=%s is deprecated, use if=none",
if_name[dinfo->type]);
loc_pop(&loc);
} }
} }

View File

@ -190,6 +190,14 @@ become
-device floppy,unit=1,drive=... -device floppy,unit=1,drive=...
``-drive`` with bogus interface type
''''''''''''''''''''''''''''''''''''
Drives with interface types other than ``if=none`` are for onboard
devices. It is possible to use drives the board doesn't pick up with
-device. This usage is now deprecated. Use ``if=none`` instead.
QEMU Machine Protocol (QMP) commands QEMU Machine Protocol (QMP) commands
------------------------------------ ------------------------------------

View File

@ -35,6 +35,7 @@ struct DriveInfo {
bool is_default; /* Added by default_drive() ? */ bool is_default; /* Added by default_drive() ? */
int media_cd; int media_cd;
QemuOpts *opts; QemuOpts *opts;
bool claimed_by_board;
QTAILQ_ENTRY(DriveInfo) next; QTAILQ_ENTRY(DriveInfo) next;
}; };
@ -45,6 +46,7 @@ BlockBackend *blk_by_legacy_dinfo(DriveInfo *dinfo);
void override_max_devs(BlockInterfaceType type, int max_devs); void override_max_devs(BlockInterfaceType type, int max_devs);
DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit);
void drive_mark_claimed_by_board(void);
void drive_check_orphaned(void); void drive_check_orphaned(void);
DriveInfo *drive_get_by_index(BlockInterfaceType type, int index); DriveInfo *drive_get_by_index(BlockInterfaceType type, int index);
int drive_get_max_bus(BlockInterfaceType type); int drive_get_max_bus(BlockInterfaceType type);

View File

@ -4347,6 +4347,14 @@ void qemu_init(int argc, char **argv, char **envp)
/* from here on runstate is RUN_STATE_PRELAUNCH */ /* from here on runstate is RUN_STATE_PRELAUNCH */
machine_run_board_init(current_machine); machine_run_board_init(current_machine);
/*
* TODO To drop support for deprecated bogus if=..., move
* drive_check_orphaned() here, replacing this call. Also drop
* its deprecation warning, along with DriveInfo member
* @claimed_by_board.
*/
drive_mark_claimed_by_board();
realtime_init(); realtime_init();
soundhw_init(); soundhw_init();