mirror of https://gitee.com/openkylin/qemu.git
tests/test-bdrv-graph-mod: add test_append_greedy_filter
bdrv_append() is not quite good for inserting filters: it does extra permission update in intermediate state, where filter get it filtered child but is not yet replace it in a backing chain. Some filters (for example backup-top) may want permissions even when have no parents. And described intermediate state becomes invalid. That's (half a) reason, why we need "inactive" state for backup-top filter. bdrv_append() will be improved later, now let's add a unit test. Now test fails, so it runs only with -d flag. To run do ./test-bdrv-graph-mod -d -p /bdrv-graph-mod/append-greedy-filter from <build-directory>/tests. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20210428151804.439460-4-vsementsov@virtuozzo.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
e6af4f0e94
commit
397f7cc0c2
|
@ -352,6 +352,37 @@ static void test_parallel_perm_update(void)
|
||||||
bdrv_unref(top);
|
bdrv_unref(top);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It's possible that filter required permissions allows to insert it to backing
|
||||||
|
* chain, like:
|
||||||
|
*
|
||||||
|
* 1. [top] -> [filter] -> [base]
|
||||||
|
*
|
||||||
|
* but doesn't allow to add it as a branch:
|
||||||
|
*
|
||||||
|
* 2. [filter] --\
|
||||||
|
* v
|
||||||
|
* [top] -> [base]
|
||||||
|
*
|
||||||
|
* So, inserting such filter should do all graph modifications and only then
|
||||||
|
* update permissions. If we try to go through intermediate state [2] and update
|
||||||
|
* permissions on it we'll fail.
|
||||||
|
*
|
||||||
|
* Let's check that bdrv_append() can append such a filter.
|
||||||
|
*/
|
||||||
|
static void test_append_greedy_filter(void)
|
||||||
|
{
|
||||||
|
BlockDriverState *top = exclusive_writer_node("top");
|
||||||
|
BlockDriverState *base = no_perm_node("base");
|
||||||
|
BlockDriverState *fl = exclusive_writer_node("fl1");
|
||||||
|
|
||||||
|
bdrv_attach_child(top, base, "backing", &child_of_bds, BDRV_CHILD_COW,
|
||||||
|
&error_abort);
|
||||||
|
|
||||||
|
bdrv_append(fl, base, &error_abort);
|
||||||
|
bdrv_unref(top);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -378,6 +409,8 @@ int main(int argc, char *argv[])
|
||||||
test_parallel_exclusive_write);
|
test_parallel_exclusive_write);
|
||||||
g_test_add_func("/bdrv-graph-mod/parallel-perm-update",
|
g_test_add_func("/bdrv-graph-mod/parallel-perm-update",
|
||||||
test_parallel_perm_update);
|
test_parallel_perm_update);
|
||||||
|
g_test_add_func("/bdrv-graph-mod/append-greedy-filter",
|
||||||
|
test_append_greedy_filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
|
Loading…
Reference in New Issue