summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_worker.c
diff options
context:
space:
mode:
authorPhilipp Reisner2011-05-05 16:13:10 +0200
committerPhilipp Reisner2012-11-08 16:55:48 +0100
commitc141ebda031a0550d75634f7c94f7c85c2d5c9f5 (patch)
treedd514cc2bf29f73a00e677b963950b2f349a0042 /drivers/block/drbd/drbd_worker.c
parentdrbd: Use RCU for the drbd_tconns list (diff)
downloadkernel-qcow2-linux-c141ebda031a0550d75634f7c94f7c85c2d5c9f5.tar.gz
kernel-qcow2-linux-c141ebda031a0550d75634f7c94f7c85c2d5c9f5.tar.xz
kernel-qcow2-linux-c141ebda031a0550d75634f7c94f7c85c2d5c9f5.zip
drbd: Removing drbd_cfg_rwsem
* Updates to all configuration items is done under genl_lock(). Including removal of mdevs or tconns. * All read non sleeping read sides are protected by rcu * All sleeping read sides keep reference counts to keep the objects alive Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_worker.c')
-rw-r--r--drivers/block/drbd/drbd_worker.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index 78c3de49eff6..ec8f4245ef9a 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -1774,12 +1774,16 @@ int drbd_worker(struct drbd_thread *thi)
*/
spin_unlock_irq(&tconn->data.work.q_lock);
- down_read(&drbd_cfg_rwsem);
+ rcu_read_lock();
idr_for_each_entry(&tconn->volumes, mdev, vnr) {
D_ASSERT(mdev->state.disk == D_DISKLESS && mdev->state.conn == C_STANDALONE);
+ kref_get(&mdev->kref);
+ rcu_read_unlock();
drbd_mdev_cleanup(mdev);
+ kref_put(&mdev->kref, &drbd_minor_destroy);
+ rcu_read_lock();
}
- up_read(&drbd_cfg_rwsem);
+ rcu_read_unlock();
return 0;
}