Message ID | 1476971860-20860-4-git-send-email-zhang.zhanghailiang@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 10/20/2016 09:57 PM, zhanghailiang wrote: > We use these two options to identify which disk is > shared > > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> > Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com> > --- > block/replication.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/block/replication.c b/block/replication.c > index 3bd1cf1..2a2fdb2 100644 > --- a/block/replication.c > +++ b/block/replication.c > @@ -25,9 +25,12 @@ > typedef struct BDRVReplicationState { > ReplicationMode mode; > int replication_state; > + bool is_shared_disk; > + char *shared_disk_id; > BdrvChild *active_disk; > BdrvChild *hidden_disk; > BdrvChild *secondary_disk; > + BdrvChild *primary_disk; > char *top_id; > ReplicationState *rs; > Error *blocker; > @@ -53,6 +56,9 @@ static void replication_stop(ReplicationState *rs, bool failover, > > #define REPLICATION_MODE "mode" > #define REPLICATION_TOP_ID "top-id" > +#define REPLICATION_SHARED_DISK "shared-disk" > +#define REPLICATION_SHARED_DISK_ID "shared-disk-id" > + > static QemuOptsList replication_runtime_opts = { > .name = "replication", > .head = QTAILQ_HEAD_INITIALIZER(replication_runtime_opts.head), > @@ -65,6 +71,14 @@ static QemuOptsList replication_runtime_opts = { > .name = REPLICATION_TOP_ID, > .type = QEMU_OPT_STRING, > }, > + { > + .name = REPLICATION_SHARED_DISK_ID, > + .type = QEMU_OPT_STRING, > + }, > + { > + .name = REPLICATION_SHARED_DISK, > + .type = QEMU_OPT_BOOL, > + }, > { /* end of list */ } > }, > }; > @@ -85,6 +99,8 @@ static int replication_open(BlockDriverState *bs, QDict *options, > QemuOpts *opts = NULL; > const char *mode; > const char *top_id; > + const char *shared_disk_id; > + BlockBackend *blk; > > ret = -EINVAL; > opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort); > @@ -114,6 +130,22 @@ static int replication_open(BlockDriverState *bs, QDict *options, > "The option mode's value should be primary or secondary"); > goto fail; > } > + s->is_shared_disk = qemu_opt_get_bool(opts, REPLICATION_SHARED_DISK, > + false); > + if (s->is_shared_disk && (s->mode == REPLICATION_MODE_PRIMARY)) { > + shared_disk_id = qemu_opt_get(opts, REPLICATION_SHARED_DISK_ID); > + if (!shared_disk_id) { > + error_setg(&local_err, "Missing shared disk blk"); > + goto fail; > + } > + s->shared_disk_id = g_strdup(shared_disk_id); > + blk = blk_by_name(s->shared_disk_id); > + if (!blk) { > + error_setg(&local_err, "There is no %s block", s->shared_disk_id); g_free(s->shared_disk_id); > + goto fail; > + } > + s->primary_disk = blk_root(blk); > + } > > s->rs = replication_new(bs, &replication_ops); > > @@ -130,6 +162,7 @@ static void replication_close(BlockDriverState *bs) > { > BDRVReplicationState *s = bs->opaque; > > + g_free(s->shared_disk_id); > if (s->replication_state == BLOCK_REPLICATION_RUNNING) { > replication_stop(s->rs, false, NULL); > } >
On 10/20/2016 09:57 PM, zhanghailiang wrote: > We use these two options to identify which disk is > shared > > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> > Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com> > --- > block/replication.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/block/replication.c b/block/replication.c > index 3bd1cf1..2a2fdb2 100644 > --- a/block/replication.c > +++ b/block/replication.c > @@ -25,9 +25,12 @@ > typedef struct BDRVReplicationState { > ReplicationMode mode; > int replication_state; > + bool is_shared_disk; > + char *shared_disk_id; > BdrvChild *active_disk; > BdrvChild *hidden_disk; > BdrvChild *secondary_disk; > + BdrvChild *primary_disk; > char *top_id; > ReplicationState *rs; > Error *blocker; > @@ -53,6 +56,9 @@ static void replication_stop(ReplicationState *rs, bool failover, > > #define REPLICATION_MODE "mode" > #define REPLICATION_TOP_ID "top-id" > +#define REPLICATION_SHARED_DISK "shared-disk" > +#define REPLICATION_SHARED_DISK_ID "shared-disk-id" > + > static QemuOptsList replication_runtime_opts = { > .name = "replication", > .head = QTAILQ_HEAD_INITIALIZER(replication_runtime_opts.head), > @@ -65,6 +71,14 @@ static QemuOptsList replication_runtime_opts = { > .name = REPLICATION_TOP_ID, > .type = QEMU_OPT_STRING, > }, > + { > + .name = REPLICATION_SHARED_DISK_ID, > + .type = QEMU_OPT_STRING, > + }, > + { > + .name = REPLICATION_SHARED_DISK, > + .type = QEMU_OPT_BOOL, > + }, > { /* end of list */ } > }, > }; > @@ -85,6 +99,8 @@ static int replication_open(BlockDriverState *bs, QDict *options, > QemuOpts *opts = NULL; > const char *mode; > const char *top_id; > + const char *shared_disk_id; > + BlockBackend *blk; > > ret = -EINVAL; > opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort); > @@ -114,6 +130,22 @@ static int replication_open(BlockDriverState *bs, QDict *options, > "The option mode's value should be primary or secondary"); > goto fail; > } Now we have four runtime options "mode"/"top-id"/"shared-disk"/"shared-disk-id". But the current checking logic is too weak, i think you need enhance it to avoid opts misusage. > + s->is_shared_disk = qemu_opt_get_bool(opts, REPLICATION_SHARED_DISK, > + false); Missing one space. > + if (s->is_shared_disk && (s->mode == REPLICATION_MODE_PRIMARY)) { > + shared_disk_id = qemu_opt_get(opts, REPLICATION_SHARED_DISK_ID); > + if (!shared_disk_id) { > + error_setg(&local_err, "Missing shared disk blk"); > + goto fail; > + } > + s->shared_disk_id = g_strdup(shared_disk_id); > + blk = blk_by_name(s->shared_disk_id); > + if (!blk) { > + error_setg(&local_err, "There is no %s block", s->shared_disk_id); > + goto fail; > + } > + s->primary_disk = blk_root(blk); > + } > > s->rs = replication_new(bs, &replication_ops); > > @@ -130,6 +162,7 @@ static void replication_close(BlockDriverState *bs) > { > BDRVReplicationState *s = bs->opaque; > > + g_free(s->shared_disk_id); > if (s->replication_state == BLOCK_REPLICATION_RUNNING) { > replication_stop(s->rs, false, NULL); > } >
On 2016/10/25 18:01, Changlong Xie wrote: > On 10/20/2016 09:57 PM, zhanghailiang wrote: >> We use these two options to identify which disk is >> shared >> >> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> >> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> >> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com> >> --- >> block/replication.c | 33 +++++++++++++++++++++++++++++++++ >> 1 file changed, 33 insertions(+) >> >> diff --git a/block/replication.c b/block/replication.c >> index 3bd1cf1..2a2fdb2 100644 >> --- a/block/replication.c >> +++ b/block/replication.c >> @@ -25,9 +25,12 @@ >> typedef struct BDRVReplicationState { >> ReplicationMode mode; >> int replication_state; >> + bool is_shared_disk; >> + char *shared_disk_id; >> BdrvChild *active_disk; >> BdrvChild *hidden_disk; >> BdrvChild *secondary_disk; >> + BdrvChild *primary_disk; >> char *top_id; >> ReplicationState *rs; >> Error *blocker; >> @@ -53,6 +56,9 @@ static void replication_stop(ReplicationState *rs, bool failover, >> >> #define REPLICATION_MODE "mode" >> #define REPLICATION_TOP_ID "top-id" >> +#define REPLICATION_SHARED_DISK "shared-disk" >> +#define REPLICATION_SHARED_DISK_ID "shared-disk-id" >> + >> static QemuOptsList replication_runtime_opts = { >> .name = "replication", >> .head = QTAILQ_HEAD_INITIALIZER(replication_runtime_opts.head), >> @@ -65,6 +71,14 @@ static QemuOptsList replication_runtime_opts = { >> .name = REPLICATION_TOP_ID, >> .type = QEMU_OPT_STRING, >> }, >> + { >> + .name = REPLICATION_SHARED_DISK_ID, >> + .type = QEMU_OPT_STRING, >> + }, >> + { >> + .name = REPLICATION_SHARED_DISK, >> + .type = QEMU_OPT_BOOL, >> + }, >> { /* end of list */ } >> }, >> }; >> @@ -85,6 +99,8 @@ static int replication_open(BlockDriverState *bs, QDict *options, >> QemuOpts *opts = NULL; >> const char *mode; >> const char *top_id; >> + const char *shared_disk_id; >> + BlockBackend *blk; >> >> ret = -EINVAL; >> opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort); >> @@ -114,6 +130,22 @@ static int replication_open(BlockDriverState *bs, QDict *options, >> "The option mode's value should be primary or secondary"); >> goto fail; >> } >> + s->is_shared_disk = qemu_opt_get_bool(opts, REPLICATION_SHARED_DISK, >> + false); >> + if (s->is_shared_disk && (s->mode == REPLICATION_MODE_PRIMARY)) { >> + shared_disk_id = qemu_opt_get(opts, REPLICATION_SHARED_DISK_ID); >> + if (!shared_disk_id) { >> + error_setg(&local_err, "Missing shared disk blk"); >> + goto fail; >> + } >> + s->shared_disk_id = g_strdup(shared_disk_id); >> + blk = blk_by_name(s->shared_disk_id); >> + if (!blk) { >> + error_setg(&local_err, "There is no %s block", s->shared_disk_id); > > g_free(s->shared_disk_id); > Will fix in next version, thanks >> + goto fail; >> + } >> + s->primary_disk = blk_root(blk); >> + } >> >> s->rs = replication_new(bs, &replication_ops); >> >> @@ -130,6 +162,7 @@ static void replication_close(BlockDriverState *bs) >> { >> BDRVReplicationState *s = bs->opaque; >> >> + g_free(s->shared_disk_id); >> if (s->replication_state == BLOCK_REPLICATION_RUNNING) { >> replication_stop(s->rs, false, NULL); >> } >> > > > > . >
diff --git a/block/replication.c b/block/replication.c index 3bd1cf1..2a2fdb2 100644 --- a/block/replication.c +++ b/block/replication.c @@ -25,9 +25,12 @@ typedef struct BDRVReplicationState { ReplicationMode mode; int replication_state; + bool is_shared_disk; + char *shared_disk_id; BdrvChild *active_disk; BdrvChild *hidden_disk; BdrvChild *secondary_disk; + BdrvChild *primary_disk; char *top_id; ReplicationState *rs; Error *blocker; @@ -53,6 +56,9 @@ static void replication_stop(ReplicationState *rs, bool failover, #define REPLICATION_MODE "mode" #define REPLICATION_TOP_ID "top-id" +#define REPLICATION_SHARED_DISK "shared-disk" +#define REPLICATION_SHARED_DISK_ID "shared-disk-id" + static QemuOptsList replication_runtime_opts = { .name = "replication", .head = QTAILQ_HEAD_INITIALIZER(replication_runtime_opts.head), @@ -65,6 +71,14 @@ static QemuOptsList replication_runtime_opts = { .name = REPLICATION_TOP_ID, .type = QEMU_OPT_STRING, }, + { + .name = REPLICATION_SHARED_DISK_ID, + .type = QEMU_OPT_STRING, + }, + { + .name = REPLICATION_SHARED_DISK, + .type = QEMU_OPT_BOOL, + }, { /* end of list */ } }, }; @@ -85,6 +99,8 @@ static int replication_open(BlockDriverState *bs, QDict *options, QemuOpts *opts = NULL; const char *mode; const char *top_id; + const char *shared_disk_id; + BlockBackend *blk; ret = -EINVAL; opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort); @@ -114,6 +130,22 @@ static int replication_open(BlockDriverState *bs, QDict *options, "The option mode's value should be primary or secondary"); goto fail; } + s->is_shared_disk = qemu_opt_get_bool(opts, REPLICATION_SHARED_DISK, + false); + if (s->is_shared_disk && (s->mode == REPLICATION_MODE_PRIMARY)) { + shared_disk_id = qemu_opt_get(opts, REPLICATION_SHARED_DISK_ID); + if (!shared_disk_id) { + error_setg(&local_err, "Missing shared disk blk"); + goto fail; + } + s->shared_disk_id = g_strdup(shared_disk_id); + blk = blk_by_name(s->shared_disk_id); + if (!blk) { + error_setg(&local_err, "There is no %s block", s->shared_disk_id); + goto fail; + } + s->primary_disk = blk_root(blk); + } s->rs = replication_new(bs, &replication_ops); @@ -130,6 +162,7 @@ static void replication_close(BlockDriverState *bs) { BDRVReplicationState *s = bs->opaque; + g_free(s->shared_disk_id); if (s->replication_state == BLOCK_REPLICATION_RUNNING) { replication_stop(s->rs, false, NULL); }