ceph: close stopped mds' session
authorYan, Zheng <zyan@redhat.com>
Tue, 28 Mar 2017 09:56:29 +0000 (17:56 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 4 May 2017 07:19:20 +0000 (09:19 +0200)
If a mds has stopped, close its session and clean up its session
requests/caps. The process is similar to handling SESSION_CLOSE
initiated by mds.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/mds_client.c

index 3bdff7ae7bfd2b7ce03a8c8402b100e0998316cb..a22688873ec3e64668fe63709e44f34ad9d44cff 100644 (file)
@@ -3136,6 +3136,22 @@ static void check_new_map(struct ceph_mds_client *mdsc,
                                __unregister_session(mdsc, s);
                                __wake_requests(mdsc, &s->s_waiting);
                                ceph_put_mds_session(s);
+                       } else if (i >= newmap->m_num_mds) {
+                               /* force close session for stopped mds */
+                               get_session(s);
+                               __unregister_session(mdsc, s);
+                               __wake_requests(mdsc, &s->s_waiting);
+                               kick_requests(mdsc, i);
+                               mutex_unlock(&mdsc->mutex);
+
+                               mutex_lock(&s->s_mutex);
+                               cleanup_session_requests(mdsc, s);
+                               remove_session_caps(s);
+                               mutex_unlock(&s->s_mutex);
+
+                               ceph_put_mds_session(s);
+
+                               mutex_lock(&mdsc->mutex);
                        } else {
                                /* just close it */
                                mutex_unlock(&mdsc->mutex);