Skip to content

Commit

Permalink
block: teach bdrv_debug_breakpoint skip filters with backing
Browse files Browse the repository at this point in the history
Teach bdrv_debug_breakpoint and bdrv_debug_remove_breakpoint skip
filters with backing. This is needed to implement and use in backup job
it's own backup_top filter driver (like mirror already has one), and
without this improvement, breakpoint removal will fail at least in 55
iotest.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 20190920142056.12778-9-vsementsov@virtuozzo.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and XanClic committed Oct 10, 2019
1 parent beb5f54 commit d10529a
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions block.c
Expand Up @@ -5164,14 +5164,35 @@ void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event)
bs->drv->bdrv_debug_event(bs, event);
}

int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
const char *tag)
static BlockDriverState *bdrv_find_debug_node(BlockDriverState *bs)
{
while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) {
bs = bs->file ? bs->file->bs : NULL;
if (bs->file) {
bs = bs->file->bs;
continue;
}

if (bs->drv->is_filter && bs->backing) {
bs = bs->backing->bs;
continue;
}

break;
}

if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) {
assert(bs->drv->bdrv_debug_remove_breakpoint);
return bs;
}

return NULL;
}

int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
const char *tag)
{
bs = bdrv_find_debug_node(bs);
if (bs) {
return bs->drv->bdrv_debug_breakpoint(bs, event, tag);
}

Expand All @@ -5180,11 +5201,8 @@ int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,

int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag)
{
while (bs && bs->drv && !bs->drv->bdrv_debug_remove_breakpoint) {
bs = bs->file ? bs->file->bs : NULL;
}

if (bs && bs->drv && bs->drv->bdrv_debug_remove_breakpoint) {
bs = bdrv_find_debug_node(bs);
if (bs) {
return bs->drv->bdrv_debug_remove_breakpoint(bs, tag);
}

Expand Down

0 comments on commit d10529a

Please sign in to comment.