From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37583) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJHZV-0004mg-4d for qemu-devel@nongnu.org; Wed, 13 Jan 2016 04:18:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJHZQ-0001E0-J2 for qemu-devel@nongnu.org; Wed, 13 Jan 2016 04:18:26 -0500 Received: from [59.151.112.132] (port=32572 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJHZQ-0001CG-6b for qemu-devel@nongnu.org; Wed, 13 Jan 2016 04:18:24 -0500 From: Changlong Xie Date: Wed, 13 Jan 2016 17:18:27 +0800 Message-ID: <1452676712-24239-4-git-send-email-xiecl.fnst@cn.fujitsu.com> In-Reply-To: <1452676712-24239-1-git-send-email-xiecl.fnst@cn.fujitsu.com> References: <1452676712-24239-1-git-send-email-xiecl.fnst@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v14 3/8] Backup: clear all bitmap when doing block checkpoint List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu devel , Fam Zheng , Max Reitz , Paolo Bonzini , Kevin Wolf , Stefan Hajnoczi Cc: Gonglei , zhanghailiang , fnstml-hwcolo@cn.fujitsu.com From: Wen Congyang Signed-off-by: Wen Congyang Signed-off-by: zhanghailiang Signed-off-by: Gonglei Signed-off-by: Changlong Xie Reviewed-by: Jeff Cody --- block/backup.c | 14 ++++++++++++++ blockjob.c | 11 +++++++++++ include/block/blockjob.h | 12 ++++++++++++ 3 files changed, 37 insertions(+) diff --git a/block/backup.c b/block/backup.c index 705bb77..0a27d01 100644 --- a/block/backup.c +++ b/block/backup.c @@ -253,11 +253,25 @@ static void backup_abort(BlockJob *job) } } +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, "The backup job only supports block checkpoint in" + " sync=none mode"); + 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, .commit = backup_commit, .abort = backup_abort, }; diff --git a/blockjob.c b/blockjob.c index 80adb9d..0c8edfe 100644 --- a/blockjob.c +++ b/blockjob.c @@ -533,3 +533,14 @@ void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job) QLIST_INSERT_HEAD(&txn->jobs, job, txn_list); block_job_txn_ref(txn); } + +void block_job_do_checkpoint(BlockJob *job, Error **errp) +{ + if (!job->driver->do_checkpoint) { + error_setg(errp, "The job %s doesn't support block checkpoint", + BlockJobType_lookup[job->driver->job_type]); + return; + } + + job->driver->do_checkpoint(job, errp); +} diff --git a/include/block/blockjob.h b/include/block/blockjob.h index d84ccd8..abdba7c 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -70,6 +70,9 @@ typedef struct BlockJobDriver { * never both. */ void (*abort)(BlockJob *job); + + /** Optional callback for job types that support checkpoint. */ + void (*do_checkpoint)(BlockJob *job, Error **errp); } BlockJobDriver; /** @@ -443,4 +446,13 @@ void block_job_txn_unref(BlockJobTxn *txn); */ void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job); +/** + * 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 -- 1.9.3