aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ceph/messenger.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index ed9e237d967c..9a29d8a4bad7 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2345,6 +2345,24 @@ static bool con_sock_closed(struct ceph_connection *con)
2345 return true; 2345 return true;
2346} 2346}
2347 2347
2348static bool con_backoff(struct ceph_connection *con)
2349{
2350 int ret;
2351
2352 if (!con_flag_test_and_clear(con, CON_FLAG_BACKOFF))
2353 return false;
2354
2355 ret = queue_con_delay(con, round_jiffies_relative(con->delay));
2356 if (ret) {
2357 dout("%s: con %p FAILED to back off %lu\n", __func__,
2358 con, con->delay);
2359 BUG_ON(ret == -ENOENT);
2360 con_flag_set(con, CON_FLAG_BACKOFF);
2361 }
2362
2363 return true;
2364}
2365
2348/* 2366/*
2349 * Do some work on a connection. Drop a connection ref when we're done. 2367 * Do some work on a connection. Drop a connection ref when we're done.
2350 */ 2368 */
@@ -2356,21 +2374,14 @@ static void con_work(struct work_struct *work)
2356 2374
2357 mutex_lock(&con->mutex); 2375 mutex_lock(&con->mutex);
2358restart: 2376restart:
2359 if (con_sock_closed(con)) 2377 if (con_sock_closed(con)) {
2378 dout("%s: con %p SOCK_CLOSED\n", __func__, con);
2360 goto fault; 2379 goto fault;
2361 2380 }
2362 if (con_flag_test_and_clear(con, CON_FLAG_BACKOFF)) { 2381 if (con_backoff(con)) {
2363 dout("con_work %p backing off\n", con); 2382 dout("%s: con %p BACKOFF\n", __func__, con);
2364 ret = queue_con_delay(con, round_jiffies_relative(con->delay));
2365 if (ret) {
2366 dout("con_work %p FAILED to back off %lu\n", con,
2367 con->delay);
2368 BUG_ON(ret == -ENOENT);
2369 con_flag_set(con, CON_FLAG_BACKOFF);
2370 }
2371 goto done; 2383 goto done;
2372 } 2384 }
2373
2374 if (con->state == CON_STATE_STANDBY) { 2385 if (con->state == CON_STATE_STANDBY) {
2375 dout("con_work %p STANDBY\n", con); 2386 dout("con_work %p STANDBY\n", con);
2376 goto done; 2387 goto done;
@@ -2381,7 +2392,7 @@ restart:
2381 goto done; 2392 goto done;
2382 } 2393 }
2383 if (con->state == CON_STATE_PREOPEN) { 2394 if (con->state == CON_STATE_PREOPEN) {
2384 dout("con_work OPENING\n"); 2395 dout("%s: con %p OPENING\n", __func__, con);
2385 BUG_ON(con->sock); 2396 BUG_ON(con->sock);
2386 } 2397 }
2387 2398