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

fdc: Make media change detection more robust



fdctrl_change_cb() gets called on a virtual media change via monitor.
It would be nice if host device block drivers called it on physical
media change, but they don't.

bdrv_media_changed() lets you poll for media change, but it returns
"don't know" except with block driver "host_floppy".

FDrive member media_changed gets set on device initialization and by
fdctrl_change_cb(), and cleared by fdctrl_media_changed().  Thus, it's
set on first entry to fdctrl_media_changed() since device
initialization or virtual media change.

fdctrl_media_changed() ignores media_changed unless
bdrv_media_changed() returns "don't know".  If we change media via
monitor (setting media_changed), and the new media's block driver
returns 0, we lose.  Fortunately, "host_floppy" always returns 1 on
first call.  Brittle.  Clean it up not to rely on it.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 8e49ca46
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -898,11 +898,15 @@ static int fdctrl_media_changed(FDrive *drv)

    if (!drv->bs)
        return 0;
    if (drv->media_changed) {
        drv->media_changed = 0;
        ret = 1;
    } else {
        ret = bdrv_media_changed(drv->bs);
        if (ret < 0) {
        ret = drv->media_changed;
            ret = 0;            /* we don't know, assume no */
        }
    }
    drv->media_changed = 0;
    if (ret) {
        fd_revalidate(drv);
    }