mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
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:
parent
b976ea3cf5
commit
18930ba3d1
5 changed files with 32 additions and 44 deletions
28
blockdev.c
28
blockdev.c
|
@ -283,32 +283,6 @@ typedef struct {
|
|||
BlockDriverState *bs;
|
||||
} BDRVPutRefBH;
|
||||
|
||||
static void bdrv_put_ref_bh(void *opaque)
|
||||
{
|
||||
BDRVPutRefBH *s = opaque;
|
||||
|
||||
bdrv_unref(s->bs);
|
||||
qemu_bh_delete(s->bh);
|
||||
g_free(s);
|
||||
}
|
||||
|
||||
/*
|
||||
* Release a BDS reference in a BH
|
||||
*
|
||||
* It is not safe to use bdrv_unref() from a callback function when the callers
|
||||
* still need the BlockDriverState. In such cases we schedule a BH to release
|
||||
* the reference.
|
||||
*/
|
||||
static void bdrv_put_ref_bh_schedule(BlockDriverState *bs)
|
||||
{
|
||||
BDRVPutRefBH *s;
|
||||
|
||||
s = g_new(BDRVPutRefBH, 1);
|
||||
s->bh = qemu_bh_new(bdrv_put_ref_bh, s);
|
||||
s->bs = bs;
|
||||
qemu_bh_schedule(s->bh);
|
||||
}
|
||||
|
||||
static int parse_block_error_action(const char *buf, bool is_read, Error **errp)
|
||||
{
|
||||
if (!strcmp(buf, "ignore")) {
|
||||
|
@ -2741,8 +2715,6 @@ static void block_job_cb(void *opaque, int ret)
|
|||
} else {
|
||||
block_job_event_completed(bs->job, msg);
|
||||
}
|
||||
|
||||
bdrv_put_ref_bh_schedule(bs);
|
||||
}
|
||||
|
||||
void qmp_block_stream(const char *device,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue