diff options
author | Sage Weil <sage@newdream.net> | 2010-02-25 15:38:57 -0500 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-02-25 15:38:57 -0500 |
commit | 161fd65ac934608345aed35226fc889ea3b0b500 (patch) | |
tree | 7e216c47fde0c06b0349adabe1d1363d9b71e74b | |
parent | 88d892a37fc231ab2aa3b1c40ca9d67224616594 (diff) |
ceph: invalidate_authorizer without con->mutex held
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>
-rw-r--r-- | fs/ceph/messenger.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index fdda707aa137..9ea7b763c8dc 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
@@ -1853,14 +1853,6 @@ static void ceph_fault(struct ceph_connection *con) | |||
1853 | con->in_msg = NULL; | 1853 | con->in_msg = NULL; |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | /* | ||
1857 | * in case we faulted due to authentication, invalidate our | ||
1858 | * current tickets so that we can get new ones. | ||
1859 | */ | ||
1860 | if (con->auth_retry && con->ops->invalidate_authorizer) { | ||
1861 | dout("calling invalidate_authorizer()\n"); | ||
1862 | con->ops->invalidate_authorizer(con); | ||
1863 | } | ||
1864 | 1856 | ||
1865 | /* If there are no messages in the queue, place the connection | 1857 | /* If there are no messages in the queue, place the connection |
1866 | * in a STANDBY state (i.e., don't try to reconnect just yet). */ | 1858 | * 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) | |||
1890 | out_unlock: | 1882 | out_unlock: |
1891 | mutex_unlock(&con->mutex); | 1883 | mutex_unlock(&con->mutex); |
1892 | out: | 1884 | out: |
1885 | /* | ||
1886 | * in case we faulted due to authentication, invalidate our | ||
1887 | * current tickets so that we can get new ones. | ||
1888 | */ | ||
1889 | if (con->auth_retry && con->ops->invalidate_authorizer) { | ||
1890 | dout("calling invalidate_authorizer()\n"); | ||
1891 | con->ops->invalidate_authorizer(con); | ||
1892 | } | ||
1893 | |||
1893 | if (con->ops->fault) | 1894 | if (con->ops->fault) |
1894 | con->ops->fault(con); | 1895 | con->ops->fault(con); |
1895 | } | 1896 | } |