qemu/tests/unit
Vladimir Sementsov-Ogievskiy bd57f8f7f8 block: use topological sort for permission update
Rewrite bdrv_check_perm(), bdrv_abort_perm_update() and bdrv_set_perm()
to update nodes in topological sort order instead of simple DFS. With
topologically sorted nodes, we update a node only when all its parents
already updated. With DFS it's not so.

Consider the following example:

    A -+
    |  |
    |  v
    |  B
    |  |
    v  |
    C<-+

A is parent for B and C, B is parent for C.

Obviously, to update permissions, we should go in order A B C, so, when
we update C, all parent permissions already updated. But with current
approach (simple recursion) we can update in sequence A C B C (C is
updated twice). On first update of C, we consider old B permissions, so
doing wrong thing. If it succeed, all is OK, on second C update we will
finish with correct graph. But if the wrong thing failed, we break the
whole process for no reason (it's possible that updated B permission
will be less strict, but we will never check it).

Also new approach gives a way to simultaneously and correctly update
several nodes, we just need to run bdrv_topological_dfs() several times
to add all nodes and their subtrees into one topologically sorted list
(next patch will update bdrv_replace_node() in this manner).

Test test_parallel_perm_update() is now passing, so move it out of
debugging "if".

We also need to support ignore_children in
bdrv_parent_perms_conflict()

For test 283 order of conflicting parents check is changed.

Note also that in bdrv_check_perm() we don't check for parents conflict
at root bs, as we may be in the middle of permission update in
bdrv_reopen_multiple(). bdrv_reopen_multiple() will be updated soon.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20210428151804.439460-14-vsementsov@virtuozzo.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2021-04-30 12:27:48 +02:00
..
check-block-qdict.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qdict.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qjson.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qlist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qlit.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qnull.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qnum.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qobject.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qom-interface.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qom-proplist.c tests: convert check-qom-proplist to keyval 2021-03-19 10:18:17 +01:00
check-qstring.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-psk-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-psk-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-x509-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-x509-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
io-channel-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
io-channel-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
iothread.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
iothread.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
meson.build tests: Add tests for yank with the chardev-change case 2021-04-01 15:27:44 +04:00
pkix_asn1_tab.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test-stubs.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
rcutorture.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
socket-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
socket-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-aio-multithread.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-aio.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-list.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-listfile.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-pam.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-simple.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-base64.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bdrv-drain.c block: bdrv_append(): don't consume reference 2021-04-30 12:27:47 +02:00
test-bdrv-graph-mod.c block: use topological sort for permission update 2021-04-30 12:27:48 +02:00
test-bitcnt.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bitmap.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bitops.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-block-backend.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-block-iothread.c tests/unit/test-block-iothread: fix maybe-uninitialized error on GCC 11 2021-03-20 06:17:09 +01:00
test-blockjob-txn.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-blockjob.c test-blockjob: Test job_wait_unpaused() 2021-04-09 18:00:29 +02:00
test-bufferiszero.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-char.c char: Deprecate backend aliases 'tty' and 'parport' 2021-03-19 10:18:06 +01:00
test-clone-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-coroutine.c test-coroutine: Add rwlock downgrade test 2021-03-31 10:44:21 +01:00
test-crypto-afsplit.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-block.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-cipher.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-hash.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-hmac.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-ivgen.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-pbkdf.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-secret.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-tlscredsx509.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-tlssession.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-xts.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-cutils.c utils: Work around mingw strto*l bug with 0x 2021-03-24 14:25:41 +00:00
test-fdmon-epoll.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-hbitmap.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-image-locking.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-int128.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-buffer.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-command.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-file.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-socket.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-tls.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-task.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-iov.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-keyval.c * Move unit and bench tests into separate directories 2021-03-14 15:13:53 +00:00
test-logging.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-mul64.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-opts-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qapi-util.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qdev-global-props.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qdist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qemu-opts.c * Move unit and bench tests into separate directories 2021-03-14 15:13:53 +00:00
test-qga.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qgraph.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qht.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qmp-cmds.c qapi: Enforce command naming rules 2021-03-23 22:31:05 +01:00
test-qmp-event.c qapi: Enforce event naming rules 2021-03-23 22:31:05 +01:00
test-qobject-input-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qobject-output-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-list.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-simpleq.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-slist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-tailq.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-replication.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-shift128.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-string-input-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-string-output-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-thread-pool.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-throttle.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-timed-average.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-util-filemonitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-util-sockets.c test-util-sockets: Add stub for monitor_set_cur() 2021-03-19 16:05:11 +01:00
test-uuid.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-visitor-serialization.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-vmstate.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-write-threshold.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-x86-cpuid.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-xbzrle.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-yank.c tests: Add tests for yank with the chardev-change case 2021-04-01 15:27:44 +04:00