On 11/03/2015 10:17 AM, Stefan Hajnoczi wrote: > On Fri, Oct 23, 2015 at 07:56:50PM -0400, John Snow wrote: >> @@ -1732,6 +1757,10 @@ static void >> block_dirty_bitmap_add_prepare(BlkActionState *common, >> BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState, >> common, common); >> >> + if (action_check_cancel_mode(common, errp) < 0) { >> + return; >> + } >> + >> action = common->action->block_dirty_bitmap_add; >> /* AIO context taken and released within qmp_block_dirty_bitmap_add */ >> qmp_block_dirty_bitmap_add(action->node, action->name, >> @@ -1767,6 +1796,10 @@ static void >> block_dirty_bitmap_clear_prepare(BlkActionState *common, >> common, common); >> BlockDirtyBitmap *action; >> >> + if (action_check_cancel_mode(common, errp) < 0) { >> + return; >> + } >> + >> action = common->action->block_dirty_bitmap_clear; >> state->bitmap = block_dirty_bitmap_lookup(action->node, >> action->name, > > Why do the bitmap add/clear actions not support err-cancel=all? > > I understand why other block jobs don't support it, but it's not clear > why these non-block job actions cannot. >
Because they don't have a callback to invoke if the rest of the job fails. I could create a BlockJob for them complete with a callback to invoke, but basically it's just because there's no interface to unwind them, or an interface to join them with the transaction. They're small, synchronous non-job actions. Which makes them weird.