diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-04-19 19:10:19 +0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 19:48:59 +0400 |
commit | 44ed167da74825bfb7950d45a4f83bce3e84921c (patch) | |
tree | 5d62fe65143717ff11af26138726540b35953c89 /drivers/block/drbd/drbd_worker.c | |
parent | b032b6fa3528d6eed972db32257cb316a66e0dac (diff) | |
download | linux-44ed167da74825bfb7950d45a4f83bce3e84921c.tar.xz |
drbd: rcu_read_lock() and rcu_dereference() for tconn->net_conf
Removing the get_net_conf()/put_net_conf() calls
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 | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 02cdff2b0814..2c43cf0918c4 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -1619,10 +1619,16 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side) * detect connection loss, then waiting for a ping * response (implicit in drbd_resync_finished) reduces * the race considerably, but does not solve it. */ - if (side == C_SYNC_SOURCE) - schedule_timeout_interruptible( - mdev->tconn->net_conf->ping_int * HZ + - mdev->tconn->net_conf->ping_timeo*HZ/9); + if (side == C_SYNC_SOURCE) { + struct net_conf *nc; + int timeo; + + rcu_read_lock(); + nc = rcu_dereference(mdev->tconn->net_conf); + timeo = nc->ping_int * HZ + nc->ping_timeo * HZ / 9; + rcu_read_unlock(); + schedule_timeout_interruptible(timeo); + } drbd_resync_finished(mdev); } @@ -1645,22 +1651,30 @@ int drbd_worker(struct drbd_thread *thi) struct drbd_tconn *tconn = thi->tconn; struct drbd_work *w = NULL; struct drbd_conf *mdev; + struct net_conf *nc; LIST_HEAD(work_list); int vnr, intr = 0; + int cork; while (get_t_state(thi) == RUNNING) { drbd_thread_current_set_cpu(thi); if (down_trylock(&tconn->data.work.s)) { mutex_lock(&tconn->data.mutex); - if (tconn->data.socket && !tconn->net_conf->no_cork) + + rcu_read_lock(); + nc = rcu_dereference(tconn->net_conf); + cork = nc ? !nc->no_cork : 0; + rcu_read_unlock(); + + if (tconn->data.socket && cork) drbd_tcp_uncork(tconn->data.socket); mutex_unlock(&tconn->data.mutex); intr = down_interruptible(&tconn->data.work.s); mutex_lock(&tconn->data.mutex); - if (tconn->data.socket && !tconn->net_conf->no_cork) + if (tconn->data.socket && cork) drbd_tcp_cork(tconn->data.socket); mutex_unlock(&tconn->data.mutex); } |