diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-11-24 01:33:01 -0500 |
---|---|---|
committer | Yan, Zheng <zheng.z.yan@intel.com> | 2014-01-21 03:30:30 -0500 |
commit | 5d72d13c425bb41f7752962f168fb402b86b7ac0 (patch) | |
tree | ede1c4142966f8c31abf1ae96590855906527875 | |
parent | 4ee6a914edbbd2543884f0ad7d58ea471136be32 (diff) |
ceph: add open export target session helper
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
-rw-r--r-- | fs/ceph/mds_client.c | 51 | ||||
-rw-r--r-- | fs/ceph/mds_client.h | 2 |
2 files changed, 38 insertions, 15 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 7c00dd530bd1..f4f050a69a48 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -847,35 +847,56 @@ static int __open_session(struct ceph_mds_client *mdsc, | |||
847 | * | 847 | * |
848 | * called under mdsc->mutex | 848 | * called under mdsc->mutex |
849 | */ | 849 | */ |
850 | static struct ceph_mds_session * | ||
851 | __open_export_target_session(struct ceph_mds_client *mdsc, int target) | ||
852 | { | ||
853 | struct ceph_mds_session *session; | ||
854 | |||
855 | session = __ceph_lookup_mds_session(mdsc, target); | ||
856 | if (!session) { | ||
857 | session = register_session(mdsc, target); | ||
858 | if (IS_ERR(session)) | ||
859 | return session; | ||
860 | } | ||
861 | if (session->s_state == CEPH_MDS_SESSION_NEW || | ||
862 | session->s_state == CEPH_MDS_SESSION_CLOSING) | ||
863 | __open_session(mdsc, session); | ||
864 | |||
865 | return session; | ||
866 | } | ||
867 | |||
868 | struct ceph_mds_session * | ||
869 | ceph_mdsc_open_export_target_session(struct ceph_mds_client *mdsc, int target) | ||
870 | { | ||
871 | struct ceph_mds_session *session; | ||
872 | |||
873 | dout("open_export_target_session to mds%d\n", target); | ||
874 | |||
875 | mutex_lock(&mdsc->mutex); | ||
876 | session = __open_export_target_session(mdsc, target); | ||
877 | mutex_unlock(&mdsc->mutex); | ||
878 | |||
879 | return session; | ||
880 | } | ||
881 | |||
850 | static void __open_export_target_sessions(struct ceph_mds_client *mdsc, | 882 | static void __open_export_target_sessions(struct ceph_mds_client *mdsc, |
851 | struct ceph_mds_session *session) | 883 | struct ceph_mds_session *session) |
852 | { | 884 | { |
853 | struct ceph_mds_info *mi; | 885 | struct ceph_mds_info *mi; |
854 | struct ceph_mds_session *ts; | 886 | struct ceph_mds_session *ts; |
855 | int i, mds = session->s_mds; | 887 | int i, mds = session->s_mds; |
856 | int target; | ||
857 | 888 | ||
858 | if (mds >= mdsc->mdsmap->m_max_mds) | 889 | if (mds >= mdsc->mdsmap->m_max_mds) |
859 | return; | 890 | return; |
891 | |||
860 | mi = &mdsc->mdsmap->m_info[mds]; | 892 | mi = &mdsc->mdsmap->m_info[mds]; |
861 | dout("open_export_target_sessions for mds%d (%d targets)\n", | 893 | dout("open_export_target_sessions for mds%d (%d targets)\n", |
862 | session->s_mds, mi->num_export_targets); | 894 | session->s_mds, mi->num_export_targets); |
863 | 895 | ||
864 | for (i = 0; i < mi->num_export_targets; i++) { | 896 | for (i = 0; i < mi->num_export_targets; i++) { |
865 | target = mi->export_targets[i]; | 897 | ts = __open_export_target_session(mdsc, mi->export_targets[i]); |
866 | ts = __ceph_lookup_mds_session(mdsc, target); | 898 | if (!IS_ERR(ts)) |
867 | if (!ts) { | 899 | ceph_put_mds_session(ts); |
868 | ts = register_session(mdsc, target); | ||
869 | if (IS_ERR(ts)) | ||
870 | return; | ||
871 | } | ||
872 | if (session->s_state == CEPH_MDS_SESSION_NEW || | ||
873 | session->s_state == CEPH_MDS_SESSION_CLOSING) | ||
874 | __open_session(mdsc, session); | ||
875 | else | ||
876 | dout(" mds%d target mds%d %p is %s\n", session->s_mds, | ||
877 | i, ts, session_state_name(ts->s_state)); | ||
878 | ceph_put_mds_session(ts); | ||
879 | } | 900 | } |
880 | } | 901 | } |
881 | 902 | ||
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index 4c053d099ae4..68288917c737 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
@@ -383,6 +383,8 @@ extern void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session, | |||
383 | extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, | 383 | extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, |
384 | struct ceph_msg *msg); | 384 | struct ceph_msg *msg); |
385 | 385 | ||
386 | extern struct ceph_mds_session * | ||
387 | ceph_mdsc_open_export_target_session(struct ceph_mds_client *mdsc, int target); | ||
386 | extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, | 388 | extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, |
387 | struct ceph_mds_session *session); | 389 | struct ceph_mds_session *session); |
388 | 390 | ||