|
@@ -66,10 +66,7 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
|
|
|
|
|
|
block_job_set_speed(job, speed, &local_err);
|
|
block_job_set_speed(job, speed, &local_err);
|
|
if (local_err) {
|
|
if (local_err) {
|
|
- bs->job = NULL;
|
|
|
|
- bdrv_op_unblock_all(bs, job->blocker);
|
|
|
|
- error_free(job->blocker);
|
|
|
|
- g_free(job);
|
|
|
|
|
|
+ block_job_release(bs);
|
|
error_propagate(errp, local_err);
|
|
error_propagate(errp, local_err);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
@@ -77,18 +74,25 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
|
|
return job;
|
|
return job;
|
|
}
|
|
}
|
|
|
|
|
|
-void block_job_completed(BlockJob *job, int ret)
|
|
|
|
|
|
+void block_job_release(BlockDriverState *bs)
|
|
{
|
|
{
|
|
- BlockDriverState *bs = job->bs;
|
|
|
|
|
|
+ BlockJob *job = bs->job;
|
|
|
|
|
|
- assert(bs->job == job);
|
|
|
|
- job->cb(job->opaque, ret);
|
|
|
|
bs->job = NULL;
|
|
bs->job = NULL;
|
|
bdrv_op_unblock_all(bs, job->blocker);
|
|
bdrv_op_unblock_all(bs, job->blocker);
|
|
error_free(job->blocker);
|
|
error_free(job->blocker);
|
|
g_free(job);
|
|
g_free(job);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void block_job_completed(BlockJob *job, int ret)
|
|
|
|
+{
|
|
|
|
+ BlockDriverState *bs = job->bs;
|
|
|
|
+
|
|
|
|
+ assert(bs->job == job);
|
|
|
|
+ job->cb(job->opaque, ret);
|
|
|
|
+ block_job_release(bs);
|
|
|
|
+}
|
|
|
|
+
|
|
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
|
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
|
{
|
|
{
|
|
Error *local_err = NULL;
|
|
Error *local_err = NULL;
|