block: remove bs from lists before closing
Close involves flush that can be performed asynchronously and bs must be protected from being referenced before it is deleted. Signed-off-by: Anton Kuchin <antonkuchin@yandex-team.ru> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
efb4f3b62c
commit
30c321f97f
4
block.c
4
block.c
@ -4082,14 +4082,14 @@ static void bdrv_delete(BlockDriverState *bs)
|
|||||||
assert(bdrv_op_blocker_is_empty(bs));
|
assert(bdrv_op_blocker_is_empty(bs));
|
||||||
assert(!bs->refcnt);
|
assert(!bs->refcnt);
|
||||||
|
|
||||||
bdrv_close(bs);
|
|
||||||
|
|
||||||
/* remove from list, if necessary */
|
/* remove from list, if necessary */
|
||||||
if (bs->node_name[0] != '\0') {
|
if (bs->node_name[0] != '\0') {
|
||||||
QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
|
QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
|
||||||
}
|
}
|
||||||
QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
|
QTAILQ_REMOVE(&all_bdrv_states, bs, bs_list);
|
||||||
|
|
||||||
|
bdrv_close(bs);
|
||||||
|
|
||||||
g_free(bs);
|
g_free(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user