Skip to content

Commit

Permalink
block/dirty-bitmaps: prohibit enable/disable on locked/frozen bitmaps
Browse files Browse the repository at this point in the history
We're not being consistent about this. If it's in use by an operation,
the user should not be able to change the behavior of that bitmap.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-id: 20181002230218.13949-5-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
  • Loading branch information
jnsnow committed Oct 29, 2018
1 parent 0be37c9 commit b053bb5
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions blockdev.c
Expand Up @@ -2059,6 +2059,13 @@ static void block_dirty_bitmap_enable_prepare(BlkActionState *common,
return;
}

if (bdrv_dirty_bitmap_user_locked(state->bitmap)) {
error_setg(errp,
"Bitmap '%s' is currently in use by another operation"
" and cannot be enabled", action->name);
return;
}

state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap);
bdrv_enable_dirty_bitmap(state->bitmap);
}
Expand Down Expand Up @@ -2093,6 +2100,13 @@ static void block_dirty_bitmap_disable_prepare(BlkActionState *common,
return;
}

if (bdrv_dirty_bitmap_user_locked(state->bitmap)) {
error_setg(errp,
"Bitmap '%s' is currently in use by another operation"
" and cannot be disabled", action->name);
return;
}

state->was_enabled = bdrv_dirty_bitmap_enabled(state->bitmap);
bdrv_disable_dirty_bitmap(state->bitmap);
}
Expand Down Expand Up @@ -2934,10 +2948,10 @@ void qmp_x_block_dirty_bitmap_enable(const char *node, const char *name,
return;
}

if (bdrv_dirty_bitmap_frozen(bitmap)) {
if (bdrv_dirty_bitmap_user_locked(bitmap)) {
error_setg(errp,
"Bitmap '%s' is currently frozen and cannot be enabled",
name);
"Bitmap '%s' is currently in use by another operation"
" and cannot be enabled", name);
return;
}

Expand All @@ -2955,10 +2969,10 @@ void qmp_x_block_dirty_bitmap_disable(const char *node, const char *name,
return;
}

if (bdrv_dirty_bitmap_frozen(bitmap)) {
if (bdrv_dirty_bitmap_user_locked(bitmap)) {
error_setg(errp,
"Bitmap '%s' is currently frozen and cannot be disabled",
name);
"Bitmap '%s' is currently in use by another operation"
" and cannot be disabled", name);
return;
}

Expand Down

0 comments on commit b053bb5

Please sign in to comment.