|
@@ -166,7 +166,7 @@ static struct lock_class_key socket_class;
|
|
|
|
|
|
static void queue_con(struct ceph_connection *con);
|
|
|
static void con_work(struct work_struct *);
|
|
|
-static void ceph_fault(struct ceph_connection *con);
|
|
|
+static void con_fault(struct ceph_connection *con);
|
|
|
|
|
|
/*
|
|
|
* Nicely render a sockaddr as a string. An array of formatted
|
|
@@ -2363,6 +2363,23 @@ static bool con_backoff(struct ceph_connection *con)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+/* Finish fault handling; con->mutex must *not* be held here */
|
|
|
+
|
|
|
+static void con_fault_finish(struct ceph_connection *con)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * in case we faulted due to authentication, invalidate our
|
|
|
+ * current tickets so that we can get new ones.
|
|
|
+ */
|
|
|
+ if (con->auth_retry && con->ops->invalidate_authorizer) {
|
|
|
+ dout("calling invalidate_authorizer()\n");
|
|
|
+ con->ops->invalidate_authorizer(con);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (con->ops->fault)
|
|
|
+ con->ops->fault(con);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Do some work on a connection. Drop a connection ref when we're done.
|
|
|
*/
|
|
@@ -2419,7 +2436,9 @@ done_unlocked:
|
|
|
return;
|
|
|
|
|
|
fault:
|
|
|
- ceph_fault(con); /* error/fault path */
|
|
|
+ con_fault(con);
|
|
|
+ mutex_unlock(&con->mutex);
|
|
|
+ con_fault_finish(con);
|
|
|
goto done_unlocked;
|
|
|
}
|
|
|
|
|
@@ -2428,8 +2447,7 @@ fault:
|
|
|
* Generic error/fault handler. A retry mechanism is used with
|
|
|
* exponential backoff
|
|
|
*/
|
|
|
-static void ceph_fault(struct ceph_connection *con)
|
|
|
- __releases(con->mutex)
|
|
|
+static void con_fault(struct ceph_connection *con)
|
|
|
{
|
|
|
pr_warning("%s%lld %s %s\n", ENTITY_NAME(con->peer_name),
|
|
|
ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg);
|
|
@@ -2445,7 +2463,7 @@ static void ceph_fault(struct ceph_connection *con)
|
|
|
if (con_flag_test(con, CON_FLAG_LOSSYTX)) {
|
|
|
dout("fault on LOSSYTX channel, marking CLOSED\n");
|
|
|
con->state = CON_STATE_CLOSED;
|
|
|
- goto out_unlock;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
if (con->in_msg) {
|
|
@@ -2476,20 +2494,6 @@ static void ceph_fault(struct ceph_connection *con)
|
|
|
con_flag_set(con, CON_FLAG_BACKOFF);
|
|
|
queue_con(con);
|
|
|
}
|
|
|
-
|
|
|
-out_unlock:
|
|
|
- mutex_unlock(&con->mutex);
|
|
|
- /*
|
|
|
- * in case we faulted due to authentication, invalidate our
|
|
|
- * current tickets so that we can get new ones.
|
|
|
- */
|
|
|
- if (con->auth_retry && con->ops->invalidate_authorizer) {
|
|
|
- dout("calling invalidate_authorizer()\n");
|
|
|
- con->ops->invalidate_authorizer(con);
|
|
|
- }
|
|
|
-
|
|
|
- if (con->ops->fault)
|
|
|
- con->ops->fault(con);
|
|
|
}
|
|
|
|
|
|
|