diff options
Diffstat (limited to 'fs/ceph/mds_client.c')
| -rw-r--r-- | fs/ceph/mds_client.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 60a9a4ae47be..24561a557e01 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -736,9 +736,10 @@ static void cleanup_cap_releases(struct ceph_mds_session *session) | |||
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | /* | 738 | /* |
| 739 | * Helper to safely iterate over all caps associated with a session. | 739 | * Helper to safely iterate over all caps associated with a session, with |
| 740 | * special care taken to handle a racing __ceph_remove_cap(). | ||
| 740 | * | 741 | * |
| 741 | * caller must hold session s_mutex | 742 | * Caller must hold session s_mutex. |
| 742 | */ | 743 | */ |
| 743 | static int iterate_session_caps(struct ceph_mds_session *session, | 744 | static int iterate_session_caps(struct ceph_mds_session *session, |
| 744 | int (*cb)(struct inode *, struct ceph_cap *, | 745 | int (*cb)(struct inode *, struct ceph_cap *, |
| @@ -2136,7 +2137,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) | |||
| 2136 | struct ceph_mds_session *session = NULL; | 2137 | struct ceph_mds_session *session = NULL; |
| 2137 | struct ceph_msg *reply; | 2138 | struct ceph_msg *reply; |
| 2138 | struct rb_node *p; | 2139 | struct rb_node *p; |
| 2139 | int err; | 2140 | int err = -ENOMEM; |
| 2140 | struct ceph_pagelist *pagelist; | 2141 | struct ceph_pagelist *pagelist; |
| 2141 | 2142 | ||
| 2142 | pr_info("reconnect to recovering mds%d\n", mds); | 2143 | pr_info("reconnect to recovering mds%d\n", mds); |
| @@ -2185,7 +2186,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) | |||
| 2185 | goto fail; | 2186 | goto fail; |
| 2186 | err = iterate_session_caps(session, encode_caps_cb, pagelist); | 2187 | err = iterate_session_caps(session, encode_caps_cb, pagelist); |
| 2187 | if (err < 0) | 2188 | if (err < 0) |
| 2188 | goto out; | 2189 | goto fail; |
| 2189 | 2190 | ||
| 2190 | /* | 2191 | /* |
| 2191 | * snaprealms. we provide mds with the ino, seq (version), and | 2192 | * snaprealms. we provide mds with the ino, seq (version), and |
| @@ -2213,28 +2214,31 @@ send: | |||
| 2213 | reply->nr_pages = calc_pages_for(0, pagelist->length); | 2214 | reply->nr_pages = calc_pages_for(0, pagelist->length); |
| 2214 | ceph_con_send(&session->s_con, reply); | 2215 | ceph_con_send(&session->s_con, reply); |
| 2215 | 2216 | ||
| 2216 | if (session) { | 2217 | session->s_state = CEPH_MDS_SESSION_OPEN; |
| 2217 | session->s_state = CEPH_MDS_SESSION_OPEN; | 2218 | mutex_unlock(&session->s_mutex); |
| 2218 | __wake_requests(mdsc, &session->s_waiting); | 2219 | |
| 2219 | } | 2220 | mutex_lock(&mdsc->mutex); |
| 2221 | __wake_requests(mdsc, &session->s_waiting); | ||
| 2222 | mutex_unlock(&mdsc->mutex); | ||
| 2223 | |||
| 2224 | ceph_put_mds_session(session); | ||
| 2220 | 2225 | ||
| 2221 | out: | ||
| 2222 | up_read(&mdsc->snap_rwsem); | 2226 | up_read(&mdsc->snap_rwsem); |
| 2223 | if (session) { | ||
| 2224 | mutex_unlock(&session->s_mutex); | ||
| 2225 | ceph_put_mds_session(session); | ||
| 2226 | } | ||
| 2227 | mutex_lock(&mdsc->mutex); | 2227 | mutex_lock(&mdsc->mutex); |
| 2228 | return; | 2228 | return; |
| 2229 | 2229 | ||
| 2230 | fail: | 2230 | fail: |
| 2231 | ceph_msg_put(reply); | 2231 | ceph_msg_put(reply); |
| 2232 | up_read(&mdsc->snap_rwsem); | ||
| 2233 | mutex_unlock(&session->s_mutex); | ||
| 2234 | ceph_put_mds_session(session); | ||
| 2232 | fail_nomsg: | 2235 | fail_nomsg: |
| 2233 | ceph_pagelist_release(pagelist); | 2236 | ceph_pagelist_release(pagelist); |
| 2234 | kfree(pagelist); | 2237 | kfree(pagelist); |
| 2235 | fail_nopagelist: | 2238 | fail_nopagelist: |
| 2236 | pr_err("ENOMEM preparing reconnect for mds%d\n", mds); | 2239 | pr_err("error %d preparing reconnect for mds%d\n", err, mds); |
| 2237 | goto out; | 2240 | mutex_lock(&mdsc->mutex); |
| 2241 | return; | ||
| 2238 | } | 2242 | } |
| 2239 | 2243 | ||
| 2240 | 2244 | ||
