qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [5368] Actually check read/write errors in IDE (Ian Jackson


From: Andrzej Zaborowski
Subject: [Qemu-devel] [5368] Actually check read/write errors in IDE (Ian Jackson).
Date: Wed, 01 Oct 2008 01:13:38 +0000

Revision: 5368
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5368
Author:   balrog
Date:     2008-10-01 01:13:37 +0000 (Wed, 01 Oct 2008)

Log Message:
-----------
Actually check read/write errors in IDE (Ian Jackson).

This patch makes the ide emulation actually take notice of
error returns from bdrv_write and bdrv_aio_{read,write}.

(Cherry picked from qemu-xen e0e7a0afe0e324a1f7d64c240f567b15dbe454cf,
 first posted to qemu-devel Wed, 20 Feb 2008 15:26:41 +0000)

Signed-off-by: Ian Jackson <address@hidden>

Modified Paths:
--------------
    trunk/hw/ide.c

Modified: trunk/hw/ide.c
===================================================================
--- trunk/hw/ide.c      2008-10-01 00:14:39 UTC (rev 5367)
+++ trunk/hw/ide.c      2008-10-01 01:13:37 UTC (rev 5368)
@@ -817,6 +817,11 @@
     }
 }
 
+static void ide_rw_error(IDEState *s) {
+    ide_abort_command(s);
+    ide_set_irq(s);
+}
+
 static void ide_sector_read(IDEState *s)
 {
     int64_t sector_num;
@@ -836,6 +841,10 @@
         if (n > s->req_nb_sectors)
             n = s->req_nb_sectors;
         ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
+        if (ret != 0) {
+            ide_rw_error(s);
+            return;
+        }
         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
         ide_set_irq(s);
         ide_set_sector(s, sector_num + n);
@@ -843,6 +852,14 @@
     }
 }
 
+static void ide_dma_error(IDEState *s)
+{
+    ide_transfer_stop(s);
+    s->error = ABRT_ERR;
+    s->status = READY_STAT | ERR_STAT;
+    ide_set_irq(s);
+}
+
 /* return 0 if buffer completed */
 static int dma_buf_rw(BMDMAState *bm, int is_write)
 {
@@ -891,7 +908,6 @@
     return 1;
 }
 
-/* XXX: handle errors */
 static void ide_read_dma_cb(void *opaque, int ret)
 {
     BMDMAState *bm = opaque;
@@ -899,6 +915,11 @@
     int n;
     int64_t sector_num;
 
+    if (ret < 0) {
+       ide_dma_error(s);
+       return;
+    }
+
     n = s->io_buffer_size >> 9;
     sector_num = ide_get_sector(s);
     if (n > 0) {
@@ -963,6 +984,11 @@
     if (n > s->req_nb_sectors)
         n = s->req_nb_sectors;
     ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
+    if (ret != 0) {
+       ide_rw_error(s);
+       return;
+    }
+
     s->nsector -= n;
     if (s->nsector == 0) {
         /* no more sectors to write */
@@ -992,7 +1018,6 @@
     }
 }
 
-/* XXX: handle errors */
 static void ide_write_dma_cb(void *opaque, int ret)
 {
     BMDMAState *bm = opaque;
@@ -1000,6 +1025,11 @@
     int n;
     int64_t sector_num;
 
+    if (ret < 0) {
+       ide_dma_error(s);
+       return;
+    }
+
     n = s->io_buffer_size >> 9;
     sector_num = ide_get_sector(s);
     if (n > 0) {






reply via email to

[Prev in Thread] Current Thread [Next in Thread]