From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, kraxel@redhat.com
Subject: [Qemu-devel] [PATCH 01/13] block: Move error actions from DriveInfo to BlockDriverState
Date: Wed, 2 Jun 2010 18:55:17 +0200 [thread overview]
Message-ID: <1275497729-13120-2-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1275497729-13120-1-git-send-email-armbru@redhat.com>
That's where they belong semantically (block device host part), even
though the actions are actually executed by guest device code.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
block.c | 12 ++++++++++++
block.h | 8 ++++++++
block_int.h | 1 +
blockdev.c | 17 ++---------------
blockdev.h | 10 ----------
hw/ide/core.c | 2 +-
hw/scsi-disk.c | 2 +-
hw/virtio-blk.c | 3 +--
8 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/block.c b/block.c
index cacf11b..5c2f3d9 100644
--- a/block.c
+++ b/block.c
@@ -1206,6 +1206,18 @@ int bdrv_get_translation_hint(BlockDriverState *bs)
return bs->translation;
}
+void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
+ BlockErrorAction on_write_error)
+{
+ bs->on_read_error = on_read_error;
+ bs->on_write_error = on_write_error;
+}
+
+BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
+{
+ return is_read ? bs->on_read_error : bs->on_write_error;
+}
+
int bdrv_is_removable(BlockDriverState *bs)
{
return bs->removable;
diff --git a/block.h b/block.h
index 25744b1..9ceb64d 100644
--- a/block.h
+++ b/block.h
@@ -42,6 +42,11 @@ typedef struct QEMUSnapshotInfo {
#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1)
typedef enum {
+ BLOCK_ERR_REPORT, BLOCK_ERR_IGNORE, BLOCK_ERR_STOP_ENOSPC,
+ BLOCK_ERR_STOP_ANY
+} BlockErrorAction;
+
+typedef enum {
BDRV_ACTION_REPORT, BDRV_ACTION_IGNORE, BDRV_ACTION_STOP
} BlockMonEventAction;
@@ -146,6 +151,9 @@ void bdrv_get_geometry_hint(BlockDriverState *bs,
int *pcyls, int *pheads, int *psecs);
int bdrv_get_type_hint(BlockDriverState *bs);
int bdrv_get_translation_hint(BlockDriverState *bs);
+void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
+ BlockErrorAction on_write_error);
+BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read);
int bdrv_is_removable(BlockDriverState *bs);
int bdrv_is_read_only(BlockDriverState *bs);
int bdrv_is_sg(BlockDriverState *bs);
diff --git a/block_int.h b/block_int.h
index 1a7240c..e3bfd19 100644
--- a/block_int.h
+++ b/block_int.h
@@ -182,6 +182,7 @@ struct BlockDriverState {
drivers. They are not used by the block driver */
int cyls, heads, secs, translation;
int type;
+ BlockErrorAction on_read_error, on_write_error;
char device_name[32];
unsigned long *dirty_bitmap;
int64_t dirty_count;
diff --git a/blockdev.c b/blockdev.c
index bd9783a..0df16c7 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -90,19 +90,6 @@ const char *drive_get_serial(BlockDriverState *bdrv)
return "\0";
}
-BlockInterfaceErrorAction drive_get_on_error(
- BlockDriverState *bdrv, int is_read)
-{
- DriveInfo *dinfo;
-
- QTAILQ_FOREACH(dinfo, &drives, next) {
- if (dinfo->bdrv == bdrv)
- return is_read ? dinfo->on_read_error : dinfo->on_write_error;
- }
-
- return is_read ? BLOCK_ERR_REPORT : BLOCK_ERR_STOP_ENOSPC;
-}
-
static void bdrv_format_print(void *opaque, const char *name)
{
fprintf(stderr, " %s", name);
@@ -418,13 +405,13 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error)
dinfo->type = type;
dinfo->bus = bus_id;
dinfo->unit = unit_id;
- dinfo->on_read_error = on_read_error;
- dinfo->on_write_error = on_write_error;
dinfo->opts = opts;
if (serial)
strncpy(dinfo->serial, serial, sizeof(serial));
QTAILQ_INSERT_TAIL(&drives, dinfo, next);
+ bdrv_set_on_error(dinfo->bdrv, on_read_error, on_write_error);
+
switch(type) {
case IF_IDE:
case IF_SCSI:
diff --git a/blockdev.h b/blockdev.h
index dfc9de1..9e8a7fc 100644
--- a/blockdev.h
+++ b/blockdev.h
@@ -19,11 +19,6 @@ typedef enum {
IF_COUNT
} BlockInterfaceType;
-typedef enum {
- BLOCK_ERR_REPORT, BLOCK_ERR_IGNORE, BLOCK_ERR_STOP_ENOSPC,
- BLOCK_ERR_STOP_ANY
-} BlockInterfaceErrorAction;
-
#define BLOCK_SERIAL_STRLEN 20
typedef struct DriveInfo {
@@ -34,8 +29,6 @@ typedef struct DriveInfo {
int bus;
int unit;
QemuOpts *opts;
- BlockInterfaceErrorAction on_read_error;
- BlockInterfaceErrorAction on_write_error;
char serial[BLOCK_SERIAL_STRLEN + 1];
QTAILQ_ENTRY(DriveInfo) next;
} DriveInfo;
@@ -51,9 +44,6 @@ extern int drive_get_max_bus(BlockInterfaceType type);
extern void drive_uninit(DriveInfo *dinfo);
extern const char *drive_get_serial(BlockDriverState *bdrv);
-extern BlockInterfaceErrorAction drive_get_on_error(
- BlockDriverState *bdrv, int is_read);
-
extern QemuOpts *drive_add(const char *file, const char *fmt, ...);
extern DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi,
int *fatal_error);
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 045d18d..0b3b7c2 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -481,7 +481,7 @@ void ide_dma_error(IDEState *s)
static int ide_handle_rw_error(IDEState *s, int error, int op)
{
int is_read = (op & BM_STATUS_RETRY_READ);
- BlockInterfaceErrorAction action = drive_get_on_error(s->bs, is_read);
+ BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
if (action == BLOCK_ERR_IGNORE) {
bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index a9bf7d2..2b38984 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -182,7 +182,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
static int scsi_handle_write_error(SCSIDiskReq *r, int error)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
- BlockInterfaceErrorAction action = drive_get_on_error(s->bs, 0);
+ BlockErrorAction action = bdrv_get_on_error(s->bs, 0);
if (action == BLOCK_ERR_IGNORE) {
bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, 0);
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index cdcb492..cb17afa 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -58,8 +58,7 @@ static void virtio_blk_req_complete(VirtIOBlockReq *req, int status)
static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
int is_read)
{
- BlockInterfaceErrorAction action =
- drive_get_on_error(req->dev->bs, is_read);
+ BlockErrorAction action = bdrv_get_on_error(req->dev->bs, is_read);
VirtIOBlock *s = req->dev;
if (action == BLOCK_ERR_IGNORE) {
--
1.6.6.1
next prev parent reply other threads:[~2010-06-02 16:55 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-02 16:55 [Qemu-devel] [PATCH 00/13] New -blockdev to define a host block device Markus Armbruster
2010-06-02 16:55 ` Markus Armbruster [this message]
2010-06-02 16:55 ` [Qemu-devel] [PATCH 02/13] block: Decouple block device "commit all" from DriveInfo Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 03/13] monitor: Make "commit FOO" complain when FOO doesn't exist Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 04/13] block: New bdrv_next() Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 05/13] block: Decouple savevm from DriveInfo Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 06/13] blockdev: Give drives internal linkage Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 07/13] blockdev: Means to destroy blockdev only if made with drive_init() Markus Armbruster
2010-06-10 14:19 ` [Qemu-devel] " Kevin Wolf
2010-06-10 16:00 ` Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 08/13] qdev: Decouple qdev_prop_drive from DriveInfo Markus Armbruster
2010-06-02 19:28 ` [Qemu-devel] " Gerd Hoffmann
2010-06-04 8:22 ` Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 09/13] blockdev: drive_get_by_id() is no longer used, remove Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 10/13] qemu-option: New qemu_opts_reset() Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 11/13] qemu-option: New qemu_opt_next(), qemu_opt_name() Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 12/13] blockdev: Factor option value parsers out of drive_init() Markus Armbruster
2010-06-02 16:55 ` [Qemu-devel] [PATCH 13/13] blockdev: New -blockdev to define a host block device Markus Armbruster
2010-06-03 8:00 ` Christoph Hellwig
2010-06-04 8:23 ` Markus Armbruster
2010-06-10 15:32 ` [Qemu-devel] " Paolo Bonzini
2010-06-10 16:32 ` Markus Armbruster
2010-06-10 17:03 ` Paolo Bonzini
2010-06-14 14:46 ` [Qemu-devel] " Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1275497729-13120-2-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).