From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58265) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a408U-0002Q5-Uz for qemu-devel@nongnu.org; Wed, 02 Dec 2015 00:39:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a408U-0004UT-1J for qemu-devel@nongnu.org; Wed, 02 Dec 2015 00:39:26 -0500 References: <1449034311-4094-1-git-send-email-wency@cn.fujitsu.com> From: Wen Congyang Message-ID: <565E83D6.9000204@cn.fujitsu.com> Date: Wed, 2 Dec 2015 13:38:30 +0800 MIME-Version: 1.0 In-Reply-To: <1449034311-4094-1-git-send-email-wency@cn.fujitsu.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [Patch v12 resend 10/10] Add a new API to start/stop replication, do checkpoint to all BDSes 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: zhanghailiang , qemu block , Jiang Yunhong , Dong Eddie , "Dr. David Alan Gilbert" , "Michael R. Hines" , Gonglei Signed-off-by: Wen Congyang Signed-off-by: zhanghailiang Signed-off-by: Gonglei --- block.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/block/block.h | 4 +++ 2 files changed, 87 insertions(+) diff --git a/block.c b/block.c index 213bee8..09ee7f1 100644 --- a/block.c +++ b/block.c @@ -4433,3 +4433,86 @@ void bdrv_stop_replication(BlockDriverState *bs, bool failover, Error **errp) " replication", bs->filename); } } + +void bdrv_start_replication_all(ReplicationMode mode, Error **errp) +{ + BlockDriverState *bs = NULL, *temp = NULL; + Error *local_err = NULL; + + while ((bs = bdrv_next(bs))) { + if (!QLIST_EMPTY(&bs->parents)) { + /* It is not top BDS */ + continue; + } + + if (bdrv_is_read_only(bs) || !bdrv_is_inserted(bs)) { + continue; + } + + bdrv_start_replication(bs, mode, &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto fail; + } + } + + return; + +fail: + while ((temp = bdrv_next(temp)) && bs != temp) { + bdrv_stop_replication(temp, false, NULL); + } +} + +void bdrv_do_checkpoint_all(Error **errp) +{ + BlockDriverState *bs = NULL; + Error *local_err = NULL; + + while ((bs = bdrv_next(bs))) { + if (!QLIST_EMPTY(&bs->parents)) { + /* It is not top BDS */ + continue; + } + + if (bdrv_is_read_only(bs) || !bdrv_is_inserted(bs)) { + continue; + } + + bdrv_do_checkpoint(bs, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} + +void bdrv_stop_replication_all(bool failover, Error **errp) +{ + BlockDriverState *bs = NULL; + Error *local_err = NULL; + + while ((bs = bdrv_next(bs))) { + if (!QLIST_EMPTY(&bs->parents)) { + /* It is not top BDS */ + continue; + } + + if (bdrv_is_read_only(bs) || !bdrv_is_inserted(bs)) { + continue; + } + + bdrv_stop_replication(bs, failover, &local_err); + if (!errp) { + /* + * The caller doesn't care the result, they just + * want to stop all block's replication. + */ + continue; + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} diff --git a/include/block/block.h b/include/block/block.h index cd39d50..39d246c 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -653,4 +653,8 @@ void bdrv_start_replication(BlockDriverState *bs, ReplicationMode mode, void bdrv_do_checkpoint(BlockDriverState *bs, Error **errp); void bdrv_stop_replication(BlockDriverState *bs, bool failover, Error **errp); +void bdrv_start_replication_all(ReplicationMode mode, Error **errp); +void bdrv_do_checkpoint_all(Error **errp); +void bdrv_stop_replication_all(bool failover, Error **errp); + #endif -- 2.5.0