From: Fam Zheng <famz@redhat.com>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: kwolf@redhat.com, jcody@redhat.com, qemu-devel@nongnu.org,
stefanha@redhat.com, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH V5 1/7] block: Add bs->node_name to hold the name of a bs node of the bs graph.
Date: Tue, 21 Jan 2014 11:10:34 +0800 [thread overview]
Message-ID: <20140121031034.GD29842@T430.redhat.com> (raw)
In-Reply-To: <1386862440-8003-2-git-send-email-benoit@irqsave.net>
On Thu, 12/12 16:33, Benoît Canet wrote:
> Add the minimum of code to prepare for the following patches.
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> block.c | 57 +++++++++++++++++++++++++++++++++++------------
> include/block/block.h | 1 +
> include/block/block_int.h | 9 +++++++-
> 3 files changed, 52 insertions(+), 15 deletions(-)
>
> diff --git a/block.c b/block.c
> index 64e7d22..481d566 100644
> --- a/block.c
> +++ b/block.c
> @@ -90,6 +90,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
> static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
> QTAILQ_HEAD_INITIALIZER(bdrv_states);
>
> +static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =
> + QTAILQ_HEAD_INITIALIZER(graph_bdrv_states);
> +
> static QLIST_HEAD(, BlockDriver) bdrv_drivers =
> QLIST_HEAD_INITIALIZER(bdrv_drivers);
>
> @@ -327,7 +330,7 @@ BlockDriverState *bdrv_new(const char *device_name)
> QLIST_INIT(&bs->dirty_bitmaps);
> pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
> if (device_name[0] != '\0') {
> - QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
> + QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
> }
> bdrv_iostatus_disable(bs);
> notifier_list_init(&bs->close_notifiers);
> @@ -1501,7 +1504,7 @@ void bdrv_close_all(void)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> bdrv_close(bs);
> }
> }
> @@ -1530,7 +1533,7 @@ static bool bdrv_requests_pending(BlockDriverState *bs)
> static bool bdrv_requests_pending_all(void)
> {
> BlockDriverState *bs;
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> if (bdrv_requests_pending(bs)) {
> return true;
> }
> @@ -1557,7 +1560,7 @@ void bdrv_drain_all(void)
> BlockDriverState *bs;
>
> while (busy) {
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> bdrv_start_throttled_reqs(bs);
> }
>
> @@ -1566,14 +1569,19 @@ void bdrv_drain_all(void)
> }
> }
>
> -/* make a BlockDriverState anonymous by removing from bdrv_state list.
> +/* make a BlockDriverState anonymous by removing from bdrv_state and
> + * graph_bdrv_state list.
> Also, NULL terminate the device_name to prevent double remove */
> void bdrv_make_anon(BlockDriverState *bs)
> {
> if (bs->device_name[0] != '\0') {
> - QTAILQ_REMOVE(&bdrv_states, bs, list);
> + QTAILQ_REMOVE(&bdrv_states, bs, device_list);
> }
> bs->device_name[0] = '\0';
> + if (bs->node_name[0] != '\0') {
> + QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
> + }
> + bs->node_name[0] = '\0';
> }
>
> static void bdrv_rebind(BlockDriverState *bs)
> @@ -1627,7 +1635,12 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
> /* keep the same entry in bdrv_states */
> pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
> bs_src->device_name);
> - bs_dest->list = bs_src->list;
> + bs_dest->device_list = bs_src->device_list;
> +
> + /* keep the same entry in graph_bdrv_states
> + * We do want to swap name but don't want to swap linked list entries
> + */
> + bs_dest->node_list = bs_src->node_list;
> }
>
> /*
> @@ -1952,7 +1965,7 @@ int bdrv_commit_all(void)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> if (bs->drv && bs->backing_hd) {
> int ret = bdrv_commit(bs);
> if (ret < 0) {
> @@ -3110,11 +3123,12 @@ void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
> }
> }
>
> +/* This function is to find block backend bs */
> BlockDriverState *bdrv_find(const char *name)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> if (!strcmp(name, bs->device_name)) {
> return bs;
> }
> @@ -3122,19 +3136,34 @@ BlockDriverState *bdrv_find(const char *name)
> return NULL;
> }
>
> +/* This function is to find a node in the bs graph */
> +BlockDriverState *bdrv_find_node(const char *node_name)
> +{
> + BlockDriverState *bs;
> +
> + assert(node_name);
> +
> + QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
> + if (!strcmp(node_name, bs->node_name)) {
> + return bs;
> + }
> + }
> + return NULL;
> +}
> +
> BlockDriverState *bdrv_next(BlockDriverState *bs)
> {
> if (!bs) {
> return QTAILQ_FIRST(&bdrv_states);
> }
> - return QTAILQ_NEXT(bs, list);
> + return QTAILQ_NEXT(bs, device_list);
> }
>
> void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> it(opaque, bs);
> }
> }
> @@ -3154,7 +3183,7 @@ int bdrv_flush_all(void)
> BlockDriverState *bs;
> int result = 0;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> int ret = bdrv_flush(bs);
> if (ret < 0 && !result) {
> result = ret;
> @@ -4278,7 +4307,7 @@ void bdrv_invalidate_cache_all(void)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> bdrv_invalidate_cache(bs);
> }
> }
> @@ -4287,7 +4316,7 @@ void bdrv_clear_incoming_migration_all(void)
> {
> BlockDriverState *bs;
>
> - QTAILQ_FOREACH(bs, &bdrv_states, list) {
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> bs->open_flags = bs->open_flags & ~(BDRV_O_INCOMING);
> }
> }
> diff --git a/include/block/block.h b/include/block/block.h
> index 36efaea..834abf9 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -374,6 +374,7 @@ void bdrv_lock_medium(BlockDriverState *bs, bool locked);
> void bdrv_eject(BlockDriverState *bs, bool eject_flag);
> const char *bdrv_get_format_name(BlockDriverState *bs);
> BlockDriverState *bdrv_find(const char *name);
> +BlockDriverState *bdrv_find_node(const char *node_name);
> BlockDriverState *bdrv_next(BlockDriverState *bs);
> void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
> void *opaque);
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 8b132d7..bd5220f 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -325,11 +325,18 @@ struct BlockDriverState {
> BlockdevOnError on_read_error, on_write_error;
> bool iostatus_enabled;
> BlockDeviceIoStatus iostatus;
> +
> + /* the following member gives a name to every node on the bs graph. */
> + char node_name[32];
> + /* element of the list of named nodes building the graph */
> + QTAILQ_ENTRY(BlockDriverState) node_list;
> + /* Device name is the name associated with the "drive" the guest sees */
> char device_name[32];
> + /* element of the list of "drives" the guest sees */
> + QTAILQ_ENTRY(BlockDriverState) device_list;
> QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps;
> int refcnt;
> int in_use; /* users other than guest access, eg. block migration */
> - QTAILQ_ENTRY(BlockDriverState) list;
>
> QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;
>
> --
> 1.8.3.2
>
>
Reviewed-by: Fam Zheng <famz@redhat.com>
next prev parent reply other threads:[~2014-01-21 3:10 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-12 15:33 [Qemu-devel] [PATCH V5 0/7] Giving names to BlockDriverState graph nodes Benoît Canet
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 1/7] block: Add bs->node_name to hold the name of a bs node of the bs graph Benoît Canet
2014-01-21 3:10 ` Fam Zheng [this message]
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 2/7] block: Allow the user to define "node-name" option Benoît Canet
2014-01-21 3:15 ` Fam Zheng
2014-01-21 14:12 ` Kevin Wolf
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 3/7] qmp: Add a command to list the named BlockDriverState nodes Benoît Canet
2014-01-21 3:23 ` Fam Zheng
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 4/7] qmp: Allow to change password on named block driver states Benoît Canet
2014-01-21 3:27 ` Fam Zheng
2014-01-21 14:17 ` Kevin Wolf
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 5/7] block: Create authorizations mechanism for external snapshot and resize Benoît Canet
2014-01-21 3:45 ` Fam Zheng
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 6/7] qmp: Allow block_resize to manipulate bs graph nodes Benoît Canet
2014-01-21 3:46 ` Fam Zheng
2013-12-12 15:34 ` [Qemu-devel] [PATCH V5 7/7] qmp: Allow to take external snapshots on bs graphs node Benoît Canet
2014-01-21 3:54 ` Fam Zheng
2014-01-21 14:28 ` Kevin Wolf
2014-01-22 21:33 ` Benoît Canet
2014-01-23 10:20 ` Kevin Wolf
2014-01-16 17:18 ` [Qemu-devel] [PATCH V5 0/7] Giving names to BlockDriverState graph nodes Benoît Canet
2014-01-21 4:04 ` Fam Zheng
2014-01-21 14:33 ` Kevin Wolf
2014-01-21 15:36 ` Benoît Canet
2014-01-21 15:44 ` Kevin Wolf
2014-01-22 21:44 ` Benoît Canet
2014-01-23 10:14 ` Kevin Wolf
2014-01-22 22:03 ` Benoît Canet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140121031034.GD29842@T430.redhat.com \
--to=famz@redhat.com \
--cc=armbru@redhat.com \
--cc=benoit@irqsave.net \
--cc=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.