From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53104) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6kUo-0003Sy-3B for qemu-devel@nongnu.org; Fri, 24 Jan 2014 12:24:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W6kUf-0007xp-K0 for qemu-devel@nongnu.org; Fri, 24 Jan 2014 12:24:46 -0500 Received: from mx1.redhat.com ([209.132.183.28]:10859) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6kUf-0007xZ-75 for qemu-devel@nongnu.org; Fri, 24 Jan 2014 12:24:37 -0500 From: Kevin Wolf Date: Fri, 24 Jan 2014 18:21:36 +0100 Message-Id: <1390584136-24703-54-git-send-email-kwolf@redhat.com> In-Reply-To: <1390584136-24703-1-git-send-email-kwolf@redhat.com> References: <1390584136-24703-1-git-send-email-kwolf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 53/93] block: Add bs->node_name to hold the name of a bs node of the bs graph. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Beno=C3=AEt Canet Add the minimum of code to prepare for the following patches. Signed-off-by: Benoit Canet Reviewed-by: Fam Zheng Signed-off-by: Kevin Wolf --- 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 53cc9e0..8562685 100644 --- a/block.c +++ b/block.c @@ -90,6 +90,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDr= iverState *bs, static QTAILQ_HEAD(, BlockDriverState) bdrv_states =3D QTAILQ_HEAD_INITIALIZER(bdrv_states); =20 +static QTAILQ_HEAD(, BlockDriverState) graph_bdrv_states =3D + QTAILQ_HEAD_INITIALIZER(graph_bdrv_states); + static QLIST_HEAD(, BlockDriver) bdrv_drivers =3D QLIST_HEAD_INITIALIZER(bdrv_drivers); =20 @@ -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] !=3D '\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); @@ -1606,7 +1609,7 @@ void bdrv_close_all(void) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { bdrv_close(bs); } } @@ -1635,7 +1638,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; } @@ -1662,7 +1665,7 @@ void bdrv_drain_all(void) BlockDriverState *bs; =20 while (busy) { - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { bdrv_start_throttled_reqs(bs); } =20 @@ -1671,14 +1674,19 @@ void bdrv_drain_all(void) } } =20 -/* 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] !=3D '\0') { - QTAILQ_REMOVE(&bdrv_states, bs, list); + QTAILQ_REMOVE(&bdrv_states, bs, device_list); } bs->device_name[0] =3D '\0'; + if (bs->node_name[0] !=3D '\0') { + QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list); + } + bs->node_name[0] =3D '\0'; } =20 static void bdrv_rebind(BlockDriverState *bs) @@ -1732,7 +1740,12 @@ static void bdrv_move_feature_fields(BlockDriverSt= ate *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 =3D bs_src->list; + bs_dest->device_list =3D 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 entrie= s + */ + bs_dest->node_list =3D bs_src->node_list; } =20 /* @@ -2057,7 +2070,7 @@ int bdrv_commit_all(void) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { if (bs->drv && bs->backing_hd) { int ret =3D bdrv_commit(bs); if (ret < 0) { @@ -3215,11 +3228,12 @@ void bdrv_iterate_format(void (*it)(void *opaque,= const char *name), } } =20 +/* This function is to find block backend bs */ BlockDriverState *bdrv_find(const char *name) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { if (!strcmp(name, bs->device_name)) { return bs; } @@ -3227,19 +3241,34 @@ BlockDriverState *bdrv_find(const char *name) return NULL; } =20 +/* 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); } =20 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *= opaque) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { it(opaque, bs); } } @@ -3259,7 +3288,7 @@ int bdrv_flush_all(void) BlockDriverState *bs; int result =3D 0; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { int ret =3D bdrv_flush(bs); if (ret < 0 && !result) { result =3D ret; @@ -4383,7 +4412,7 @@ void bdrv_invalidate_cache_all(void) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { bdrv_invalidate_cache(bs); } } @@ -4392,7 +4421,7 @@ void bdrv_clear_incoming_migration_all(void) { BlockDriverState *bs; =20 - QTAILQ_FOREACH(bs, &bdrv_states, list) { + QTAILQ_FOREACH(bs, &bdrv_states, device_list) { bs->open_flags =3D bs->open_flags & ~(BDRV_O_INCOMING); } } diff --git a/include/block/block.h b/include/block/block.h index a47f3d4..501b555 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -378,6 +378,7 @@ void bdrv_lock_medium(BlockDriverState *bs, bool lock= ed); 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 2772f2f..f3f518c 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 see= s */ 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; =20 QLIST_HEAD(, BdrvTrackedRequest) tracked_requests; =20 --=20 1.8.1.4