[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 8/8] block: use BDS ref for block jobs
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v5 8/8] block: use BDS ref for block jobs |
Date: |
Fri, 9 Aug 2013 18:02:01 +0800 |
Block jobs used drive_get_ref(drive_get_by_blockdev(bs)) to avoid BDS
being deleted. Now we have BDS reference count, and block jobs don't
care about dinfo, so replace them to get cleaner code. It is also the
safe way when BDS has no drive info.
Signed-off-by: Fam Zheng <address@hidden>
---
blockdev.c | 53 -----------------------------------------------------
blockjob.c | 3 +++
2 files changed, 3 insertions(+), 53 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 5b86c9d..f6961e1 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -233,37 +233,6 @@ void drive_get_ref(DriveInfo *dinfo)
dinfo->refcount++;
}
-typedef struct {
- QEMUBH *bh;
- DriveInfo *dinfo;
-} DrivePutRefBH;
-
-static void drive_put_ref_bh(void *opaque)
-{
- DrivePutRefBH *s = opaque;
-
- drive_put_ref(s->dinfo);
- qemu_bh_delete(s->bh);
- g_free(s);
-}
-
-/*
- * Release a drive reference in a BH
- *
- * It is not possible to use drive_put_ref() from a callback function when the
- * callers still need the drive. In such cases we schedule a BH to release the
- * reference.
- */
-static void drive_put_ref_bh_schedule(DriveInfo *dinfo)
-{
- DrivePutRefBH *s;
-
- s = g_new(DrivePutRefBH, 1);
- s->bh = qemu_bh_new(drive_put_ref_bh, s);
- s->dinfo = dinfo;
- qemu_bh_schedule(s->bh);
-}
-
static int parse_block_error_action(const char *buf, bool is_read)
{
if (!strcmp(buf, "ignore")) {
@@ -1394,8 +1363,6 @@ static void block_job_cb(void *opaque, int ret)
monitor_protocol_event(QEVENT_BLOCK_JOB_COMPLETED, obj);
}
qobject_decref(obj);
-
- drive_put_ref_bh_schedule(drive_get_by_blockdev(bs));
}
void qmp_block_stream(const char *device, bool has_base,
@@ -1431,12 +1398,6 @@ void qmp_block_stream(const char *device, bool has_base,
error_propagate(errp, local_err);
return;
}
-
- /* Grab a reference so hotplug does not delete the BlockDriverState from
- * underneath us.
- */
- drive_get_ref(drive_get_by_blockdev(bs));
-
trace_qmp_block_stream(bs, bs->job);
}
@@ -1493,10 +1454,6 @@ void qmp_block_commit(const char *device,
error_propagate(errp, local_err);
return;
}
- /* Grab a reference so hotplug does not delete the BlockDriverState from
- * underneath us.
- */
- drive_get_ref(drive_get_by_blockdev(bs));
}
void qmp_drive_backup(const char *device, const char *target,
@@ -1609,11 +1566,6 @@ void qmp_drive_backup(const char *device, const char
*target,
error_propagate(errp, local_err);
return;
}
-
- /* Grab a reference so hotplug does not delete the BlockDriverState from
- * underneath us.
- */
- drive_get_ref(drive_get_by_blockdev(bs));
}
#define DEFAULT_MIRROR_BUF_SIZE (10 << 20)
@@ -1750,11 +1702,6 @@ void qmp_drive_mirror(const char *device, const char
*target,
error_propagate(errp, local_err);
return;
}
-
- /* Grab a reference so hotplug does not delete the BlockDriverState from
- * underneath us.
- */
- drive_get_ref(drive_get_by_blockdev(bs));
}
static BlockJob *find_block_job(const char *device)
diff --git a/blockjob.c b/blockjob.c
index ca80df1..832d558 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -46,6 +46,7 @@ void *block_job_create(const BlockJobType *job_type,
BlockDriverState *bs,
return NULL;
}
bdrv_set_in_use(bs, 1);
+ bdrv_ref(bs);
job = g_malloc0(job_type->instance_size);
job->job_type = job_type;
@@ -80,6 +81,8 @@ void block_job_completed(BlockJob *job, int ret)
bs->job = NULL;
g_free(job);
bdrv_set_in_use(bs, 0);
+ bdrv_unref(bs);
+ job->bs = NULL;
}
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
--
1.8.3.1
- [Qemu-devel] [PATCH v5 0/8] Implement reference count for BlockDriverState [resend], Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 1/8] vvfat: use bdrv_new() to allocate BlockDriverState, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 2/8] iscsi: use bdrv_new() instead of stack structure, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 3/8] block: implement reference count for BlockDriverState, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 4/8] block: make bdrv_delete() static, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 5/8] migration: omit drive ref as we have bdrv_ref now, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 6/8] xen_disk: simplify blk_disconnect with refcnt, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 7/8] nbd: use BlockDriverState refcnt, Fam Zheng, 2013/08/09
- [Qemu-devel] [PATCH v5 8/8] block: use BDS ref for block jobs,
Fam Zheng <=
- Re: [Qemu-devel] [PATCH v5 0/8] Implement reference count for BlockDriverState [resend], Stefan Hajnoczi, 2013/08/22