Commit 2899f41e authored by Vladimir Sementsov-Ogievskiy's avatar Vladimir Sementsov-Ogievskiy Committed by John Snow
Browse files

blockdev: reduce aio_context locked sections in bitmap add/remove



Commit 0a6c86d0 returned these locks back to add/remove
functionality, to protect from intersection of persistent bitmap
related IO with other IO. But other bitmap-related functions called
here are unrelated to the problem, and there are no needs to keep these
calls inside critical sections.

Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
Signed-off-by: default avatarJohn Snow <jsnow@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Message-id: 20190708220502.12977-2-jsnow@redhat.com
Signed-off-by: default avatarJohn Snow <jsnow@redhat.com>
parent b30ffbef
Loading
Loading
Loading
Loading
+13 −17
Original line number Diff line number Diff line
@@ -2813,7 +2813,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
{
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;
    AioContext *aio_context = NULL;

    if (!name || name[0] == '\0') {
        error_setg(errp, "Bitmap name cannot be empty");
@@ -2849,16 +2848,20 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
    }

    if (persistent) {
        aio_context = bdrv_get_aio_context(bs);
        AioContext *aio_context = bdrv_get_aio_context(bs);
        bool ok;

        aio_context_acquire(aio_context);
        if (!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) {
            goto out;
        ok = bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp);
        aio_context_release(aio_context);
        if (!ok) {
            return;
        }
    }

    bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
    if (bitmap == NULL) {
        goto out;
        return;
    }

    if (disabled) {
@@ -2866,10 +2869,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
    }

    bdrv_dirty_bitmap_set_persistence(bitmap, persistent);
 out:
    if (aio_context) {
        aio_context_release(aio_context);
    }
}

void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
@@ -2877,8 +2876,6 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
{
    BlockDriverState *bs;
    BdrvDirtyBitmap *bitmap;
    Error *local_err = NULL;
    AioContext *aio_context = NULL;

    bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
    if (!bitmap || !bs) {
@@ -2891,20 +2888,19 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
    }

    if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
        aio_context = bdrv_get_aio_context(bs);
        AioContext *aio_context = bdrv_get_aio_context(bs);
        Error *local_err = NULL;

        aio_context_acquire(aio_context);
        bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err);
        aio_context_release(aio_context);
        if (local_err != NULL) {
            error_propagate(errp, local_err);
            goto out;
            return;
        }
    }

    bdrv_release_dirty_bitmap(bs, bitmap);
 out:
    if (aio_context) {
        aio_context_release(aio_context);
    }
}

/**