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