diff options
Diffstat (limited to 'net/rds/threads.c')
-rw-r--r-- | net/rds/threads.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/net/rds/threads.c b/net/rds/threads.c index f121daa402c8..eb76db1360b0 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c | |||
@@ -87,8 +87,12 @@ void rds_connect_path_complete(struct rds_conn_path *cp, int curr) | |||
87 | 87 | ||
88 | cp->cp_reconnect_jiffies = 0; | 88 | cp->cp_reconnect_jiffies = 0; |
89 | set_bit(0, &cp->cp_conn->c_map_queued); | 89 | set_bit(0, &cp->cp_conn->c_map_queued); |
90 | queue_delayed_work(rds_wq, &cp->cp_send_w, 0); | 90 | rcu_read_lock(); |
91 | queue_delayed_work(rds_wq, &cp->cp_recv_w, 0); | 91 | if (!test_bit(RDS_DESTROY_PENDING, &cp->cp_flags)) { |
92 | queue_delayed_work(rds_wq, &cp->cp_send_w, 0); | ||
93 | queue_delayed_work(rds_wq, &cp->cp_recv_w, 0); | ||
94 | } | ||
95 | rcu_read_unlock(); | ||
92 | } | 96 | } |
93 | EXPORT_SYMBOL_GPL(rds_connect_path_complete); | 97 | EXPORT_SYMBOL_GPL(rds_connect_path_complete); |
94 | 98 | ||
@@ -133,7 +137,10 @@ void rds_queue_reconnect(struct rds_conn_path *cp) | |||
133 | set_bit(RDS_RECONNECT_PENDING, &cp->cp_flags); | 137 | set_bit(RDS_RECONNECT_PENDING, &cp->cp_flags); |
134 | if (cp->cp_reconnect_jiffies == 0) { | 138 | if (cp->cp_reconnect_jiffies == 0) { |
135 | cp->cp_reconnect_jiffies = rds_sysctl_reconnect_min_jiffies; | 139 | cp->cp_reconnect_jiffies = rds_sysctl_reconnect_min_jiffies; |
136 | queue_delayed_work(rds_wq, &cp->cp_conn_w, 0); | 140 | rcu_read_lock(); |
141 | if (!test_bit(RDS_DESTROY_PENDING, &cp->cp_flags)) | ||
142 | queue_delayed_work(rds_wq, &cp->cp_conn_w, 0); | ||
143 | rcu_read_unlock(); | ||
137 | return; | 144 | return; |
138 | } | 145 | } |
139 | 146 | ||
@@ -141,8 +148,11 @@ void rds_queue_reconnect(struct rds_conn_path *cp) | |||
141 | rdsdebug("%lu delay %lu ceil conn %p for %pI4 -> %pI4\n", | 148 | rdsdebug("%lu delay %lu ceil conn %p for %pI4 -> %pI4\n", |
142 | rand % cp->cp_reconnect_jiffies, cp->cp_reconnect_jiffies, | 149 | rand % cp->cp_reconnect_jiffies, cp->cp_reconnect_jiffies, |
143 | conn, &conn->c_laddr, &conn->c_faddr); | 150 | conn, &conn->c_laddr, &conn->c_faddr); |
144 | queue_delayed_work(rds_wq, &cp->cp_conn_w, | 151 | rcu_read_lock(); |
145 | rand % cp->cp_reconnect_jiffies); | 152 | if (!test_bit(RDS_DESTROY_PENDING, &cp->cp_flags)) |
153 | queue_delayed_work(rds_wq, &cp->cp_conn_w, | ||
154 | rand % cp->cp_reconnect_jiffies); | ||
155 | rcu_read_unlock(); | ||
146 | 156 | ||
147 | cp->cp_reconnect_jiffies = min(cp->cp_reconnect_jiffies * 2, | 157 | cp->cp_reconnect_jiffies = min(cp->cp_reconnect_jiffies * 2, |
148 | rds_sysctl_reconnect_max_jiffies); | 158 | rds_sysctl_reconnect_max_jiffies); |