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.