From 7f48035f28ed320ae5d48f119a0e32f5c5eeb4e5 Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Thu, 22 Nov 2012 17:06:00 +0100 Subject: [PATCH] --- yaml --- r: 346295 b: refs/heads/master c: 13c76aba7846647f86d479293ae0a0adc1ca840a h: refs/heads/master i: 346293: dbcf24b5940b76891210f372f4146216f171280b 346291: 2a07ef7d11dc8479b5c103fe97545aa7503c792f 346287: 6bfadaebe3c7713e353010075b58704255dd188c v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_receiver.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5f636a3f49a4..c689a283423a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 691631c0652bc47e6d20b0d981e23a9025fd794e +refs/heads/master: 13c76aba7846647f86d479293ae0a0adc1ca840a diff --git a/trunk/drivers/block/drbd/drbd_receiver.c b/trunk/drivers/block/drbd/drbd_receiver.c index 1599a1a6f1f7..a9eccfc6079b 100644 --- a/trunk/drivers/block/drbd/drbd_receiver.c +++ b/trunk/drivers/block/drbd/drbd_receiver.c @@ -1037,6 +1037,16 @@ static int conn_connect(struct drbd_tconn *tconn) rcu_read_lock(); idr_for_each_entry(&tconn->volumes, mdev, vnr) { kref_get(&mdev->kref); + /* Prevent a race between resync-handshake and + * being promoted to Primary. + * + * Grab and release the state mutex, so we know that any current + * drbd_set_role() is finished, and any incoming drbd_set_role + * will see the STATE_SENT flag, and wait for it to be cleared. + */ + mutex_lock(mdev->state_mutex); + mutex_unlock(mdev->state_mutex); + rcu_read_unlock(); if (discard_my_data)