Pavel Hrdina <phrd...@redhat.com> writes: > We have to set up 'media_changed' after guest start so floppy driver > could detect that there is no media in drive. For this purpose we call > 'fdctrl_change_cb' instead of 'fd_revalidate' in 'fdctrl_connect_drives'. > 'fd_revalidate' is called inside 'fdctrl_change_cb'. > > We still have to set default drive geometry in 'fd_revalidate' even > if there is no media in drive. When you try to open (windows) or mount (linux) > floppy the driver tries to seek on track 1. Linux guest hang in loop than > crash > and windows guest print error message.
Got one nitpick inline. > Signed-off-by: Pavel Hrdina <phrd...@redhat.com> > --- > hw/fdc.c | 14 ++++++++------ > 1 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/hw/fdc.c b/hw/fdc.c > index cb4cd25..b1bc6ed 100644 > --- a/hw/fdc.c > +++ b/hw/fdc.c > @@ -179,12 +179,14 @@ static void fd_revalidate(FDrive *drv) > FDriveRate rate; > > FLOPPY_DPRINTF("revalidate\n"); > - if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) { > + if (drv->bs != NULL) { > ro = bdrv_is_read_only(drv->bs); > bdrv_get_floppy_geometry_hint(drv->bs, &nb_heads, &max_track, > &last_sect, drv->drive, &drive, &rate); > - if (nb_heads != 0 && max_track != 0 && last_sect != 0) { > - FLOPPY_DPRINTF("User defined disk (%d %d %d)", > + if (!bdrv_is_inserted(drv->bs)) { > + FLOPPY_DPRINTF("No disk in drive\n"); > + } else if (nb_heads != 0 && max_track != 0 && last_sect != 0) { > + FLOPPY_DPRINTF("User defined disk (%d %d %d)\n", > nb_heads - 1, max_track, last_sect); > } else { > FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", nb_heads, > @@ -201,7 +203,7 @@ static void fd_revalidate(FDrive *drv) > drv->drive = drive; > drv->media_rate = rate; > } else { > - FLOPPY_DPRINTF("No disk in drive\n"); > + FLOPPY_DPRINTF("Invalid disk in drive\n"); Misleading. What !drv->bs actually means is "no drive connected". > drv->last_sect = 0; > drv->max_track = 0; > drv->flags &= ~FDISK_DBL_SIDES; [...]