Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a80ca1ae authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner
Browse files

drbd: fix a race stopping the worker thread



We may implicitly call drbd_send() from inside wait_for_work(),
via maybe_send_barrier().

If the "stop" signal was send just before that, drbd_send() would call
flush_signals(), and we would run an unbounded schedule() afterwards.

Fix: check for thread_state == RUNNING before we schedule()

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent c7a58db4
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1930,6 +1930,9 @@ static void wait_for_work(struct drbd_connection *connection, struct list_head *
		if (send_barrier)
			maybe_send_barrier(connection,
					connection->send.current_epoch_nr + 1);
		/* drbd_send() may have called flush_signals() */
		if (get_t_state(&connection->worker) != RUNNING)
			break;
		schedule();
		/* may be woken up for other things but new work, too,
		 * e.g. if the current epoch got closed.