From patchwork Mon Nov 12 07:06:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gonglei (Arei)\" via" X-Patchwork-Id: 10678233 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1FDEF15A6 for ; Mon, 12 Nov 2018 07:08:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0E99E29FBE for ; Mon, 12 Nov 2018 07:08:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0123529FC1; Mon, 12 Nov 2018 07:08:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 661D429FB6 for ; Mon, 12 Nov 2018 07:08:41 +0000 (UTC) Received: from localhost ([::1]:45090 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gM6Ku-0002Vj-9Q for patchwork-qemu-devel@patchwork.kernel.org; Mon, 12 Nov 2018 02:08:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50535) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gM6Ja-00084o-1k for qemu-devel@nongnu.org; Mon, 12 Nov 2018 02:07:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gM6JX-000449-8d for qemu-devel@nongnu.org; Mon, 12 Nov 2018 02:07:17 -0500 Received: from smtp-fw-2101.amazon.com ([72.21.196.25]:16459) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1gM6JS-0003dn-Jc; Mon, 12 Nov 2018 02:07:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1542006430; x=1573542430; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=WXKJ0EBT7WU6xkXtJMPb2w+1h0sMYTIuTSDi1ENC99I=; b=tAjZxaNcFropEA0O5tr5uTPRsFxjmrOvGiwG+m3ci6itTYOQCZf2L0fu AuT3uF/5/G2TWMhkzNBrDdA8sE+sS3a3xL1iMrTCcd3bkVoyERR/eIUK2 ChMd4HbLoxjh24RKnPDUh5ay7lGK97N7NmkZVrRwMQXO8irbNVj6kdkAi E=; X-IronPort-AV: E=Sophos;i="5.54,494,1534809600"; d="scan'208";a="703956363" Received: from iad6-co-svc-p1-lb1-vlan2.amazon.com (HELO email-inbound-relay-1a-821c648d.us-east-1.amazon.com) ([10.124.125.2]) by smtp-border-fw-out-2101.iad2.amazon.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 12 Nov 2018 07:07:07 +0000 Received: from ue4a4719f239757c4d2ec.ant.amazon.com (iad7-ws-svc-lb50-vlan3.amazon.com [10.0.93.214]) by email-inbound-relay-1a-821c648d.us-east-1.amazon.com (8.14.7/8.14.7) with ESMTP id wAC774q1023707 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 12 Nov 2018 07:07:05 GMT Received: from ue4a4719f239757c4d2ec.ant.amazon.com (localhost [127.0.0.1]) by ue4a4719f239757c4d2ec.ant.amazon.com (8.15.2/8.15.2/Debian-3) with ESMTP id wAC774WU030106; Sun, 11 Nov 2018 23:07:04 -0800 Received: (from marcolso@localhost) by ue4a4719f239757c4d2ec.ant.amazon.com (8.15.2/8.15.2/Submit) id wAC773pV030105; Sun, 11 Nov 2018 23:07:03 -0800 To: qemu-devel@nongnu.org Date: Sun, 11 Nov 2018 23:06:37 -0800 Message-Id: <1542006398-30037-2-git-send-email-marcolso@amazon.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1542006398-30037-1-git-send-email-marcolso@amazon.com> References: <1542006398-30037-1-git-send-email-marcolso@amazon.com> Precedence: Bulk X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 72.21.196.25 Subject: [Qemu-devel] [PATCH v3 2/3] blkdebug: Extend rule check for additional types X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Marc Olson via Qemu-devel From: "Gonglei (Arei)\" via" Reply-To: Marc Olson Cc: Kevin Wolf , Marc Olson , jsnow@redhat.com, qemu-block@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Break out the more common parts of the BlkdebugRule struct, and make rule_check() more explicit about operating only on error injection types so that additional rule types can be added in the future. Signed-off-by: Marc Olson Reviewed-By: John Snow Reviewed-by: Max Reitz --- block/blkdebug.c | 59 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index 327049b..7739849 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -73,13 +73,13 @@ typedef struct BlkdebugRule { BlkdebugEvent event; int action; int state; + int once; + int64_t offset; union { struct { int error; int immediately; - int once; - int64_t offset; - } inject; + } inject_error; struct { int new_state; } set_state; @@ -182,16 +182,16 @@ static int add_rule(void *opaque, QemuOpts *opts, Error **errp) .state = qemu_opt_get_number(opts, "state", 0), }; + rule->once = qemu_opt_get_bool(opts, "once", 0); + sector = qemu_opt_get_number(opts, "sector", -1); + rule->offset = sector == -1 ? -1 : sector * BDRV_SECTOR_SIZE; + /* Parse action-specific options */ switch (d->action) { case ACTION_INJECT_ERROR: - rule->options.inject.error = qemu_opt_get_number(opts, "errno", EIO); - rule->options.inject.once = qemu_opt_get_bool(opts, "once", 0); - rule->options.inject.immediately = + rule->options.inject_error.error = qemu_opt_get_number(opts, "errno", EIO); + rule->options.inject_error.immediately = qemu_opt_get_bool(opts, "immediately", 0); - sector = qemu_opt_get_number(opts, "sector", -1); - rule->options.inject.offset = - sector == -1 ? -1 : sector * BDRV_SECTOR_SIZE; break; case ACTION_SET_STATE: @@ -474,38 +474,41 @@ static int rule_check(BlockDriverState *bs, uint64_t offset, uint64_t bytes) { BDRVBlkdebugState *s = bs->opaque; BlkdebugRule *rule = NULL; + BlkdebugRule *error_rule = NULL; int error; bool immediately; + int ret = 0; QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { - uint64_t inject_offset = rule->options.inject.offset; - - if (inject_offset == -1 || - (bytes && inject_offset >= offset && - inject_offset < offset + bytes)) + if (rule->offset == -1 || + (bytes && rule->offset >= offset && + rule->offset < offset + bytes)) { - break; + if (rule->action == ACTION_INJECT_ERROR) { + error_rule = rule; + break; + } } } - if (!rule) { - return 0; - } + if (error_rule) { + immediately = error_rule->options.inject_error.immediately; + error = error_rule->options.inject_error.error; - immediately = rule->options.inject.immediately; - error = rule->options.inject.error; + if (error_rule->once) { + QSIMPLEQ_REMOVE(&s->active_rules, error_rule, BlkdebugRule, active_next); + remove_rule(error_rule); + } - if (rule->options.inject.once) { - QSIMPLEQ_REMOVE(&s->active_rules, rule, BlkdebugRule, active_next); - remove_rule(rule); - } + if (error && !immediately) { + aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self()); + qemu_coroutine_yield(); + } - if (error && !immediately) { - aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self()); - qemu_coroutine_yield(); + ret = -error; } - return -error; + return ret; } static int coroutine_fn