[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-2.5 4/6] quorum: implement block driver interfac
From: |
Wen Congyang |
Subject: |
[Qemu-devel] [PATCH for-2.5 4/6] quorum: implement block driver interfaces add/delete a BDS's child |
Date: |
Fri, 31 Jul 2015 17:19:13 +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 | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 72 insertions(+), 2 deletions(-)
diff --git a/block/quorum.c b/block/quorum.c
index 4e66221..1c09265 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -66,6 +66,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.
*/
@@ -880,9 +883,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;
}
@@ -931,6 +934,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];
@@ -1001,6 +1005,69 @@ 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) {
+ error_setg(errp, "Too many children");
+ return;
+ }
+
+ s->bs = g_renew(BlockDriverState *, s->bs, s->max_children + 1);
+ s->bs[s->num_children] = NULL;
+ s->max_children += 1;
+ }
+
+ 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++;
+}
+
+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 <= s->threshold) {
+ error_setg(errp, "Cannot remove any more 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;
+ bdrv_unref(child_bs);
+}
+
static void quorum_refresh_filename(BlockDriverState *bs)
{
BDRVQuorumState *s = bs->opaque;
@@ -1055,6 +1122,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 for-2.5 0/6] qapi: child add/delete support, Wen Congyang, 2015/07/31
- [Qemu-devel] [PATCH for-2.5 1/6] QAPI: move InetSocketAddress to qapi/common.json, Wen Congyang, 2015/07/31
- [Qemu-devel] [PATCH for-2.5 3/6] Add new block driver interface to add/delete a BDS's child, Wen Congyang, 2015/07/31
- [Qemu-devel] [PATCH for-2.5 2/6] support nbd driver in blockdev-add, Wen Congyang, 2015/07/31
- [Qemu-devel] [PATCH for-2.5 4/6] quorum: implement block driver interfaces add/delete a BDS's child,
Wen Congyang <=
- [Qemu-devel] [PATCH for-2.5 5/6] qmp: add monitor command to add/remove a child, Wen Congyang, 2015/07/31
- [Qemu-devel] [PATCH for-2.5 6/6] hmp: add monitor command to add/remove a child, Wen Congyang, 2015/07/31