blockjob: Introduce reference count and fix reference to job->bs

Add reference count to block job, meanwhile move the ownership of the
reference to job->bs from the caller (which is released in two
completion callbacks) to the block job itself. It is necessary for
block_job_complete_sync to work, because block job shouldn't live longer
than its bs, as asserted in bdrv_delete.

Now block_job_complete_sync can be simplified.

Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 1446765200-3054-6-git-send-email-jsnow@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fam Zheng 2015-11-05 18:13:11 -05:00 committed by Kevin Wolf
parent b976ea3cf5
commit 18930ba3d1
5 changed files with 32 additions and 44 deletions

View file

@ -130,6 +130,9 @@ struct BlockJob {
/** The opaque value that is passed to the completion function. */
void *opaque;
/** Reference count of the block job */
int refcnt;
};
/**
@ -174,12 +177,21 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns);
void block_job_yield(BlockJob *job);
/**
* block_job_release:
* block_job_ref:
* @bs: The block device.
*
* Release job resources when an error occurred or job completed.
* Grab a reference to the block job. Should be paired with block_job_unref.
*/
void block_job_release(BlockDriverState *bs);
void block_job_ref(BlockJob *job);
/**
* block_job_unref:
* @bs: The block device.
*
* Release reference to the block job and release resources if it is the last
* reference.
*/
void block_job_unref(BlockJob *job);
/**
* block_job_completed: