Message ID | 1428055280-12015-12-git-send-email-wency@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
On 03/04/2015 12:01, Wen Congyang wrote: > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > Signed-off-by: Gonglei <arei.gonglei@huawei.com> > Cc: Jeff Cody <jcody@redhat.com> > --- > block/backup.c | 13 +++++++++++++ > blockjob.c | 10 ++++++++++ > include/block/blockjob.h | 12 ++++++++++++ > 3 files changed, 35 insertions(+) > > diff --git a/block/backup.c b/block/backup.c > index 1c535b1..e8b8931 100644 > --- a/block/backup.c > +++ b/block/backup.c > @@ -208,11 +208,24 @@ static void backup_iostatus_reset(BlockJob *job) > bdrv_iostatus_reset(s->target); > } > > +static void backup_do_checkpoint(BlockJob *job, Error **errp) > +{ > + BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common); > + > + if (backup_job->sync_mode != MIRROR_SYNC_MODE_NONE) { > + error_setg(errp, "this feature or command is not currently supported"); > + return; > + } > + > + hbitmap_reset_all(backup_job->bitmap); > +} > + > static const BlockJobDriver backup_job_driver = { > .instance_size = sizeof(BackupBlockJob), > .job_type = BLOCK_JOB_TYPE_BACKUP, > .set_speed = backup_set_speed, > .iostatus_reset = backup_iostatus_reset, > + .do_checkpoint = backup_do_checkpoint, > }; > > static BlockErrorAction backup_error_action(BackupBlockJob *job, > diff --git a/blockjob.c b/blockjob.c > index ba2255d..dbac81e 100644 > --- a/blockjob.c > +++ b/blockjob.c > @@ -388,3 +388,13 @@ void block_job_defer_to_main_loop(BlockJob *job, > > qemu_bh_schedule(data->bh); > } > + > +void block_job_do_checkpoint(BlockJob *job, Error **errp) > +{ > + if (!job->driver->do_checkpoint) { > + error_setg(errp, "this feature or command is not currently supported"); > + return; > + } > + > + job->driver->do_checkpoint(job, errp); > +} > diff --git a/include/block/blockjob.h b/include/block/blockjob.h > index b6d4ebb..c6f1cad 100644 > --- a/include/block/blockjob.h > +++ b/include/block/blockjob.h > @@ -50,6 +50,9 @@ typedef struct BlockJobDriver { > * manually. > */ > void (*complete)(BlockJob *job, Error **errp); > + > + /** Optional callback for job types that support checkpoint. */ > + void (*do_checkpoint)(BlockJob *job, Error **errp); > } BlockJobDriver; > > /** > @@ -334,4 +337,13 @@ void block_job_defer_to_main_loop(BlockJob *job, > BlockJobDeferToMainLoopFn *fn, > void *opaque); > > +/** > + * block_job_do_checkpoint: > + * @job: The job. > + * @errp: Error object. > + * > + * Do block checkpoint on the specified job. > + */ > +void block_job_do_checkpoint(BlockJob *job, Error **errp); > + > #endif > Does this only run on the secondary, or also on the primary? What happens if you use a block job on the primary? Perhaps a variant of backup_job_driver is needed for COLO, and the default behavior of block_job_do_checkpoint should be to do nothing? Paolo
On 04/03/2015 07:09 PM, Paolo Bonzini wrote: > > > On 03/04/2015 12:01, Wen Congyang wrote: >> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> >> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> >> Signed-off-by: Gonglei <arei.gonglei@huawei.com> >> Cc: Jeff Cody <jcody@redhat.com> >> --- >> block/backup.c | 13 +++++++++++++ >> blockjob.c | 10 ++++++++++ >> include/block/blockjob.h | 12 ++++++++++++ >> 3 files changed, 35 insertions(+) >> >> diff --git a/block/backup.c b/block/backup.c >> index 1c535b1..e8b8931 100644 >> --- a/block/backup.c >> +++ b/block/backup.c >> @@ -208,11 +208,24 @@ static void backup_iostatus_reset(BlockJob *job) >> bdrv_iostatus_reset(s->target); >> } >> >> +static void backup_do_checkpoint(BlockJob *job, Error **errp) >> +{ >> + BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common); >> + >> + if (backup_job->sync_mode != MIRROR_SYNC_MODE_NONE) { >> + error_setg(errp, "this feature or command is not currently supported"); >> + return; >> + } >> + >> + hbitmap_reset_all(backup_job->bitmap); >> +} >> + >> static const BlockJobDriver backup_job_driver = { >> .instance_size = sizeof(BackupBlockJob), >> .job_type = BLOCK_JOB_TYPE_BACKUP, >> .set_speed = backup_set_speed, >> .iostatus_reset = backup_iostatus_reset, >> + .do_checkpoint = backup_do_checkpoint, >> }; >> >> static BlockErrorAction backup_error_action(BackupBlockJob *job, >> diff --git a/blockjob.c b/blockjob.c >> index ba2255d..dbac81e 100644 >> --- a/blockjob.c >> +++ b/blockjob.c >> @@ -388,3 +388,13 @@ void block_job_defer_to_main_loop(BlockJob *job, >> >> qemu_bh_schedule(data->bh); >> } >> + >> +void block_job_do_checkpoint(BlockJob *job, Error **errp) >> +{ >> + if (!job->driver->do_checkpoint) { >> + error_setg(errp, "this feature or command is not currently supported"); >> + return; >> + } >> + >> + job->driver->do_checkpoint(job, errp); >> +} >> diff --git a/include/block/blockjob.h b/include/block/blockjob.h >> index b6d4ebb..c6f1cad 100644 >> --- a/include/block/blockjob.h >> +++ b/include/block/blockjob.h >> @@ -50,6 +50,9 @@ typedef struct BlockJobDriver { >> * manually. >> */ >> void (*complete)(BlockJob *job, Error **errp); >> + >> + /** Optional callback for job types that support checkpoint. */ >> + void (*do_checkpoint)(BlockJob *job, Error **errp); >> } BlockJobDriver; >> >> /** >> @@ -334,4 +337,13 @@ void block_job_defer_to_main_loop(BlockJob *job, >> BlockJobDeferToMainLoopFn *fn, >> void *opaque); >> >> +/** >> + * block_job_do_checkpoint: >> + * @job: The job. >> + * @errp: Error object. >> + * >> + * Do block checkpoint on the specified job. >> + */ >> +void block_job_do_checkpoint(BlockJob *job, Error **errp); >> + >> #endif >> > > Does this only run on the secondary, or also on the primary? What > happens if you use a block job on the primary? It is only for secondary. This new blockjob API is only called in qcow2+colo, which is used for secondary qemu. So primary qemu will not come here. If it happens, it is a bug. Should we check it here? Thanks Wen Congyang > > Perhaps a variant of backup_job_driver is needed for COLO, and the > default behavior of block_job_do_checkpoint should be to do nothing? > > Paolo > . >
diff --git a/block/backup.c b/block/backup.c index 1c535b1..e8b8931 100644 --- a/block/backup.c +++ b/block/backup.c @@ -208,11 +208,24 @@ static void backup_iostatus_reset(BlockJob *job) bdrv_iostatus_reset(s->target); } +static void backup_do_checkpoint(BlockJob *job, Error **errp) +{ + BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common); + + if (backup_job->sync_mode != MIRROR_SYNC_MODE_NONE) { + error_setg(errp, "this feature or command is not currently supported"); + return; + } + + hbitmap_reset_all(backup_job->bitmap); +} + static const BlockJobDriver backup_job_driver = { .instance_size = sizeof(BackupBlockJob), .job_type = BLOCK_JOB_TYPE_BACKUP, .set_speed = backup_set_speed, .iostatus_reset = backup_iostatus_reset, + .do_checkpoint = backup_do_checkpoint, }; static BlockErrorAction backup_error_action(BackupBlockJob *job, diff --git a/blockjob.c b/blockjob.c index ba2255d..dbac81e 100644 --- a/blockjob.c +++ b/blockjob.c @@ -388,3 +388,13 @@ void block_job_defer_to_main_loop(BlockJob *job, qemu_bh_schedule(data->bh); } + +void block_job_do_checkpoint(BlockJob *job, Error **errp) +{ + if (!job->driver->do_checkpoint) { + error_setg(errp, "this feature or command is not currently supported"); + return; + } + + job->driver->do_checkpoint(job, errp); +} diff --git a/include/block/blockjob.h b/include/block/blockjob.h index b6d4ebb..c6f1cad 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -50,6 +50,9 @@ typedef struct BlockJobDriver { * manually. */ void (*complete)(BlockJob *job, Error **errp); + + /** Optional callback for job types that support checkpoint. */ + void (*do_checkpoint)(BlockJob *job, Error **errp); } BlockJobDriver; /** @@ -334,4 +337,13 @@ void block_job_defer_to_main_loop(BlockJob *job, BlockJobDeferToMainLoopFn *fn, void *opaque); +/** + * block_job_do_checkpoint: + * @job: The job. + * @errp: Error object. + * + * Do block checkpoint on the specified job. + */ +void block_job_do_checkpoint(BlockJob *job, Error **errp); + #endif