[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 09/15] blockjob: Move BlockJobDeferToMainLoopData
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v3 09/15] blockjob: Move BlockJobDeferToMainLoopData into BlockJob |
Date: |
Fri, 10 Jul 2015 11:46:46 +0800 |
This will bind the BH data to block job data and is therefore easier to
manage, for example during cancellation.
Signed-off-by: Fam Zheng <address@hidden>
---
blockjob.c | 34 +++++++++++++++-------------------
include/block/blockjob.h | 16 ++++++++++++++--
2 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index 11b48f5..e057dd5 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -92,6 +92,10 @@ void block_job_completed(BlockJob *job, int ret)
assert(!job->completed);
job->completed = true;
job->ret = ret;
+ if (job->defer_to_main_loop_data.bh) {
+ qemu_bh_delete(job->defer_to_main_loop_data.bh);
+ job->defer_to_main_loop_data.bh = NULL;
+ }
job->cb(job->opaque, ret);
block_job_release(bs);
}
@@ -344,44 +348,36 @@ BlockErrorAction block_job_error_action(BlockJob *job,
BlockDriverState *bs,
return action;
}
-typedef struct {
- BlockJob *job;
- QEMUBH *bh;
- AioContext *aio_context;
- BlockJobDeferToMainLoopFn *fn;
- void *opaque;
-} BlockJobDeferToMainLoopData;
-
static void block_job_defer_to_main_loop_bh(void *opaque)
{
- BlockJobDeferToMainLoopData *data = opaque;
+ BlockJob *job = opaque;
+ /* Copy the struct in case job get released in data.fn() */
+ BlockJobDeferToMainLoopData data = job->defer_to_main_loop_data;
AioContext *aio_context;
- qemu_bh_delete(data->bh);
+ qemu_bh_delete(data.bh);
/* Prevent race with block_job_defer_to_main_loop() */
- aio_context_acquire(data->aio_context);
+ aio_context_acquire(data.aio_context);
/* Fetch BDS AioContext again, in case it has changed */
- aio_context = bdrv_get_aio_context(data->job->bs);
+ aio_context = bdrv_get_aio_context(job->bs);
aio_context_acquire(aio_context);
- data->fn(data->job, data->opaque);
+ data.fn(job, data.opaque);
aio_context_release(aio_context);
- aio_context_release(data->aio_context);
-
- g_free(data);
+ aio_context_release(data.aio_context);
}
void block_job_defer_to_main_loop(BlockJob *job,
BlockJobDeferToMainLoopFn *fn,
void *opaque)
{
- BlockJobDeferToMainLoopData *data = g_malloc(sizeof(*data));
- data->job = job;
- data->bh = qemu_bh_new(block_job_defer_to_main_loop_bh, data);
+ BlockJobDeferToMainLoopData *data = &job->defer_to_main_loop_data;
+ assert(!data->bh);
+ data->bh = qemu_bh_new(block_job_defer_to_main_loop_bh, job);
data->aio_context = bdrv_get_aio_context(job->bs);
data->fn = fn;
data->opaque = opaque;
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index 40d0776..5bac2e2 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -64,6 +64,15 @@ typedef struct BlockJobDriver {
void (*txn_abort)(BlockJob *job);
} BlockJobDriver;
+typedef void BlockJobDeferToMainLoopFn(BlockJob *job, void *opaque);
+
+typedef struct {
+ QEMUBH *bh;
+ AioContext *aio_context;
+ BlockJobDeferToMainLoopFn *fn;
+ void *opaque;
+} BlockJobDeferToMainLoopData;
+
/**
* BlockJob:
*
@@ -83,6 +92,11 @@ struct BlockJob {
Coroutine *co;
/**
+ * The data used by block_job_defer_to_main_loop.
+ */
+ BlockJobDeferToMainLoopData defer_to_main_loop_data;
+
+ /**
* Set to true if the job should cancel itself. The flag must
* always be tested just before toggling the busy flag from false
* to true. After a job has been cancelled, it should only yield
@@ -359,8 +373,6 @@ BlockErrorAction block_job_error_action(BlockJob *job,
BlockDriverState *bs,
BlockdevOnError on_err,
int is_read, int error);
-typedef void BlockJobDeferToMainLoopFn(BlockJob *job, void *opaque);
-
/**
* block_job_defer_to_main_loop:
* @job: The job
--
2.4.3
- Re: [Qemu-devel] [PATCH v3 05/15] backup: Extract dirty bitmap handling as a separate function, (continued)
- [Qemu-devel] [PATCH v3 06/15] blockjob: Add .txn_commit and .txn_abort transaction actions, Fam Zheng, 2015/07/09
- [Qemu-devel] [PATCH v3 07/15] blockjob: Add "completed" and "ret" in BlockJob, Fam Zheng, 2015/07/09
- [Qemu-devel] [PATCH v3 08/15] blockjob: Simplify block_job_finish_sync, Fam Zheng, 2015/07/09
- [Qemu-devel] [PATCH v3 09/15] blockjob: Move BlockJobDeferToMainLoopData into BlockJob,
Fam Zheng <=
- [Qemu-devel] [PATCH v3 10/15] block: add block job transactions, Fam Zheng, 2015/07/09
- Re: [Qemu-devel] [PATCH v3 10/15] block: add block job transactions, Stefan Hajnoczi, 2015/07/14
- [Qemu-devel] [PATCH v3 11/15] blockdev: make BlockJobTxn available to qmp 'transaction', Fam Zheng, 2015/07/09
- [Qemu-devel] [PATCH v3 12/15] block/backup: support block job transactions, Fam Zheng, 2015/07/09