diff options
| -rw-r--r-- | net/ceph/messenger.c | 37 |
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 | ||
| 2348 | static 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); |
| 2358 | restart: | 2376 | restart: |
| 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 | ||
