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:
parent
c8059b97e1
commit
dc364f4cdc
57
block.c
57
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);
|
||||
@ -1606,7 +1609,7 @@ void bdrv_close_all(void)
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
|
||||
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;
|
||||
|
||||
while (busy) {
|
||||
QTAILQ_FOREACH(bs, &bdrv_states, list) {
|
||||
QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
|
||||
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 */
|
||||
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)
|
||||
@ -1732,7 +1740,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;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2057,7 +2070,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) {
|
||||
@ -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 *bs;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
@ -3259,7 +3288,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;
|
||||
@ -4383,7 +4412,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);
|
||||
}
|
||||
}
|
||||
@ -4392,7 +4421,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);
|
||||
}
|
||||
}
|
||||
|
@ -378,6 +378,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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user