From: Marc Olson <marcolso@amazon.com>
To: qemu-devel@nongnu.org
Cc: jsnow@redhat.com, qemu-block@nongnu.org,
Marc Olson <marcolso@amazon.com>, Kevin Wolf <kwolf@redhat.com>,
Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v3 2/3] blkdebug: Extend rule check for additional types
Date: Sun, 11 Nov 2018 23:06:37 -0800 [thread overview]
Message-ID: <1542006398-30037-2-git-send-email-marcolso@amazon.com> (raw)
In-Reply-To: <1542006398-30037-1-git-send-email-marcolso@amazon.com>
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 <marcolso@amazon.com>
---
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
--
2.7.4
next prev parent reply other threads:[~2018-11-12 7:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-12 7:06 [Qemu-devel] [PATCH v3 1/3] blkdebug: fix one shot rule processing Marc Olson
2018-11-12 7:06 ` Marc Olson [this message]
2018-11-13 23:22 ` [Qemu-devel] [PATCH v3 2/3] blkdebug: Extend rule check for additional types John Snow
2018-11-13 23:34 ` Marc Olson
2018-11-13 23:38 ` John Snow
2019-01-11 14:41 ` Max Reitz
2018-11-12 7:06 ` [Qemu-devel] [PATCH v3 3/3] blkdebug: Add latency injection rule type Marc Olson
2018-11-13 23:57 ` John Snow
2019-01-11 15:00 ` Max Reitz
2019-02-12 21:21 ` Marc Olson
2019-02-13 15:48 ` Max Reitz
2019-02-13 20:49 ` Marc Olson
2019-02-13 21:12 ` Max Reitz
2019-02-14 6:39 ` Markus Armbruster
2018-11-12 11:15 ` [Qemu-devel] [PATCH v3 1/3] blkdebug: fix one shot rule processing Dongli Zhang
2018-11-13 23:00 ` John Snow
2019-01-11 14:36 ` Max Reitz
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=1542006398-30037-2-git-send-email-marcolso@amazon.com \
--to=marcolso@amazon.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--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).