aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/mds_client.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index d45787470fb5..972ec5ae2ac4 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1660,10 +1660,9 @@ static void __wake_requests(struct ceph_mds_client *mdsc,
1660 1660
1661/* 1661/*
1662 * Wake up threads with requests pending for @mds, so that they can 1662 * Wake up threads with requests pending for @mds, so that they can
1663 * resubmit their requests to a possibly different mds. If @all is set, 1663 * resubmit their requests to a possibly different mds.
1664 * wake up if their requests has been forwarded to @mds, too.
1665 */ 1664 */
1666static void kick_requests(struct ceph_mds_client *mdsc, int mds, int all) 1665static void kick_requests(struct ceph_mds_client *mdsc, int mds)
1667{ 1666{
1668 struct ceph_mds_request *req; 1667 struct ceph_mds_request *req;
1669 struct rb_node *p; 1668 struct rb_node *p;
@@ -2026,6 +2025,8 @@ static void handle_session(struct ceph_mds_session *session,
2026 2025
2027 switch (op) { 2026 switch (op) {
2028 case CEPH_SESSION_OPEN: 2027 case CEPH_SESSION_OPEN:
2028 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
2029 pr_info("mds%d reconnect success\n", session->s_mds);
2029 session->s_state = CEPH_MDS_SESSION_OPEN; 2030 session->s_state = CEPH_MDS_SESSION_OPEN;
2030 renewed_caps(mdsc, session, 0); 2031 renewed_caps(mdsc, session, 0);
2031 wake = 1; 2032 wake = 1;
@@ -2039,10 +2040,12 @@ static void handle_session(struct ceph_mds_session *session,
2039 break; 2040 break;
2040 2041
2041 case CEPH_SESSION_CLOSE: 2042 case CEPH_SESSION_CLOSE:
2043 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
2044 pr_info("mds%d reconnect denied\n", session->s_mds);
2042 remove_session_caps(session); 2045 remove_session_caps(session);
2043 wake = 1; /* for good measure */ 2046 wake = 1; /* for good measure */
2044 complete(&mdsc->session_close_waiters); 2047 complete(&mdsc->session_close_waiters);
2045 kick_requests(mdsc, mds, 0); /* cur only */ 2048 kick_requests(mdsc, mds);
2046 break; 2049 break;
2047 2050
2048 case CEPH_SESSION_STALE: 2051 case CEPH_SESSION_STALE:
@@ -2258,7 +2261,6 @@ send:
2258 reply->nr_pages = calc_pages_for(0, pagelist->length); 2261 reply->nr_pages = calc_pages_for(0, pagelist->length);
2259 ceph_con_send(&session->s_con, reply); 2262 ceph_con_send(&session->s_con, reply);
2260 2263
2261 session->s_state = CEPH_MDS_SESSION_OPEN;
2262 mutex_unlock(&session->s_mutex); 2264 mutex_unlock(&session->s_mutex);
2263 2265
2264 mutex_lock(&mdsc->mutex); 2266 mutex_lock(&mdsc->mutex);
@@ -2334,7 +2336,7 @@ static void check_new_map(struct ceph_mds_client *mdsc,
2334 } 2336 }
2335 2337
2336 /* kick any requests waiting on the recovering mds */ 2338 /* kick any requests waiting on the recovering mds */
2337 kick_requests(mdsc, i, 1); 2339 kick_requests(mdsc, i);
2338 } else if (oldstate == newstate) { 2340 } else if (oldstate == newstate) {
2339 continue; /* nothing new with this mds */ 2341 continue; /* nothing new with this mds */
2340 } 2342 }
@@ -2347,18 +2349,14 @@ static void check_new_map(struct ceph_mds_client *mdsc,
2347 send_mds_reconnect(mdsc, i); 2349 send_mds_reconnect(mdsc, i);
2348 2350
2349 /* 2351 /*
2350 * kick requests on any mds that has gone active. 2352 * kick request on any mds that has gone active.
2351 *
2352 * kick requests on cur or forwarder: we may have sent
2353 * the request to mds1, mds1 told us it forwarded it
2354 * to mds2, but then we learn mds1 failed and can't be
2355 * sure it successfully forwarded our request before
2356 * it died.
2357 */ 2353 */
2358 if (oldstate < CEPH_MDS_STATE_ACTIVE && 2354 if (oldstate < CEPH_MDS_STATE_ACTIVE &&
2359 newstate >= CEPH_MDS_STATE_ACTIVE) { 2355 newstate >= CEPH_MDS_STATE_ACTIVE) {
2360 pr_info("mds%d reconnect completed\n", s->s_mds); 2356 if (oldstate != CEPH_MDS_STATE_CREATING &&
2361 kick_requests(mdsc, i, 1); 2357 oldstate != CEPH_MDS_STATE_STARTING)
2358 pr_info("mds%d recovery completed\n", s->s_mds);
2359 kick_requests(mdsc, i);
2362 ceph_kick_flushing_caps(mdsc, s); 2360 ceph_kick_flushing_caps(mdsc, s);
2363 wake_up_session_caps(s, 1); 2361 wake_up_session_caps(s, 1);
2364 } 2362 }