mirror: Double-check immediately before replacing
There is no guarantee that we can still replace the node we want to replace at the end of the mirror job. Double-check by calling bdrv_recurse_can_replace(). Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20200218103454.296704-12-mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
6b4907cf42
commit
6e9cc05181
|
@ -700,7 +700,19 @@ static int mirror_exit_common(Job *job)
|
||||||
* drain potential other users of the BDS before changing the graph. */
|
* drain potential other users of the BDS before changing the graph. */
|
||||||
assert(s->in_drain);
|
assert(s->in_drain);
|
||||||
bdrv_drained_begin(target_bs);
|
bdrv_drained_begin(target_bs);
|
||||||
|
/*
|
||||||
|
* Cannot use check_to_replace_node() here, because that would
|
||||||
|
* check for an op blocker on @to_replace, and we have our own
|
||||||
|
* there.
|
||||||
|
*/
|
||||||
|
if (bdrv_recurse_can_replace(src, to_replace)) {
|
||||||
bdrv_replace_node(to_replace, target_bs, &local_err);
|
bdrv_replace_node(to_replace, target_bs, &local_err);
|
||||||
|
} else {
|
||||||
|
error_setg(&local_err, "Can no longer replace '%s' by '%s', "
|
||||||
|
"because it can no longer be guaranteed that doing so "
|
||||||
|
"would not lead to an abrupt change of visible data",
|
||||||
|
to_replace->node_name, target_bs->node_name);
|
||||||
|
}
|
||||||
bdrv_drained_end(target_bs);
|
bdrv_drained_end(target_bs);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_report_err(local_err);
|
error_report_err(local_err);
|
||||||
|
|
Loading…
Reference in New Issue