[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 09/10] fdc: fix media detection
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 09/10] fdc: fix media detection |
Date: |
Fri, 25 May 2012 19:38:53 +0200 |
From: Pavel Hrdina <address@hidden>
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 stuck in loop then
kernel crashes and windows guest prints error message.
Signed-off-by: Pavel Hrdina <address@hidden>
Signed-off-by: Kevin Wolf <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..30d34e3 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("No drive connected\n");
drv->last_sect = 0;
drv->max_track = 0;
drv->flags &= ~FDISK_DBL_SIDES;
@@ -709,7 +711,7 @@ static void fdctrl_raise_irq(FDCtrl *fdctrl, uint8_t
status0)
FDrive *cur_drv;
/* A seek clears the disk change line (if a disk is inserted) */
cur_drv = get_cur_drv(fdctrl);
- if (cur_drv->max_track) {
+ if (cur_drv->bs != NULL && bdrv_is_inserted(cur_drv->bs)) {
cur_drv->media_changed = 0;
}
}
@@ -1878,7 +1880,7 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
}
fd_init(drive);
- fd_revalidate(drive);
+ fdctrl_change_cb(drive, 0);
if (drive->bs) {
bdrv_set_dev_ops(drive->bs, &fdctrl_block_ops, drive);
}
--
1.7.6.5
- [Qemu-devel] [PULL 00/10] Block patches for 1.1, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 01/10] qcow2: don't leak buffer for unexpected qcow_version in header, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 02/10] qemu-img: Explain how rebase operation can be used to perform a 'diff' operation., Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 03/10] sheepdog: mark image as snapshot when tag is specified, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 04/10] sheepdog: return -errno on error, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 06/10] qcow2: Check qcow2_alloc_clusters_at() return value, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 05/10] sheepdog: use heap instead of stack for BDRVSheepdogState, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 09/10] fdc: fix media detection,
Kevin Wolf <=
- [Qemu-devel] [PATCH 08/10] fdc: floppy drive should be visible after start without media, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 07/10] qemu-iotests: mark 035 qcow2-only, Kevin Wolf, 2012/05/25
- [Qemu-devel] [PATCH 10/10] fdc-test: introduced qtest no_media_on_start and cmos qtest for floppy, Kevin Wolf, 2012/05/25
- Re: [Qemu-devel] [PULL 00/10] Block patches for 1.1, Anthony Liguori, 2012/05/29