On 26.07.2016 10:15, Changlong Xie wrote: > From: Wen Congyang <we...@cn.fujitsu.com> > > Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> > Signed-off-by: Changlong Xie <xiecl.f...@cn.fujitsu.com> > Signed-off-by: Wang WeiWei <wangww.f...@cn.fujitsu.com> > Signed-off-by: zhanghailiang <zhang.zhanghaili...@huawei.com> > Signed-off-by: Gonglei <arei.gong...@huawei.com> > --- > block/Makefile.objs | 1 + > block/replication.c | 658 > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 659 insertions(+) > create mode 100644 block/replication.c
[...] > diff --git a/block/replication.c b/block/replication.c > new file mode 100644 > index 0000000..ec35348 > --- /dev/null > +++ b/block/replication.c > @@ -0,0 +1,658 @@ [...] > +static void replication_start(ReplicationState *rs, ReplicationMode mode, > + Error **errp) > +{ [...] > + /* start backup job now */ > + error_setg(&s->blocker, > + "Block device is in use by internal backup job"); > + > + top_bs = bdrv_lookup_bs(s->top_id, s->top_id, errp); I think you should pass NULL instead of errp... > + if (!top_bs || !check_top_bs(top_bs, bs)) { > + error_setg(errp, "No top_bs or it is invalid"); ...or if you don't, then you should not call this function if top_bs is NULL. Otherwise you'll probably get a failed assertion in error_setv() because *errp is not NULL. > + reopen_backing_file(s, false, NULL); > + aio_context_release(aio_context); > + return; > + } > + bdrv_op_block_all(top_bs, s->blocker); > + bdrv_op_unblock(top_bs, BLOCK_OP_TYPE_DATAPLANE, s->blocker); Shouldn't you make sure that top_bs is a root node? The first patch in Kevin's "block: Accept node-name in all node level QMP commands" series introduces the bdrv_is_root_node() function for that purpose. Maybe that check should be put into check_top_bs(). Max > + > + backup_start("replication-backup", s->secondary_disk->bs, > + s->hidden_disk->bs, 0, MIRROR_SYNC_MODE_NONE, NULL, > + BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT, > + backup_job_completed, s, NULL, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + backup_job_cleanup(s); > + aio_context_release(aio_context); > + return; > + } > + break;
signature.asc
Description: OpenPGP digital signature