ceph: add open export target session helper
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 24 Nov 2013 06:33:01 +0000 (14:33 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Tue, 21 Jan 2014 08:30:30 +0000 (16:30 +0800)
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index 7c00dd530bd10c8c32af855869024a97c8bae353..f4f050a69a48fff9a707c28d4a024691a5bdc814 100644 (file)
@@ -847,35 +847,56 @@ static int __open_session(struct ceph_mds_client *mdsc,
  *
  * called under mdsc->mutex
  */
+static struct ceph_mds_session *
+__open_export_target_session(struct ceph_mds_client *mdsc, int target)
+{
+       struct ceph_mds_session *session;
+
+       session = __ceph_lookup_mds_session(mdsc, target);
+       if (!session) {
+               session = register_session(mdsc, target);
+               if (IS_ERR(session))
+                       return session;
+       }
+       if (session->s_state == CEPH_MDS_SESSION_NEW ||
+           session->s_state == CEPH_MDS_SESSION_CLOSING)
+               __open_session(mdsc, session);
+
+       return session;
+}
+
+struct ceph_mds_session *
+ceph_mdsc_open_export_target_session(struct ceph_mds_client *mdsc, int target)
+{
+       struct ceph_mds_session *session;
+
+       dout("open_export_target_session to mds%d\n", target);
+
+       mutex_lock(&mdsc->mutex);
+       session = __open_export_target_session(mdsc, target);
+       mutex_unlock(&mdsc->mutex);
+
+       return session;
+}
+
 static void __open_export_target_sessions(struct ceph_mds_client *mdsc,
                                          struct ceph_mds_session *session)
 {
        struct ceph_mds_info *mi;
        struct ceph_mds_session *ts;
        int i, mds = session->s_mds;
-       int target;
 
        if (mds >= mdsc->mdsmap->m_max_mds)
                return;
+
        mi = &mdsc->mdsmap->m_info[mds];
        dout("open_export_target_sessions for mds%d (%d targets)\n",
             session->s_mds, mi->num_export_targets);
 
        for (i = 0; i < mi->num_export_targets; i++) {
-               target = mi->export_targets[i];
-               ts = __ceph_lookup_mds_session(mdsc, target);
-               if (!ts) {
-                       ts = register_session(mdsc, target);
-                       if (IS_ERR(ts))
-                               return;
-               }
-               if (session->s_state == CEPH_MDS_SESSION_NEW ||
-                   session->s_state == CEPH_MDS_SESSION_CLOSING)
-                       __open_session(mdsc, session);
-               else
-                       dout(" mds%d target mds%d %p is %s\n", session->s_mds,
-                            i, ts, session_state_name(ts->s_state));
-               ceph_put_mds_session(ts);
+               ts = __open_export_target_session(mdsc, mi->export_targets[i]);
+               if (!IS_ERR(ts))
+                       ceph_put_mds_session(ts);
        }
 }
 
index 4c053d099ae4e60400dbcbdcce21844138ba8a47..68288917c7371fbebc314a0085e691580f57a711 100644 (file)
@@ -383,6 +383,8 @@ extern void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session,
 extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc,
                                 struct ceph_msg *msg);
 
+extern struct ceph_mds_session *
+ceph_mdsc_open_export_target_session(struct ceph_mds_client *mdsc, int target);
 extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc,
                                          struct ceph_mds_session *session);