From 2be9847ee6b083c8ca51e7d8ec240398c3e5026b Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 10 May 2010 17:28:38 -0300 Subject: [PATCH 10/11] block: Convert bdrv_first to QTAILQ RH-Author: Kevin Wolf Message-id: <1273512519-16871-3-git-send-email-kwolf@redhat.com> Patchwork-id: 9137 O-Subject: [RHEL-6 qemu-kvm PATCH 2/3] block: Convert bdrv_first to QTAILQ Bugzilla: 590998 RH-Acked-by: Luiz Capitulino RH-Acked-by: Juan Quintela RH-Acked-by: Christoph Hellwig Signed-off-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf (cherry picked from commit 1b7bdbc13ccbec154c0ef768f70c9eb604befb8c) Conflicts: block_int.h Signed-off-by: Kevin Wolf --- block.c | 41 +++++++++++++++++++---------------------- block_int.h | 3 ++- 2 files changed, 21 insertions(+), 23 deletions(-) Signed-off-by: Eduardo Habkost --- block.c | 41 +++++++++++++++++++---------------------- block_int.h | 3 ++- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/block.c b/block.c index 03bf3f0..77ad354 100644 --- a/block.c +++ b/block.c @@ -56,7 +56,8 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, const uint8_t *buf, int nb_sectors); static BlockDriver *find_protocol(const char *filename); -static BlockDriverState *bdrv_first; +static QTAILQ_HEAD(, BlockDriverState) bdrv_states = + QTAILQ_HEAD_INITIALIZER(bdrv_states); static QLIST_HEAD(, BlockDriver) bdrv_drivers = QLIST_HEAD_INITIALIZER(bdrv_drivers); @@ -149,16 +150,12 @@ void bdrv_register(BlockDriver *bdrv) /* create a new block device (by default it is empty) */ BlockDriverState *bdrv_new(const char *device_name) { - BlockDriverState **pbs, *bs; + BlockDriverState *bs; bs = qemu_mallocz(sizeof(BlockDriverState)); pstrcpy(bs->device_name, sizeof(bs->device_name), device_name); if (device_name[0] != '\0') { - /* insert at the end */ - pbs = &bdrv_first; - while (*pbs != NULL) - pbs = &(*pbs)->next; - *pbs = bs; + QTAILQ_INSERT_TAIL(&bdrv_states, bs, list); } return bs; } @@ -617,13 +614,10 @@ void bdrv_close(BlockDriverState *bs) void bdrv_delete(BlockDriverState *bs) { - BlockDriverState **pbs; - - pbs = &bdrv_first; - while (*pbs != bs && *pbs != NULL) - pbs = &(*pbs)->next; - if (*pbs == bs) - *pbs = bs->next; + /* remove from list, if necessary */ + if (bs->device_name[0] != '\0') { + QTAILQ_REMOVE(&bdrv_states, bs, list); + } bdrv_close(bs); if (bs->file != NULL) { @@ -1242,9 +1236,10 @@ BlockDriverState *bdrv_find(const char *name) { BlockDriverState *bs; - for (bs = bdrv_first; bs != NULL; bs = bs->next) { - if (!strcmp(name, bs->device_name)) + QTAILQ_FOREACH(bs, &bdrv_states, list) { + if (!strcmp(name, bs->device_name)) { return bs; + } } return NULL; } @@ -1253,7 +1248,7 @@ void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque) { BlockDriverState *bs; - for (bs = bdrv_first; bs != NULL; bs = bs->next) { + QTAILQ_FOREACH(bs, &bdrv_states, list) { it(opaque, bs); } } @@ -1273,10 +1268,12 @@ void bdrv_flush_all(void) { BlockDriverState *bs; - for (bs = bdrv_first; bs != NULL; bs = bs->next) - if (bs->drv && !bdrv_is_read_only(bs) && - (!bdrv_is_removable(bs) || bdrv_is_inserted(bs))) + QTAILQ_FOREACH(bs, &bdrv_states, list) { + if (bs->drv && !bdrv_is_read_only(bs) && + (!bdrv_is_removable(bs) || bdrv_is_inserted(bs))) { bdrv_flush(bs); + } + } } int bdrv_has_zero_init(BlockDriverState *bs) @@ -1423,7 +1420,7 @@ void bdrv_info(Monitor *mon, QObject **ret_data) bs_list = qlist_new(); - for (bs = bdrv_first; bs != NULL; bs = bs->next) { + QTAILQ_FOREACH(bs, &bdrv_states, list) { QObject *bs_obj; const char *type = "unknown"; @@ -1528,7 +1525,7 @@ void bdrv_info_stats(Monitor *mon, QObject **ret_data) devices = qlist_new(); - for (bs = bdrv_first; bs != NULL; bs = bs->next) { + QTAILQ_FOREACH(bs, &bdrv_states, list) { obj = qobject_from_jsonf("{ 'device': %s, 'stats': {" "'rd_bytes': %" PRId64 "," "'wr_bytes': %" PRId64 "," diff --git a/block_int.h b/block_int.h index 4176e8a..a8abd7d 100644 --- a/block_int.h +++ b/block_int.h @@ -26,6 +26,7 @@ #include "block.h" #include "qemu-option.h" +#include "qemu-queue.h" #define BLOCK_FLAG_ENCRYPT 1 #define BLOCK_FLAG_COMPRESS 2 @@ -182,7 +183,7 @@ struct BlockDriverState { int type; char device_name[32]; unsigned long *dirty_bitmap; - BlockDriverState *next; + QTAILQ_ENTRY(BlockDriverState) list; void *private; }; -- 1.7.0.3