diff options
author | Philipp Reisner | 2011-05-05 16:13:10 +0200 |
---|---|---|
committer | Philipp Reisner | 2012-11-08 16:55:48 +0100 |
commit | c141ebda031a0550d75634f7c94f7c85c2d5c9f5 (patch) | |
tree | dd514cc2bf29f73a00e677b963950b2f349a0042 /drivers/block/drbd/drbd_worker.c | |
parent | drbd: Use RCU for the drbd_tconns list (diff) | |
download | kernel-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.c | 8 |
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; } |