Revision eeec61f2 block.c

b/block.c
3858 3858

  
3859 3859
    return ret;
3860 3860
}
3861

  
3862
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
3863
                       BlockDriverCompletionFunc *cb, void *opaque)
3864
{
3865
    BlockJob *job;
3866

  
3867
    if (bs->job || bdrv_in_use(bs)) {
3868
        return NULL;
3869
    }
3870
    bdrv_set_in_use(bs, 1);
3871

  
3872
    job = g_malloc0(job_type->instance_size);
3873
    job->job_type      = job_type;
3874
    job->bs            = bs;
3875
    job->cb            = cb;
3876
    job->opaque        = opaque;
3877
    bs->job = job;
3878
    return job;
3879
}
3880

  
3881
void block_job_complete(BlockJob *job, int ret)
3882
{
3883
    BlockDriverState *bs = job->bs;
3884

  
3885
    assert(bs->job == job);
3886
    job->cb(job->opaque, ret);
3887
    bs->job = NULL;
3888
    g_free(job);
3889
    bdrv_set_in_use(bs, 0);
3890
}
3891

  
3892
int block_job_set_speed(BlockJob *job, int64_t value)
3893
{
3894
    if (!job->job_type->set_speed) {
3895
        return -ENOTSUP;
3896
    }
3897
    return job->job_type->set_speed(job, value);
3898
}
3899

  
3900
void block_job_cancel(BlockJob *job)
3901
{
3902
    job->cancelled = true;
3903
}
3904

  
3905
bool block_job_is_cancelled(BlockJob *job)
3906
{
3907
    return job->cancelled;
3908
}

Also available in: Unified diff