@@ -775,25 +775,20 @@ static void blkdebug_close(BlockDriverState *bs)
static void suspend_request(BlockDriverState *bs, BlkdebugRule *rule)
{
BDRVBlkdebugState *s = bs->opaque;
- BlkdebugSuspendedReq r;
+ BlkdebugSuspendedReq *r;
- r = (BlkdebugSuspendedReq) {
- .co = qemu_coroutine_self(),
- .tag = g_strdup(rule->options.suspend.tag),
- };
+ r = g_new(BlkdebugSuspendedReq, 1);
+
+ r->co = qemu_coroutine_self();
+ r->tag = g_strdup(rule->options.suspend.tag);
remove_rule(rule);
- QLIST_INSERT_HEAD(&s->suspended_reqs, &r, next);
+ QLIST_INSERT_HEAD(&s->suspended_reqs, r, next);
if (!qtest_enabled()) {
- printf("blkdebug: Suspended request '%s'\n", r.tag);
+ printf("blkdebug: Suspended request '%s'\n", r->tag);
}
qemu_coroutine_yield();
- if (!qtest_enabled()) {
- printf("blkdebug: Resuming request '%s'\n", r.tag);
- }
-
- g_free(r.tag);
}
static bool process_rule(BlockDriverState *bs, struct BlkdebugRule *rule,
@@ -880,8 +875,18 @@ retry:
*/
QLIST_FOREACH(r, &s->suspended_reqs, next) {
if (!strcmp(r->tag, tag)) {
+ Coroutine *co = r->co;
+
+ if (!qtest_enabled()) {
+ printf("blkdebug: Resuming request '%s'\n", r->tag);
+ }
+
QLIST_REMOVE(r, next);
- qemu_coroutine_enter(r->co);
+ g_free(r->tag);
+ g_free(r);
+
+ qemu_coroutine_enter(co);
+
if (all) {
goto retry;
}