OSDN Git Service

block: Don't notify parents in drain call chain
authorKevin Wolf <kwolf@redhat.com>
Thu, 7 Dec 2017 12:03:13 +0000 (13:03 +0100)
committerKevin Wolf <kwolf@redhat.com>
Fri, 22 Dec 2017 14:05:32 +0000 (15:05 +0100)
commit0152bf400fe3ca7facb382683bfcccda70ebf51a
tree3070ead9a8a8785dd3ddd726046c60e95c678185
parent6c429a6a97d183aeb2c00f8680aaf3d9e900359d
block: Don't notify parents in drain call chain

This is in preparation for subtree drains, i.e. drained sections that
affect not only a single node, but recursively all child nodes, too.

Calling the parent callbacks for drain is pointless when we just came
from that parent node recursively and leads to multiple increases of
bs->quiesce_counter in a single drain call. Don't do it.

In order for this to work correctly, the parent callback must be called
for every bdrv_drain_begin/end() call, not only for the outermost one:

If we have a node N with two parents A and B, recursive draining of A
should cause the quiesce_counter of B to increase because its child N is
drained independently of B. If now B is recursively drained, too, A must
increase its quiesce_counter because N is drained independently of A
only now, even if N is going from quiesce_counter 1 to 2.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block.c
block/io.c
include/block/block.h