drbd: fix race when forcefully disconnecting
authorLars Ellenberg <lars.ellenberg@linbit.com>
Mon, 2 May 2011 08:45:05 +0000 (10:45 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:53:00 +0000 (16:53 +0100)
commitf3dfa40a67c354a5886c5ae53a9c5d3a2c6fd06e
treee85ab6fe143681814b395ed5ece180df8d090201
parent88104ca458dff8ed7db935936b91b9af4422c9cd
drbd: fix race when forcefully disconnecting

If a forced disconnect hits a restarting receiver right after it passed
its final "if (C_DISCONNECTING)" test in drbdd_init(), but before it was
actually restarted by drbd_thread_setup, we could be left with a
connection stuck in C_DISCONNECTING, never reaching C_STANDALONE,
which would be necessary to take it down or reconfigure it.

Move the last cleanup into w_after_conn_state_ch(), and do an additional
state change request in conn_try_disconnect(), just in case.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_nl.c
drivers/block/drbd/drbd_receiver.c
drivers/block/drbd/drbd_state.c