From patchwork Tue Jun 15 14:19:33 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 55678 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 60002B7D80 for ; Wed, 16 Jun 2010 00:35:20 +1000 (EST) Received: from localhost ([127.0.0.1]:45735 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOXEQ-0007Xe-AU for incoming@patchwork.ozlabs.org; Tue, 15 Jun 2010 10:35:14 -0400 Received: from [140.186.70.92] (port=37866 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOWzx-00089I-SA for qemu-devel@nongnu.org; Tue, 15 Jun 2010 10:20:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOWzs-0000AF-Jr for qemu-devel@nongnu.org; Tue, 15 Jun 2010 10:20:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:4469) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOWzs-00009z-8R for qemu-devel@nongnu.org; Tue, 15 Jun 2010 10:20:12 -0400 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5FEKABA010308 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Jun 2010 10:20:10 -0400 Received: from localhost.localdomain (dhcp-5-217.str.redhat.com [10.32.5.217]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5FEJq70025060; Tue, 15 Jun 2010 10:20:08 -0400 From: Kevin Wolf To: anthony@codemonkey.ws Date: Tue, 15 Jun 2010 16:19:33 +0200 Message-Id: <1276611581-3757-12-git-send-email-kwolf@redhat.com> In-Reply-To: <1276611581-3757-1-git-send-email-kwolf@redhat.com> References: <1276611581-3757-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: kwolf@redhat.com, qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 11/19] block: Move error actions from DriveInfo to BlockDriverState X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Markus Armbruster 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 Signed-off-by: Kevin Wolf --- 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 29a6f39..e701ec0 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 a340ffd..d22401f 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 dbeef09..b5570f4 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(dinfo->serial) - 1); 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 4cc94f6..75878eb 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) {