Loading fs/ceph/mds_client.c +36 −15 Original line number Diff line number Diff line Loading @@ -847,34 +847,55 @@ 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)); ts = __open_export_target_session(mdsc, mi->export_targets[i]); if (!IS_ERR(ts)) ceph_put_mds_session(ts); } } Loading fs/ceph/mds_client.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
fs/ceph/mds_client.c +36 −15 Original line number Diff line number Diff line Loading @@ -847,34 +847,55 @@ 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)); ts = __open_export_target_session(mdsc, mi->export_targets[i]); if (!IS_ERR(ts)) ceph_put_mds_session(ts); } } Loading
fs/ceph/mds_client.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading