Am 03.07.2019 um 19:28 hat Max Reitz geschrieben: > Currently, bdrv_replace_child_noperm() undrains the parent until it is > completely undrained, then re-drains it after attaching the new child > node. > > This is a problem with bdrv_drop_intermediate(): We want to keep the > whole subtree drained, including parents, while the operation is > under way. bdrv_replace_child_noperm() breaks this by allowing every > parent to become unquiesced briefly, and then redraining it. > > In fact, there is no reason why the parent should become unquiesced and > be allowed to submit requests to the new child node if that new node is > supposed to be kept drained. So if anything, we have to drain the > parent before detaching the old child node. Conversely, we have to > undrain it only after attaching the new child node. > > Thus, change the whole drain algorithm here: Calculate the number of > times we have to drain/undrain the parent before replacing the child > node then drain it (if necessary), replace the child node, and then > undrain it. > > Signed-off-by: Max Reitz <mre...@redhat.com>
I think this looks good (and fixes a bug that Denis Plotnikov reported before while trying to fix IDE submitting requests in a drained section), but I would be even more confident if we could add tests for the various cases to tests/test-bdrv-drain.c. Kevin