[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-BLOCK v7 02/17] quorum: implement block driver
From: |
Wen Congyang |
Subject: |
[Qemu-devel] [PATCH COLO-BLOCK v7 02/17] quorum: implement block driver interfaces add/delete a BDS's child |
Date: |
Tue, 30 Jun 2015 11:34:30 +0800 |
Signed-off-by: Wen Congyang <address@hidden>
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Gonglei <address@hidden>
Cc: Alberto Garcia <address@hidden>
---
block/quorum.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 70 insertions(+), 2 deletions(-)
diff --git a/block/quorum.c b/block/quorum.c
index a7df17c..4a15493 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -67,6 +67,9 @@ typedef struct QuorumVotes {
typedef struct BDRVQuorumState {
BlockDriverState **bs; /* children BlockDriverStates */
int num_children; /* children count */
+ int max_children; /* The maximum children count, we need to reallocate
+ * bs if num_children will larger than maximum.
+ */
int threshold; /* if less than threshold children reads gave the
* same result a quorum error occurs.
*/
@@ -879,9 +882,9 @@ static int quorum_open(BlockDriverState *bs, QDict
*options, int flags,
ret = -EINVAL;
goto exit;
}
- if (s->num_children < 2) {
+ if (s->num_children < 1) {
error_setg(&local_err,
- "Number of provided children must be greater than 1");
+ "Number of provided children must be 1 or more");
ret = -EINVAL;
goto exit;
}
@@ -930,6 +933,7 @@ static int quorum_open(BlockDriverState *bs, QDict
*options, int flags,
/* allocate the children BlockDriverState array */
s->bs = g_new0(BlockDriverState *, s->num_children);
opened = g_new0(bool, s->num_children);
+ s->max_children = s->num_children;
for (i = 0; i < s->num_children; i++) {
char indexstr[32];
@@ -1000,6 +1004,67 @@ static void quorum_attach_aio_context(BlockDriverState
*bs,
}
}
+static void quorum_add_child(BlockDriverState *bs, QDict *options, Error
**errp)
+{
+ BDRVQuorumState *s = bs->opaque;
+ int ret;
+ Error *local_err = NULL;
+
+ bdrv_drain(bs);
+
+ if (s->num_children == s->max_children) {
+ if (s->max_children >= INT_MAX / 2) {
+ error_setg(errp, "Too many children");
+ return;
+ }
+
+ s->bs = g_renew(BlockDriverState *, s->bs, s->max_children * 2);
+ memset(&s->bs[s->max_children], 0, s->max_children * sizeof(void *));
+ s->max_children *= 2;
+ }
+
+ ret = bdrv_open_image(&s->bs[s->num_children], NULL, options, "child", bs,
+ &child_format, false, &local_err);
+ if (ret < 0) {
+ error_propagate(errp, local_err);
+ return;
+ }
+ s->num_children++;
+
+ /* TODO: Update vote_threshold */
+}
+
+static void quorum_del_child(BlockDriverState *bs, BlockDriverState *child_bs,
+ Error **errp)
+{
+ BDRVQuorumState *s = bs->opaque;
+ int i;
+
+ for (i = 0; i < s->num_children; i++) {
+ if (s->bs[i] == child_bs) {
+ break;
+ }
+ }
+
+ if (i == s->num_children) {
+ error_setg(errp, "Invalid child");
+ return;
+ }
+
+ if (s->num_children == 1) {
+ error_setg(errp, "Cannot remove the last child");
+ return;
+ }
+
+ bdrv_drain(bs);
+ /* We can safe remove this child now */
+ memmove(&s->bs[i], &s->bs[i+1], (s->num_children - i - 1) * sizeof(void
*));
+ s->num_children--;
+ s->bs[s->num_children] = NULL;
+
+ /* TODO: update vote_threshold */
+}
+
static void quorum_refresh_filename(BlockDriverState *bs)
{
BDRVQuorumState *s = bs->opaque;
@@ -1054,6 +1119,9 @@ static BlockDriver bdrv_quorum = {
.bdrv_detach_aio_context = quorum_detach_aio_context,
.bdrv_attach_aio_context = quorum_attach_aio_context,
+ .bdrv_add_child = quorum_add_child,
+ .bdrv_del_child = quorum_del_child,
+
.is_filter = true,
.bdrv_recurse_is_first_non_filter = quorum_recurse_is_first_non_filter,
};
--
2.4.3
- [Qemu-devel] [PATCH COLO-BLOCK v7 08/17] block: make bdrv_put_ref_bh_schedule() as a public API, (continued)
- [Qemu-devel] [PATCH COLO-BLOCK v7 08/17] block: make bdrv_put_ref_bh_schedule() as a public API, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 07/17] introduce a new API to check if blk is attached, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 09/17] Backup: clear all bitmap when doing block checkpoint, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 11/17] Allow creating backup jobs when opening BDS, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 10/17] allow writing to the backing file, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 12/17] block: Allow references for backing files, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 13/17] docs: block replication's description, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 15/17] skip nbd_target when starting block replication, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 14/17] Add new block driver interfaces to control block replication, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 16/17] quorum: implement block driver interfaces for block replication, Wen Congyang, 2015/06/29
- [Qemu-devel] [PATCH COLO-BLOCK v7 02/17] quorum: implement block driver interfaces add/delete a BDS's child,
Wen Congyang <=
- [Qemu-devel] [PATCH COLO-BLOCK v7 17/17] Implement new driver for block replication, Wen Congyang, 2015/06/29