[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH for-2.5 3/6] Add new block driver interface to add/d
From: |
Wen Congyang |
Subject: |
[Qemu-block] [PATCH for-2.5 3/6] Add new block driver interface to add/delete a BDS's child |
Date: |
Fri, 31 Jul 2015 17:19:12 +0800 |
In some cases, we want to take a quorum child offline, and take
another child online.
Signed-off-by: Wen Congyang <address@hidden>
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Gonglei <address@hidden>
---
block.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++
include/block/block.h | 4 ++++
include/block/block_int.h | 5 +++++
3 files changed, 61 insertions(+)
diff --git a/block.c b/block.c
index d088ee0..934a32d 100644
--- a/block.c
+++ b/block.c
@@ -4251,3 +4251,55 @@ BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
{
return &bs->stats;
}
+
+static const char *bdrv_get_id_or_node_name(BlockDriverState *bs)
+{
+ if (bs->blk) {
+ return blk_name(bs->blk);
+ }
+
+ return bs->node_name ? bs->node_name : "";
+}
+
+/*
+ * Hot add/remove a BDS's child. So the user can take a child offline when
+ * it is broken and take a new child online
+ */
+void bdrv_add_child(BlockDriverState *bs, QDict *options, Error **errp)
+{
+
+ if (!bs->drv || !bs->drv->bdrv_add_child) {
+ error_setg(errp, "The BDS %s doesn't support adding a child",
+ bdrv_get_id_or_node_name(bs));
+ return;
+ }
+
+ bs->drv->bdrv_add_child(bs, options, errp);
+}
+
+void bdrv_del_child(BlockDriverState *bs, BlockDriverState *child_bs,
+ Error **errp)
+{
+ BdrvChild *child;
+
+ if (!bs->drv || !bs->drv->bdrv_del_child) {
+ error_setg(errp, "The BDS %s doesn't support removing a child",
+ bdrv_get_id_or_node_name(bs));
+ return;
+ }
+
+ QLIST_FOREACH(child, &bs->children, next) {
+ if (child->bs == child_bs) {
+ break;
+ }
+ }
+
+ if (!child) {
+ error_setg(errp, "The BDS %s is not the BDS %s's child",
+ bdrv_get_id_or_node_name(child_bs),
+ bdrv_get_id_or_node_name(bs));
+ return;
+ }
+
+ bs->drv->bdrv_del_child(bs, child_bs, errp);
+}
diff --git a/include/block/block.h b/include/block/block.h
index 37916f7..4a03fb6 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -616,4 +616,8 @@ void bdrv_flush_io_queue(BlockDriverState *bs);
BlockAcctStats *bdrv_get_stats(BlockDriverState *bs);
+void bdrv_add_child(BlockDriverState *bs, QDict *options, Error **errp);
+void bdrv_del_child(BlockDriverState *bs, BlockDriverState *child,
+ Error **errp);
+
#endif
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 14ad4c3..b6f2905 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -288,6 +288,11 @@ struct BlockDriver {
*/
int (*bdrv_probe_geometry)(BlockDriverState *bs, HDGeometry *geo);
+ void (*bdrv_add_child)(BlockDriverState *bs, QDict *options,
+ Error **errp);
+ void (*bdrv_del_child)(BlockDriverState *bs, BlockDriverState *child,
+ Error **errp);
+
QLIST_ENTRY(BlockDriver) list;
};
--
2.4.3
- [Qemu-block] [PATCH for-2.5 0/6] qapi: child add/delete support, Wen Congyang, 2015/07/31
- [Qemu-block] [PATCH for-2.5 1/6] QAPI: move InetSocketAddress to qapi/common.json, Wen Congyang, 2015/07/31
- [Qemu-block] [PATCH for-2.5 3/6] Add new block driver interface to add/delete a BDS's child,
Wen Congyang <=
- [Qemu-block] [PATCH for-2.5 5/6] qmp: add monitor command to add/remove a child, Wen Congyang, 2015/07/31
- [Qemu-block] [PATCH for-2.5 4/6] quorum: implement block driver interfaces add/delete a BDS's child, Wen Congyang, 2015/07/31
- [Qemu-block] [PATCH for-2.5 2/6] support nbd driver in blockdev-add, Wen Congyang, 2015/07/31
- [Qemu-block] [PATCH for-2.5 6/6] hmp: add monitor command to add/remove a child, Wen Congyang, 2015/07/31