diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2014-04-28 20:43:33 +0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-04-30 23:46:56 +0400 |
commit | 02df6fe145715f1d3858c0c65aed991f148b70b4 (patch) | |
tree | 4e9e2870cd412665c58131222ad9f5572058f491 /drivers/block/drbd/drbd_nl.c | |
parent | c1b3156f121fd301191e0b4c5fa2fec42cd17871 (diff) | |
download | linux-02df6fe145715f1d3858c0c65aed991f148b70b4.tar.xz |
drbd: Test cstate while holding req_lock
In case a connection transitions into C_TIMEOUT within the timer
function (request_timer_fn()) we need to make sure that the receiver
thread (potentially running on a different CPU) sees the updated
cstate later on.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/block/drbd/drbd_nl.c')
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index b4fc401b587f..f4d3aff89aa1 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -442,12 +442,13 @@ bool conn_try_outdate_peer(struct drbd_connection *connection) char *ex_to_string; int r; + spin_lock_irq(&connection->resource->req_lock); if (connection->cstate >= C_WF_REPORT_PARAMS) { drbd_err(connection, "Expected cstate < C_WF_REPORT_PARAMS\n"); + spin_unlock_irq(&connection->resource->req_lock); return false; } - spin_lock_irq(&connection->resource->req_lock); connect_cnt = connection->connect_cnt; spin_unlock_irq(&connection->resource->req_lock); |