OSDN Git Service

mirror: Don't let an operation wait for itself
authorKevin Wolf <kwolf@redhat.com>
Tue, 28 Jan 2020 15:09:28 +0000 (16:09 +0100)
committerKevin Wolf <kwolf@redhat.com>
Tue, 18 Feb 2020 09:53:56 +0000 (10:53 +0100)
commit7e6c4ff792734e196c8ca82564c56b5e7c6288ca
treea63eacfc9babc8c12024460cd035f1d15c61466b
parenteed325b92c3e68417121ea23f96e33af6a4654ed
mirror: Don't let an operation wait for itself

mirror_wait_for_free_in_flight_slot() just picks a random operation to
wait for. However, when mirror_co_read() waits for free slots, its
MirrorOp is already in s->ops_in_flight, so if not enough slots are
immediately available, an operation can end up waiting for itself to
complete, which results in a hang.

Fix this by passing the current MirrorOp and skipping this operation
when picking an operation to wait for.

Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1794692
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
block/mirror.c