ceph: invalidate_authorizer without con->mutex held
authorSage Weil <sage@newdream.net>
Thu, 25 Feb 2010 20:38:57 +0000 (12:38 -0800)
committerSage Weil <sage@newdream.net>
Thu, 25 Feb 2010 20:38:57 +0000 (12:38 -0800)
This fixes lock ABBA inversion, as the ->invalidate_authorizer()
op may need to take a lock (or even call back into the
messenger).

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/messenger.c

index fdda707aa1376831ad060505880c93745adbdfc5..9ea7b763c8dce3346ec530b1f726c1c5d1b63e74 100644 (file)
@@ -1853,14 +1853,6 @@ static void ceph_fault(struct ceph_connection *con)
                con->in_msg = NULL;
        }
 
-       /*
-        * 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 there are no messages in the queue, place the connection
         * in a STANDBY state (i.e., don't try to reconnect just yet). */
@@ -1890,6 +1882,15 @@ static void ceph_fault(struct ceph_connection *con)
 out_unlock:
        mutex_unlock(&con->mutex);
 out:
+       /*
+        * 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);
 }