block: Add bs->node_name to hold the name of a bs node of the bs graph.

Add the minimum of code to prepare for the following patches.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
Reviewed-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Benoît Canet 2014-01-23 21:31:32 +01:00 committed by Kevin Wolf
parent c8059b97e1
commit dc364f4cdc
3 changed files with 52 additions and 15 deletions

57
block.c
View File

@ -90,6 +90,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
static QTAILQ_HEAD(, BlockDriverState) bdrv_states = static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
QTAILQ_HEAD_INITIALIZER(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 = static QLIST_HEAD(, BlockDriver) bdrv_drivers =
QLIST_HEAD_INITIALIZER(bdrv_drivers); QLIST_HEAD_INITIALIZER(bdrv_drivers);
@ -327,7 +330,7 @@ BlockDriverState *bdrv_new(const char *device_name)
QLIST_INIT(&bs->dirty_bitmaps); QLIST_INIT(&bs->dirty_bitmaps);
pstrcpy(bs->device_name, sizeof(bs->device_name), device_name); pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
if (device_name[0] != '\0') { if (device_name[0] != '\0') {
QTAILQ_INSERT_TAIL(&bdrv_states, bs, list); QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
} }
bdrv_iostatus_disable(bs); bdrv_iostatus_disable(bs);
notifier_list_init(&bs->close_notifiers); notifier_list_init(&bs->close_notifiers);
@ -1606,7 +1609,7 @@ void bdrv_close_all(void)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
bdrv_close(bs); bdrv_close(bs);
} }
} }
@ -1635,7 +1638,7 @@ static bool bdrv_requests_pending(BlockDriverState *bs)
static bool bdrv_requests_pending_all(void) static bool bdrv_requests_pending_all(void)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
if (bdrv_requests_pending(bs)) { if (bdrv_requests_pending(bs)) {
return true; return true;
} }
@ -1662,7 +1665,7 @@ void bdrv_drain_all(void)
BlockDriverState *bs; BlockDriverState *bs;
while (busy) { while (busy) {
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
bdrv_start_throttled_reqs(bs); bdrv_start_throttled_reqs(bs);
} }
@ -1671,14 +1674,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 */ Also, NULL terminate the device_name to prevent double remove */
void bdrv_make_anon(BlockDriverState *bs) void bdrv_make_anon(BlockDriverState *bs)
{ {
if (bs->device_name[0] != '\0') { if (bs->device_name[0] != '\0') {
QTAILQ_REMOVE(&bdrv_states, bs, list); QTAILQ_REMOVE(&bdrv_states, bs, device_list);
} }
bs->device_name[0] = '\0'; 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) static void bdrv_rebind(BlockDriverState *bs)
@ -1732,7 +1740,12 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
/* keep the same entry in bdrv_states */ /* keep the same entry in bdrv_states */
pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name), pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
bs_src->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;
} }
/* /*
@ -2057,7 +2070,7 @@ int bdrv_commit_all(void)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
if (bs->drv && bs->backing_hd) { if (bs->drv && bs->backing_hd) {
int ret = bdrv_commit(bs); int ret = bdrv_commit(bs);
if (ret < 0) { if (ret < 0) {
@ -3215,11 +3228,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 *bdrv_find(const char *name)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
if (!strcmp(name, bs->device_name)) { if (!strcmp(name, bs->device_name)) {
return bs; return bs;
} }
@ -3227,19 +3241,34 @@ BlockDriverState *bdrv_find(const char *name)
return NULL; 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) BlockDriverState *bdrv_next(BlockDriverState *bs)
{ {
if (!bs) { if (!bs) {
return QTAILQ_FIRST(&bdrv_states); 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) void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
it(opaque, bs); it(opaque, bs);
} }
} }
@ -3259,7 +3288,7 @@ int bdrv_flush_all(void)
BlockDriverState *bs; BlockDriverState *bs;
int result = 0; int result = 0;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
int ret = bdrv_flush(bs); int ret = bdrv_flush(bs);
if (ret < 0 && !result) { if (ret < 0 && !result) {
result = ret; result = ret;
@ -4383,7 +4412,7 @@ void bdrv_invalidate_cache_all(void)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
bdrv_invalidate_cache(bs); bdrv_invalidate_cache(bs);
} }
} }
@ -4392,7 +4421,7 @@ void bdrv_clear_incoming_migration_all(void)
{ {
BlockDriverState *bs; BlockDriverState *bs;
QTAILQ_FOREACH(bs, &bdrv_states, list) { QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
bs->open_flags = bs->open_flags & ~(BDRV_O_INCOMING); bs->open_flags = bs->open_flags & ~(BDRV_O_INCOMING);
} }
} }

View File

@ -378,6 +378,7 @@ void bdrv_lock_medium(BlockDriverState *bs, bool locked);
void bdrv_eject(BlockDriverState *bs, bool eject_flag); void bdrv_eject(BlockDriverState *bs, bool eject_flag);
const char *bdrv_get_format_name(BlockDriverState *bs); const char *bdrv_get_format_name(BlockDriverState *bs);
BlockDriverState *bdrv_find(const char *name); BlockDriverState *bdrv_find(const char *name);
BlockDriverState *bdrv_find_node(const char *node_name);
BlockDriverState *bdrv_next(BlockDriverState *bs); BlockDriverState *bdrv_next(BlockDriverState *bs);
void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
void *opaque); void *opaque);

View File

@ -325,11 +325,18 @@ struct BlockDriverState {
BlockdevOnError on_read_error, on_write_error; BlockdevOnError on_read_error, on_write_error;
bool iostatus_enabled; bool iostatus_enabled;
BlockDeviceIoStatus iostatus; 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]; char device_name[32];
/* element of the list of "drives" the guest sees */
QTAILQ_ENTRY(BlockDriverState) device_list;
QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps; QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps;
int refcnt; int refcnt;
int in_use; /* users other than guest access, eg. block migration */ int in_use; /* users other than guest access, eg. block migration */
QTAILQ_ENTRY(BlockDriverState) list;
QLIST_HEAD(, BdrvTrackedRequest) tracked_requests; QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;