block: Add commit_active_start()
commit_active_start is implemented in block/mirror.c, It will create a job with "commit" type and designated base in block-commit command. This will be used for committing active layer of device. Sync mode is removed from MirrorBlockJob because there's no proper type for commit. The used information is is_none_mode. The common part of mirror_start and commit_active_start is moved to mirror_start_job(). Fix the comment wording for commit_start. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
5bc361b813
commit
03544a6e9e
@ -32,7 +32,7 @@ typedef struct MirrorBlockJob {
|
|||||||
RateLimit limit;
|
RateLimit limit;
|
||||||
BlockDriverState *target;
|
BlockDriverState *target;
|
||||||
BlockDriverState *base;
|
BlockDriverState *base;
|
||||||
MirrorSyncMode mode;
|
bool is_none_mode;
|
||||||
BlockdevOnError on_source_error, on_target_error;
|
BlockdevOnError on_source_error, on_target_error;
|
||||||
bool synced;
|
bool synced;
|
||||||
bool should_complete;
|
bool should_complete;
|
||||||
@ -336,7 +336,7 @@ static void coroutine_fn mirror_run(void *opaque)
|
|||||||
sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
|
sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
|
||||||
mirror_free_init(s);
|
mirror_free_init(s);
|
||||||
|
|
||||||
if (s->mode != MIRROR_SYNC_MODE_NONE) {
|
if (!s->is_none_mode) {
|
||||||
/* First part, loop on the sectors and initialize the dirty bitmap. */
|
/* First part, loop on the sectors and initialize the dirty bitmap. */
|
||||||
BlockDriverState *base = s->base;
|
BlockDriverState *base = s->base;
|
||||||
for (sector_num = 0; sector_num < end; ) {
|
for (sector_num = 0; sector_num < end; ) {
|
||||||
@ -535,15 +535,26 @@ static const BlockJobDriver mirror_job_driver = {
|
|||||||
.complete = mirror_complete,
|
.complete = mirror_complete,
|
||||||
};
|
};
|
||||||
|
|
||||||
void mirror_start(BlockDriverState *bs, BlockDriverState *target,
|
static const BlockJobDriver commit_active_job_driver = {
|
||||||
int64_t speed, int64_t granularity, int64_t buf_size,
|
.instance_size = sizeof(MirrorBlockJob),
|
||||||
MirrorSyncMode mode, BlockdevOnError on_source_error,
|
.job_type = BLOCK_JOB_TYPE_COMMIT,
|
||||||
BlockdevOnError on_target_error,
|
.set_speed = mirror_set_speed,
|
||||||
BlockDriverCompletionFunc *cb,
|
.iostatus_reset
|
||||||
void *opaque, Error **errp)
|
= mirror_iostatus_reset,
|
||||||
|
.complete = mirror_complete,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
|
||||||
|
int64_t speed, int64_t granularity,
|
||||||
|
int64_t buf_size,
|
||||||
|
BlockdevOnError on_source_error,
|
||||||
|
BlockdevOnError on_target_error,
|
||||||
|
BlockDriverCompletionFunc *cb,
|
||||||
|
void *opaque, Error **errp,
|
||||||
|
const BlockJobDriver *driver,
|
||||||
|
bool is_none_mode, BlockDriverState *base)
|
||||||
{
|
{
|
||||||
MirrorBlockJob *s;
|
MirrorBlockJob *s;
|
||||||
BlockDriverState *base = NULL;
|
|
||||||
|
|
||||||
if (granularity == 0) {
|
if (granularity == 0) {
|
||||||
/* Choose the default granularity based on the target file's cluster
|
/* Choose the default granularity based on the target file's cluster
|
||||||
@ -566,13 +577,8 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == MIRROR_SYNC_MODE_TOP) {
|
|
||||||
base = bs->backing_hd;
|
|
||||||
} else {
|
|
||||||
base = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = block_job_create(&mirror_job_driver, bs, speed, cb, opaque, errp);
|
s = block_job_create(driver, bs, speed, cb, opaque, errp);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -580,7 +586,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
|
|||||||
s->on_source_error = on_source_error;
|
s->on_source_error = on_source_error;
|
||||||
s->on_target_error = on_target_error;
|
s->on_target_error = on_target_error;
|
||||||
s->target = target;
|
s->target = target;
|
||||||
s->mode = mode;
|
s->is_none_mode = is_none_mode;
|
||||||
s->base = base;
|
s->base = base;
|
||||||
s->granularity = granularity;
|
s->granularity = granularity;
|
||||||
s->buf_size = MAX(buf_size, granularity);
|
s->buf_size = MAX(buf_size, granularity);
|
||||||
@ -593,3 +599,31 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
|
|||||||
trace_mirror_start(bs, s, s->common.co, opaque);
|
trace_mirror_start(bs, s, s->common.co, opaque);
|
||||||
qemu_coroutine_enter(s->common.co, s);
|
qemu_coroutine_enter(s->common.co, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mirror_start(BlockDriverState *bs, BlockDriverState *target,
|
||||||
|
int64_t speed, int64_t granularity, int64_t buf_size,
|
||||||
|
MirrorSyncMode mode, BlockdevOnError on_source_error,
|
||||||
|
BlockdevOnError on_target_error,
|
||||||
|
BlockDriverCompletionFunc *cb,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
bool is_none_mode;
|
||||||
|
BlockDriverState *base;
|
||||||
|
|
||||||
|
is_none_mode = mode == MIRROR_SYNC_MODE_NONE;
|
||||||
|
base = mode == MIRROR_SYNC_MODE_TOP ? bs->backing_hd : NULL;
|
||||||
|
mirror_start_job(bs, target, speed, granularity, buf_size,
|
||||||
|
on_source_error, on_target_error, cb, opaque, errp,
|
||||||
|
&mirror_job_driver, is_none_mode, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
|
||||||
|
int64_t speed,
|
||||||
|
BlockdevOnError on_error,
|
||||||
|
BlockDriverCompletionFunc *cb,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
mirror_start_job(bs, base, speed, 0, 0,
|
||||||
|
on_error, on_error, cb, opaque, errp,
|
||||||
|
&commit_active_job_driver, false, base);
|
||||||
|
}
|
||||||
|
@ -394,8 +394,9 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* commit_start:
|
* commit_start:
|
||||||
* @bs: Top Block device
|
* @bs: Active block device.
|
||||||
* @base: Block device that will be written into, and become the new top
|
* @top: Top block device to be committed.
|
||||||
|
* @base: Block device that will be written into, and become the new top.
|
||||||
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
|
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
|
||||||
* @on_error: The action to take upon error.
|
* @on_error: The action to take upon error.
|
||||||
* @cb: Completion function for the job.
|
* @cb: Completion function for the job.
|
||||||
@ -407,7 +408,22 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base,
|
|||||||
BlockDriverState *top, int64_t speed,
|
BlockDriverState *top, int64_t speed,
|
||||||
BlockdevOnError on_error, BlockDriverCompletionFunc *cb,
|
BlockdevOnError on_error, BlockDriverCompletionFunc *cb,
|
||||||
void *opaque, Error **errp);
|
void *opaque, Error **errp);
|
||||||
|
/**
|
||||||
|
* commit_active_start:
|
||||||
|
* @bs: Active block device to be committed.
|
||||||
|
* @base: Block device that will be written into, and become the new top.
|
||||||
|
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
|
||||||
|
* @on_error: The action to take upon error.
|
||||||
|
* @cb: Completion function for the job.
|
||||||
|
* @opaque: Opaque pointer value passed to @cb.
|
||||||
|
* @errp: Error object.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
|
||||||
|
int64_t speed,
|
||||||
|
BlockdevOnError on_error,
|
||||||
|
BlockDriverCompletionFunc *cb,
|
||||||
|
void *opaque, Error **errp);
|
||||||
/*
|
/*
|
||||||
* mirror_start:
|
* mirror_start:
|
||||||
* @bs: Block device to operate on.
|
* @bs: Block device to operate on.
|
||||||
|
Loading…
Reference in New Issue
Block a user