提交 b49f7ead 编写于 作者: W Wen Congyang 提交者: Stefan Hajnoczi

mirror: auto complete active commit

Auto complete mirror job in background to prevent from
blocking synchronously
Signed-off-by: NWen Congyang <wency@cn.fujitsu.com>
Signed-off-by: NChanglong Xie <xiecl.fnst@cn.fujitsu.com>
Signed-off-by: NWang WeiWei <wangww.fnst@cn.fujitsu.com>
Message-id: 1469602913-20979-7-git-send-email-xiecl.fnst@cn.fujitsu.com
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 68365a38
...@@ -916,7 +916,8 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, ...@@ -916,7 +916,8 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
BlockCompletionFunc *cb, BlockCompletionFunc *cb,
void *opaque, Error **errp, void *opaque, Error **errp,
const BlockJobDriver *driver, const BlockJobDriver *driver,
bool is_none_mode, BlockDriverState *base) bool is_none_mode, BlockDriverState *base,
bool auto_complete)
{ {
MirrorBlockJob *s; MirrorBlockJob *s;
...@@ -952,6 +953,9 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, ...@@ -952,6 +953,9 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
s->granularity = granularity; s->granularity = granularity;
s->buf_size = ROUND_UP(buf_size, granularity); s->buf_size = ROUND_UP(buf_size, granularity);
s->unmap = unmap; s->unmap = unmap;
if (auto_complete) {
s->should_complete = true;
}
s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp); s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
if (!s->dirty_bitmap) { if (!s->dirty_bitmap) {
...@@ -990,14 +994,15 @@ void mirror_start(const char *job_id, BlockDriverState *bs, ...@@ -990,14 +994,15 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
mirror_start_job(job_id, bs, target, replaces, mirror_start_job(job_id, bs, target, replaces,
speed, granularity, buf_size, backing_mode, speed, granularity, buf_size, backing_mode,
on_source_error, on_target_error, unmap, cb, opaque, errp, on_source_error, on_target_error, unmap, cb, opaque, errp,
&mirror_job_driver, is_none_mode, base); &mirror_job_driver, is_none_mode, base, false);
} }
void commit_active_start(const char *job_id, BlockDriverState *bs, void commit_active_start(const char *job_id, BlockDriverState *bs,
BlockDriverState *base, int64_t speed, BlockDriverState *base, int64_t speed,
BlockdevOnError on_error, BlockdevOnError on_error,
BlockCompletionFunc *cb, BlockCompletionFunc *cb,
void *opaque, Error **errp) void *opaque, Error **errp,
bool auto_complete)
{ {
int64_t length, base_length; int64_t length, base_length;
int orig_base_flags; int orig_base_flags;
...@@ -1038,7 +1043,7 @@ void commit_active_start(const char *job_id, BlockDriverState *bs, ...@@ -1038,7 +1043,7 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
mirror_start_job(job_id, bs, base, NULL, speed, 0, 0, mirror_start_job(job_id, bs, base, NULL, speed, 0, 0,
MIRROR_LEAVE_BACKING_CHAIN, MIRROR_LEAVE_BACKING_CHAIN,
on_error, on_error, false, cb, opaque, &local_err, on_error, on_error, false, cb, opaque, &local_err,
&commit_active_job_driver, false, base); &commit_active_job_driver, false, base, auto_complete);
if (local_err) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
goto error_restore_flags; goto error_restore_flags;
......
...@@ -3090,7 +3090,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, ...@@ -3090,7 +3090,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
goto out; goto out;
} }
commit_active_start(has_job_id ? job_id : NULL, bs, base_bs, speed, commit_active_start(has_job_id ? job_id : NULL, bs, base_bs, speed,
on_error, block_job_cb, bs, &local_err); on_error, block_job_cb, bs, &local_err, false);
} else { } else {
commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, speed, commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, speed,
on_error, block_job_cb, bs, on_error, block_job_cb, bs,
......
...@@ -702,13 +702,14 @@ void commit_start(const char *job_id, BlockDriverState *bs, ...@@ -702,13 +702,14 @@ void commit_start(const char *job_id, BlockDriverState *bs,
* @cb: Completion function for the job. * @cb: Completion function for the job.
* @opaque: Opaque pointer value passed to @cb. * @opaque: Opaque pointer value passed to @cb.
* @errp: Error object. * @errp: Error object.
* @auto_complete: Auto complete the job.
* *
*/ */
void commit_active_start(const char *job_id, BlockDriverState *bs, void commit_active_start(const char *job_id, BlockDriverState *bs,
BlockDriverState *base, int64_t speed, BlockDriverState *base, int64_t speed,
BlockdevOnError on_error, BlockdevOnError on_error,
BlockCompletionFunc *cb, BlockCompletionFunc *cb,
void *opaque, Error **errp); void *opaque, Error **errp, bool auto_complete);
/* /*
* mirror_start: * mirror_start:
* @job_id: The id of the newly-created job, or %NULL to use the * @job_id: The id of the newly-created job, or %NULL to use the
......
...@@ -921,7 +921,7 @@ static int img_commit(int argc, char **argv) ...@@ -921,7 +921,7 @@ static int img_commit(int argc, char **argv)
}; };
commit_active_start("commit", bs, base_bs, 0, BLOCKDEV_ON_ERROR_REPORT, commit_active_start("commit", bs, base_bs, 0, BLOCKDEV_ON_ERROR_REPORT,
common_block_job_cb, &cbi, &local_err); common_block_job_cb, &cbi, &local_err, false);
if (local_err) { if (local_err) {
goto done; goto done;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册