diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ceph/messenger.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 9a29d8a4bad7..c3b9060d4844 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -166,7 +166,7 @@ static struct lock_class_key socket_class; | |||
166 | 166 | ||
167 | static void queue_con(struct ceph_connection *con); | 167 | static void queue_con(struct ceph_connection *con); |
168 | static void con_work(struct work_struct *); | 168 | static void con_work(struct work_struct *); |
169 | static void ceph_fault(struct ceph_connection *con); | 169 | static void con_fault(struct ceph_connection *con); |
170 | 170 | ||
171 | /* | 171 | /* |
172 | * Nicely render a sockaddr as a string. An array of formatted | 172 | * Nicely render a sockaddr as a string. An array of formatted |
@@ -2363,6 +2363,23 @@ static bool con_backoff(struct ceph_connection *con) | |||
2363 | return true; | 2363 | return true; |
2364 | } | 2364 | } |
2365 | 2365 | ||
2366 | /* Finish fault handling; con->mutex must *not* be held here */ | ||
2367 | |||
2368 | static void con_fault_finish(struct ceph_connection *con) | ||
2369 | { | ||
2370 | /* | ||
2371 | * in case we faulted due to authentication, invalidate our | ||
2372 | * current tickets so that we can get new ones. | ||
2373 | */ | ||
2374 | if (con->auth_retry && con->ops->invalidate_authorizer) { | ||
2375 | dout("calling invalidate_authorizer()\n"); | ||
2376 | con->ops->invalidate_authorizer(con); | ||
2377 | } | ||
2378 | |||
2379 | if (con->ops->fault) | ||
2380 | con->ops->fault(con); | ||
2381 | } | ||
2382 | |||
2366 | /* | 2383 | /* |
2367 | * Do some work on a connection. Drop a connection ref when we're done. | 2384 | * Do some work on a connection. Drop a connection ref when we're done. |
2368 | */ | 2385 | */ |
@@ -2419,7 +2436,9 @@ done_unlocked: | |||
2419 | return; | 2436 | return; |
2420 | 2437 | ||
2421 | fault: | 2438 | fault: |
2422 | ceph_fault(con); /* error/fault path */ | 2439 | con_fault(con); |
2440 | mutex_unlock(&con->mutex); | ||
2441 | con_fault_finish(con); | ||
2423 | goto done_unlocked; | 2442 | goto done_unlocked; |
2424 | } | 2443 | } |
2425 | 2444 | ||
@@ -2428,8 +2447,7 @@ fault: | |||
2428 | * Generic error/fault handler. A retry mechanism is used with | 2447 | * Generic error/fault handler. A retry mechanism is used with |
2429 | * exponential backoff | 2448 | * exponential backoff |
2430 | */ | 2449 | */ |
2431 | static void ceph_fault(struct ceph_connection *con) | 2450 | static void con_fault(struct ceph_connection *con) |
2432 | __releases(con->mutex) | ||
2433 | { | 2451 | { |
2434 | pr_warning("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | 2452 | pr_warning("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), |
2435 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); | 2453 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); |
@@ -2445,7 +2463,7 @@ static void ceph_fault(struct ceph_connection *con) | |||
2445 | if (con_flag_test(con, CON_FLAG_LOSSYTX)) { | 2463 | if (con_flag_test(con, CON_FLAG_LOSSYTX)) { |
2446 | dout("fault on LOSSYTX channel, marking CLOSED\n"); | 2464 | dout("fault on LOSSYTX channel, marking CLOSED\n"); |
2447 | con->state = CON_STATE_CLOSED; | 2465 | con->state = CON_STATE_CLOSED; |
2448 | goto out_unlock; | 2466 | return; |
2449 | } | 2467 | } |
2450 | 2468 | ||
2451 | if (con->in_msg) { | 2469 | if (con->in_msg) { |
@@ -2476,20 +2494,6 @@ static void ceph_fault(struct ceph_connection *con) | |||
2476 | con_flag_set(con, CON_FLAG_BACKOFF); | 2494 | con_flag_set(con, CON_FLAG_BACKOFF); |
2477 | queue_con(con); | 2495 | queue_con(con); |
2478 | } | 2496 | } |
2479 | |||
2480 | out_unlock: | ||
2481 | mutex_unlock(&con->mutex); | ||
2482 | /* | ||
2483 | * in case we faulted due to authentication, invalidate our | ||
2484 | * current tickets so that we can get new ones. | ||
2485 | */ | ||
2486 | if (con->auth_retry && con->ops->invalidate_authorizer) { | ||
2487 | dout("calling invalidate_authorizer()\n"); | ||
2488 | con->ops->invalidate_authorizer(con); | ||
2489 | } | ||
2490 | |||
2491 | if (con->ops->fault) | ||
2492 | con->ops->fault(con); | ||
2493 | } | 2497 | } |
2494 | 2498 | ||
2495 | 2499 | ||