Commit 1348a657 authored by Vladimir Sementsov-Ogievskiy's avatar Vladimir Sementsov-Ogievskiy Committed by Max Reitz
Browse files

block/block-copy: add state pointer to BlockCopyTask



We are going to use aio-task-pool API, so we'll need state pointer in
BlockCopyTask anyway. Add it now and use where possible.

Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Message-Id: <20200429130847.28124-4-vsementsov@virtuozzo.com>
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent f13e60a9
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#define BLOCK_COPY_MAX_MEM (128 * MiB)

typedef struct BlockCopyTask {
    BlockCopyState *s;
    int64_t offset;
    int64_t bytes;
    QLIST_ENTRY(BlockCopyTask) list;
@@ -116,8 +117,11 @@ static BlockCopyTask *block_copy_task_create(BlockCopyState *s,
    bdrv_reset_dirty_bitmap(s->copy_bitmap, offset, bytes);
    s->in_flight_bytes += bytes;

    task->offset = offset;
    task->bytes = bytes;
    *task = (BlockCopyTask) {
        .s = s,
        .offset = offset,
        .bytes = bytes,
    };
    qemu_co_queue_init(&task->wait_queue);
    QLIST_INSERT_HEAD(&s->tasks, task, list);

@@ -131,8 +135,7 @@ static BlockCopyTask *block_copy_task_create(BlockCopyState *s,
 * wake up all tasks waiting for us (may be some of them are not intersecting
 * with shrunk task)
 */
static void coroutine_fn block_copy_task_shrink(BlockCopyState *s,
                                                BlockCopyTask *task,
static void coroutine_fn block_copy_task_shrink(BlockCopyTask *task,
                                                int64_t new_bytes)
{
    if (new_bytes == task->bytes) {
@@ -141,20 +144,19 @@ static void coroutine_fn block_copy_task_shrink(BlockCopyState *s,

    assert(new_bytes > 0 && new_bytes < task->bytes);

    s->in_flight_bytes -= task->bytes - new_bytes;
    bdrv_set_dirty_bitmap(s->copy_bitmap,
    task->s->in_flight_bytes -= task->bytes - new_bytes;
    bdrv_set_dirty_bitmap(task->s->copy_bitmap,
                          task->offset + new_bytes, task->bytes - new_bytes);

    task->bytes = new_bytes;
    qemu_co_queue_restart_all(&task->wait_queue);
}

static void coroutine_fn block_copy_task_end(BlockCopyState *s,
                                             BlockCopyTask *task, int ret)
static void coroutine_fn block_copy_task_end(BlockCopyTask *task, int ret)
{
    s->in_flight_bytes -= task->bytes;
    task->s->in_flight_bytes -= task->bytes;
    if (ret < 0) {
        bdrv_set_dirty_bitmap(s->copy_bitmap, task->offset, task->bytes);
        bdrv_set_dirty_bitmap(task->s->copy_bitmap, task->offset, task->bytes);
    }
    QLIST_REMOVE(task, list);
    qemu_co_queue_restart_all(&task->wait_queue);
@@ -502,9 +504,9 @@ static int coroutine_fn block_copy_dirty_clusters(BlockCopyState *s,
        ret = block_copy_block_status(s, offset, cur_bytes, &status_bytes);
        assert(ret >= 0); /* never fail */
        cur_bytes = MIN(cur_bytes, status_bytes);
        block_copy_task_shrink(s, task, cur_bytes);
        block_copy_task_shrink(task, cur_bytes);
        if (s->skip_unallocated && !(ret & BDRV_BLOCK_ALLOCATED)) {
            block_copy_task_end(s, task, 0);
            block_copy_task_end(task, 0);
            progress_set_remaining(s->progress,
                                   bdrv_get_dirty_count(s->copy_bitmap) +
                                   s->in_flight_bytes);
@@ -520,7 +522,7 @@ static int coroutine_fn block_copy_dirty_clusters(BlockCopyState *s,
        ret = block_copy_do_copy(s, offset, cur_bytes, ret & BDRV_BLOCK_ZERO,
                                 error_is_read);
        co_put_to_shres(s->mem, cur_bytes);
        block_copy_task_end(s, task, ret);
        block_copy_task_end(task, ret);
        if (ret < 0) {
            return ret;
        }