ceph: queue MDS requests to REJECTED sessions when CLEANRECOVER is set
[linux-2.6-microblaze.git] / fs / ceph / mds_client.c
index de95e08..aab8485 100644 (file)
@@ -2818,10 +2818,6 @@ static void __do_request(struct ceph_mds_client *mdsc,
             ceph_session_state_name(session->s_state));
        if (session->s_state != CEPH_MDS_SESSION_OPEN &&
            session->s_state != CEPH_MDS_SESSION_HUNG) {
-               if (session->s_state == CEPH_MDS_SESSION_REJECTED) {
-                       err = -EACCES;
-                       goto out_session;
-               }
                /*
                 * We cannot queue async requests since the caps and delegated
                 * inodes are bound to the session. Just return -EJUKEBOX and
@@ -2831,6 +2827,20 @@ static void __do_request(struct ceph_mds_client *mdsc,
                        err = -EJUKEBOX;
                        goto out_session;
                }
+
+               /*
+                * If the session has been REJECTED, then return a hard error,
+                * unless it's a CLEANRECOVER mount, in which case we'll queue
+                * it to the mdsc queue.
+                */
+               if (session->s_state == CEPH_MDS_SESSION_REJECTED) {
+                       if (ceph_test_mount_opt(mdsc->fsc, CLEANRECOVER))
+                               list_add(&req->r_wait, &mdsc->waiting_for_map);
+                       else
+                               err = -EACCES;
+                       goto out_session;
+               }
+
                if (session->s_state == CEPH_MDS_SESSION_NEW ||
                    session->s_state == CEPH_MDS_SESSION_CLOSING) {
                        err = __open_session(mdsc, session);