[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/2] fdc: fix media detection
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/2] fdc: fix media detection |
Date: |
Wed, 23 May 2012 10:30:13 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) |
Pavel Hrdina <address@hidden> 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 <address@hidden>
> ---
> 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;
[...]