diff mbox

[RFC,3/7] replication: add shared-disk and shared-disk-id options

Message ID 1476971860-20860-4-git-send-email-zhang.zhanghailiang@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhanghailiang Oct. 20, 2016, 1:57 p.m. UTC
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(+)

Comments

Changlong Xie Oct. 25, 2016, 10:01 a.m. UTC | #1
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);
>       }
>
Changlong Xie Oct. 26, 2016, 1:58 a.m. UTC | #2
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);
>       }
>
Zhanghailiang Dec. 5, 2016, 3:08 a.m. UTC | #3
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 mbox

Patch

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);
     }