Lines Matching refs:session
53 struct ceph_mds_session *session; member
1126 mds = cap->session->s_mds; in __choose_mds()
1353 struct ceph_mds_session *session) in __open_session() argument
1357 int mds = session->s_mds; in __open_session()
1363 session->s_state = CEPH_MDS_SESSION_OPENING; in __open_session()
1364 session->s_renew_requested = jiffies; in __open_session()
1367 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
1370 ceph_con_send(&session->s_con, msg); in __open_session()
1382 struct ceph_mds_session *session; in __open_export_target_session() local
1385 session = __ceph_lookup_mds_session(mdsc, target); in __open_export_target_session()
1386 if (!session) { in __open_export_target_session()
1387 session = register_session(mdsc, target); in __open_export_target_session()
1388 if (IS_ERR(session)) in __open_export_target_session()
1389 return session; in __open_export_target_session()
1391 if (session->s_state == CEPH_MDS_SESSION_NEW || in __open_export_target_session()
1392 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __open_export_target_session()
1393 ret = __open_session(mdsc, session); in __open_export_target_session()
1398 return session; in __open_export_target_session()
1404 struct ceph_mds_session *session; in ceph_mdsc_open_export_target_session() local
1409 session = __open_export_target_session(mdsc, target); in ceph_mdsc_open_export_target_session()
1412 return session; in ceph_mdsc_open_export_target_session()
1416 struct ceph_mds_session *session) in __open_export_target_sessions() argument
1420 int i, mds = session->s_mds; in __open_export_target_sessions()
1427 session->s_mds, mi->num_export_targets); in __open_export_target_sessions()
1437 struct ceph_mds_session *session) in ceph_mdsc_open_export_target_sessions() argument
1440 __open_export_target_sessions(mdsc, session); in ceph_mdsc_open_export_target_sessions()
1448 static void detach_cap_releases(struct ceph_mds_session *session, in detach_cap_releases() argument
1451 lockdep_assert_held(&session->s_cap_lock); in detach_cap_releases()
1453 list_splice_init(&session->s_cap_releases, target); in detach_cap_releases()
1454 session->s_num_cap_releases = 0; in detach_cap_releases()
1455 dout("dispose_cap_releases mds%d\n", session->s_mds); in detach_cap_releases()
1471 struct ceph_mds_session *session) in cleanup_session_requests() argument
1477 dout("cleanup_session_requests mds%d\n", session->s_mds); in cleanup_session_requests()
1479 while (!list_empty(&session->s_unsafe)) { in cleanup_session_requests()
1480 req = list_first_entry(&session->s_unsafe, in cleanup_session_requests()
1502 req->r_session->s_mds == session->s_mds) in cleanup_session_requests()
1514 int ceph_iterate_session_caps(struct ceph_mds_session *session, in ceph_iterate_session_caps() argument
1524 dout("iterate_session_caps %p mds%d\n", session, session->s_mds); in ceph_iterate_session_caps()
1525 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1526 p = session->s_caps.next; in ceph_iterate_session_caps()
1527 while (p != &session->s_caps) { in ceph_iterate_session_caps()
1534 session->s_cap_iterator = cap; in ceph_iterate_session_caps()
1535 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1544 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1551 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1556 BUG_ON(cap->session != session); in ceph_iterate_session_caps()
1557 cap->session = NULL; in ceph_iterate_session_caps()
1559 session->s_nr_caps--; in ceph_iterate_session_caps()
1560 atomic64_dec(&session->s_mdsc->metric.total_caps); in ceph_iterate_session_caps()
1562 __ceph_queue_cap_release(session, cap); in ceph_iterate_session_caps()
1571 session->s_cap_iterator = NULL; in ceph_iterate_session_caps()
1572 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1576 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1681 static void remove_session_caps(struct ceph_mds_session *session) in remove_session_caps() argument
1683 struct ceph_fs_client *fsc = session->s_mdsc->fsc; in remove_session_caps()
1687 dout("remove_session_caps on %p\n", session); in remove_session_caps()
1688 ceph_iterate_session_caps(session, remove_session_caps_cb, fsc); in remove_session_caps()
1692 spin_lock(&session->s_cap_lock); in remove_session_caps()
1693 if (session->s_nr_caps > 0) { in remove_session_caps()
1704 while (!list_empty(&session->s_caps)) { in remove_session_caps()
1705 cap = list_entry(session->s_caps.next, in remove_session_caps()
1711 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1717 spin_lock(&session->s_cap_lock); in remove_session_caps()
1722 detach_cap_releases(session, &dispose); in remove_session_caps()
1724 BUG_ON(session->s_nr_caps > 0); in remove_session_caps()
1725 BUG_ON(!list_empty(&session->s_cap_flushing)); in remove_session_caps()
1726 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1727 dispose_cap_releases(session->s_mdsc, &dispose); in remove_session_caps()
1754 if (cap->cap_gen < cap->session->s_cap_gen) { in wake_up_session_cb()
1766 static void wake_up_session_caps(struct ceph_mds_session *session, int ev) in wake_up_session_caps() argument
1768 dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); in wake_up_session_caps()
1769 ceph_iterate_session_caps(session, wake_up_session_cb, in wake_up_session_caps()
1780 struct ceph_mds_session *session) in send_renew_caps() argument
1785 if (time_after_eq(jiffies, session->s_cap_ttl) && in send_renew_caps()
1786 time_after_eq(session->s_cap_ttl, session->s_renew_requested)) in send_renew_caps()
1787 pr_info("mds%d caps stale\n", session->s_mds); in send_renew_caps()
1788 session->s_renew_requested = jiffies; in send_renew_caps()
1792 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1795 session->s_mds, ceph_mds_state_name(state)); in send_renew_caps()
1799 dout("send_renew_caps to mds%d (%s)\n", session->s_mds, in send_renew_caps()
1802 ++session->s_renew_seq); in send_renew_caps()
1805 ceph_con_send(&session->s_con, msg); in send_renew_caps()
1810 struct ceph_mds_session *session, u64 seq) in send_flushmsg_ack() argument
1815 session->s_mds, ceph_session_state_name(session->s_state), seq); in send_flushmsg_ack()
1819 ceph_con_send(&session->s_con, msg); in send_flushmsg_ack()
1830 struct ceph_mds_session *session, int is_renew) in renewed_caps() argument
1835 spin_lock(&session->s_cap_lock); in renewed_caps()
1836 was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl); in renewed_caps()
1838 session->s_cap_ttl = session->s_renew_requested + in renewed_caps()
1842 if (time_before(jiffies, session->s_cap_ttl)) { in renewed_caps()
1843 pr_info("mds%d caps renewed\n", session->s_mds); in renewed_caps()
1846 pr_info("mds%d caps still stale\n", session->s_mds); in renewed_caps()
1850 session->s_mds, session->s_cap_ttl, was_stale ? "stale" : "fresh", in renewed_caps()
1851 time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh"); in renewed_caps()
1852 spin_unlock(&session->s_cap_lock); in renewed_caps()
1855 wake_up_session_caps(session, RENEWCAPS); in renewed_caps()
1861 static int request_close_session(struct ceph_mds_session *session) in request_close_session() argument
1866 session->s_mds, ceph_session_state_name(session->s_state), in request_close_session()
1867 session->s_seq); in request_close_session()
1868 msg = create_session_msg(CEPH_SESSION_REQUEST_CLOSE, session->s_seq); in request_close_session()
1871 ceph_con_send(&session->s_con, msg); in request_close_session()
1879 struct ceph_mds_session *session) in __close_session() argument
1881 if (session->s_state >= CEPH_MDS_SESSION_CLOSING) in __close_session()
1883 session->s_state = CEPH_MDS_SESSION_CLOSING; in __close_session()
1884 return request_close_session(session); in __close_session()
1994 struct ceph_mds_session *session, in ceph_trim_caps() argument
1997 int trim_caps = session->s_nr_caps - max_caps; in ceph_trim_caps()
2000 session->s_mds, session->s_nr_caps, max_caps, trim_caps); in ceph_trim_caps()
2004 ceph_iterate_session_caps(session, trim_caps_cb, &remaining); in ceph_trim_caps()
2006 session->s_mds, session->s_nr_caps, max_caps, in ceph_trim_caps()
2010 ceph_flush_cap_releases(mdsc, session); in ceph_trim_caps()
2054 struct ceph_mds_session *session) in ceph_send_cap_releases() argument
2069 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2071 list_splice_init(&session->s_cap_releases, &tmp_list); in ceph_send_cap_releases()
2072 num_cap_releases = session->s_num_cap_releases; in ceph_send_cap_releases()
2073 session->s_num_cap_releases = 0; in ceph_send_cap_releases()
2074 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2114 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2115 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2122 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2123 if (!list_empty(&session->s_cap_releases)) in ceph_send_cap_releases()
2125 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2134 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2135 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2140 session->s_mds); in ceph_send_cap_releases()
2141 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2142 list_splice(&tmp_list, &session->s_cap_releases); in ceph_send_cap_releases()
2143 session->s_num_cap_releases += num_cap_releases; in ceph_send_cap_releases()
2144 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2149 struct ceph_mds_session *session = in ceph_cap_release_work() local
2152 mutex_lock(&session->s_mutex); in ceph_cap_release_work()
2153 if (session->s_state == CEPH_MDS_SESSION_OPEN || in ceph_cap_release_work()
2154 session->s_state == CEPH_MDS_SESSION_HUNG) in ceph_cap_release_work()
2155 ceph_send_cap_releases(session->s_mdsc, session); in ceph_cap_release_work()
2156 mutex_unlock(&session->s_mutex); in ceph_cap_release_work()
2157 ceph_put_mds_session(session); in ceph_cap_release_work()
2161 struct ceph_mds_session *session) in ceph_flush_cap_releases() argument
2166 ceph_get_mds_session(session); in ceph_flush_cap_releases()
2168 &session->s_cap_release_work)) { in ceph_flush_cap_releases()
2171 ceph_put_mds_session(session); in ceph_flush_cap_releases()
2179 void __ceph_queue_cap_release(struct ceph_mds_session *session, in __ceph_queue_cap_release() argument
2182 list_add_tail(&cap->session_caps, &session->s_cap_releases); in __ceph_queue_cap_release()
2183 session->s_num_cap_releases++; in __ceph_queue_cap_release()
2185 if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE)) in __ceph_queue_cap_release()
2186 ceph_flush_cap_releases(session->s_mdsc, session); in __ceph_queue_cap_release()
2729 struct ceph_mds_session *session, in __send_request() argument
2735 err = __prepare_send_request(mdsc, req, session->s_mds, in __send_request()
2739 ceph_con_send(&session->s_con, req->r_request); in __send_request()
2751 struct ceph_mds_session *session = NULL; in __do_request() local
2807 session = __ceph_lookup_mds_session(mdsc, mds); in __do_request()
2808 if (!session) { in __do_request()
2809 session = register_session(mdsc, mds); in __do_request()
2810 if (IS_ERR(session)) { in __do_request()
2811 err = PTR_ERR(session); in __do_request()
2815 req->r_session = ceph_get_mds_session(session); in __do_request()
2817 dout("do_request mds%d session %p state %s\n", mds, session, in __do_request()
2818 ceph_session_state_name(session->s_state)); in __do_request()
2819 if (session->s_state != CEPH_MDS_SESSION_OPEN && in __do_request()
2820 session->s_state != CEPH_MDS_SESSION_HUNG) { in __do_request()
2821 if (session->s_state == CEPH_MDS_SESSION_REJECTED) { in __do_request()
2834 if (session->s_state == CEPH_MDS_SESSION_NEW || in __do_request()
2835 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __do_request()
2836 err = __open_session(mdsc, session); in __do_request()
2843 list_add(&req->r_wait, &session->s_waiting); in __do_request()
2853 err = __send_request(mdsc, session, req, false); in __do_request()
2856 ceph_put_mds_session(session); in __do_request()
3059 static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) in handle_reply() argument
3061 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply()
3068 int mds = session->s_mds; in handle_reply()
3088 if (req->r_session != session) { in handle_reply()
3090 " not mds%d\n", tid, session->s_mds, in handle_reply()
3170 if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features)) in handle_reply()
3171 err = parse_reply_info(session, msg, rinfo, (u64)-1); in handle_reply()
3173 err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features); in handle_reply()
3176 mutex_lock(&session->s_mutex); in handle_reply()
3239 mutex_unlock(&session->s_mutex); in handle_reply()
3257 struct ceph_mds_session *session, in handle_forward() argument
3336 static void handle_session(struct ceph_mds_session *session, in handle_session() argument
3339 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session()
3340 int mds = session->s_mds; in handle_session()
3373 ceph_get_mds_session(session); in handle_session()
3374 __unregister_session(mdsc, session); in handle_session()
3377 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
3380 mutex_lock(&session->s_mutex); in handle_session()
3383 mds, ceph_session_op_name(op), session, in handle_session()
3384 ceph_session_state_name(session->s_state), seq); in handle_session()
3386 if (session->s_state == CEPH_MDS_SESSION_HUNG) { in handle_session()
3387 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3388 pr_info("mds%d came back\n", session->s_mds); in handle_session()
3393 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3394 pr_info("mds%d reconnect success\n", session->s_mds); in handle_session()
3395 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3396 session->s_features = features; in handle_session()
3397 renewed_caps(mdsc, session, 0); in handle_session()
3398 if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features)) in handle_session()
3402 __close_session(mdsc, session); in handle_session()
3406 if (session->s_renew_seq == seq) in handle_session()
3407 renewed_caps(mdsc, session, 1); in handle_session()
3411 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3412 pr_info("mds%d reconnect denied\n", session->s_mds); in handle_session()
3413 session->s_state = CEPH_MDS_SESSION_CLOSED; in handle_session()
3414 cleanup_session_requests(mdsc, session); in handle_session()
3415 remove_session_caps(session); in handle_session()
3422 session->s_mds); in handle_session()
3423 spin_lock(&session->s_gen_ttl_lock); in handle_session()
3424 session->s_cap_gen++; in handle_session()
3425 session->s_cap_ttl = jiffies - 1; in handle_session()
3426 spin_unlock(&session->s_gen_ttl_lock); in handle_session()
3427 send_renew_caps(mdsc, session); in handle_session()
3431 ceph_trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
3435 send_flushmsg_ack(mdsc, session, seq); in handle_session()
3439 dout("force_session_readonly %p\n", session); in handle_session()
3440 spin_lock(&session->s_cap_lock); in handle_session()
3441 session->s_readonly = true; in handle_session()
3442 spin_unlock(&session->s_cap_lock); in handle_session()
3443 wake_up_session_caps(session, FORCE_RO); in handle_session()
3447 WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); in handle_session()
3448 pr_info("mds%d rejected session\n", session->s_mds); in handle_session()
3449 session->s_state = CEPH_MDS_SESSION_REJECTED; in handle_session()
3450 cleanup_session_requests(mdsc, session); in handle_session()
3451 remove_session_caps(session); in handle_session()
3462 mutex_unlock(&session->s_mutex); in handle_session()
3465 __wake_requests(mdsc, &session->s_waiting); in handle_session()
3471 ceph_put_mds_session(session); in handle_session()
3508 struct ceph_mds_session *session) in replay_unsafe_requests() argument
3513 dout("replay_unsafe_requests mds%d\n", session->s_mds); in replay_unsafe_requests()
3516 list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) in replay_unsafe_requests()
3517 __send_request(mdsc, session, req, true); in replay_unsafe_requests()
3533 if (req->r_session->s_mds != session->s_mds) in replay_unsafe_requests()
3538 __send_request(mdsc, session, req, true); in replay_unsafe_requests()
3604 ceph_con_send(&recon_state->session->s_con, reply); in send_reconnect_partial()
3695 cap->cap_gen = cap->session->s_cap_gen; in reconnect_caps_cb()
3906 struct ceph_mds_session *session) in send_mds_reconnect() argument
3909 int mds = session->s_mds; in send_mds_reconnect()
3912 .session = session, in send_mds_reconnect()
3926 xa_destroy(&session->s_delegated_inos); in send_mds_reconnect()
3928 mutex_lock(&session->s_mutex); in send_mds_reconnect()
3929 session->s_state = CEPH_MDS_SESSION_RECONNECTING; in send_mds_reconnect()
3930 session->s_seq = 0; in send_mds_reconnect()
3932 dout("session %p state %s\n", session, in send_mds_reconnect()
3933 ceph_session_state_name(session->s_state)); in send_mds_reconnect()
3935 spin_lock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3936 session->s_cap_gen++; in send_mds_reconnect()
3937 spin_unlock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3939 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
3941 session->s_readonly = 0; in send_mds_reconnect()
3947 session->s_cap_reconnect = 1; in send_mds_reconnect()
3949 detach_cap_releases(session, &dispose); in send_mds_reconnect()
3950 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
3957 ceph_con_close(&session->s_con); in send_mds_reconnect()
3958 ceph_con_open(&session->s_con, in send_mds_reconnect()
3963 replay_unsafe_requests(mdsc, session); in send_mds_reconnect()
3965 ceph_early_kick_flushing_caps(mdsc, session); in send_mds_reconnect()
3974 if (test_bit(CEPHFS_FEATURE_MULTI_RECONNECT, &session->s_features)) { in send_mds_reconnect()
3977 } else if (session->s_con.peer_features & CEPH_FEATURE_MDSENC) { in send_mds_reconnect()
3983 err = ceph_iterate_session_caps(session, reconnect_caps_cb, &recon_state); in send_mds_reconnect()
3985 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
3986 session->s_cap_reconnect = 0; in send_mds_reconnect()
3987 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4050 ceph_con_send(&session->s_con, reply); in send_mds_reconnect()
4052 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4055 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
4065 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4200 struct ceph_mds_session *session, in handle_lease() argument
4207 int mds = session->s_mds; in handle_lease()
4233 mutex_lock(&session->s_mutex); in handle_lease()
4234 inc_session_sequence(session); in handle_lease()
4258 if (di->lease_session == session) { in handle_lease()
4267 if (di->lease_session == session && in handle_lease()
4268 di->lease_gen == session->s_cap_gen && in handle_lease()
4292 ceph_con_send(&session->s_con, msg); in handle_lease()
4295 mutex_unlock(&session->s_mutex); in handle_lease()
4305 void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session, in ceph_mdsc_lease_send_msg() argument
4315 dentry, ceph_lease_op_name(action), session->s_mds); in ceph_mdsc_lease_send_msg()
4340 ceph_con_send(&session->s_con, msg); in ceph_mdsc_lease_send_msg()
4723 struct ceph_mds_session *session; in ceph_mdsc_close_sessions() local
4732 session = __ceph_lookup_mds_session(mdsc, i); in ceph_mdsc_close_sessions()
4733 if (!session) in ceph_mdsc_close_sessions()
4736 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4737 if (__close_session(mdsc, session) <= 0) in ceph_mdsc_close_sessions()
4739 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4740 ceph_put_mds_session(session); in ceph_mdsc_close_sessions()
4754 session = ceph_get_mds_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
4755 __unregister_session(mdsc, session); in ceph_mdsc_close_sessions()
4757 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4758 remove_session_caps(session); in ceph_mdsc_close_sessions()
4759 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4760 ceph_put_mds_session(session); in ceph_mdsc_close_sessions()
4778 struct ceph_mds_session *session; in ceph_mdsc_force_umount() local
4785 session = __ceph_lookup_mds_session(mdsc, mds); in ceph_mdsc_force_umount()
4786 if (!session) in ceph_mdsc_force_umount()
4789 if (session->s_state == CEPH_MDS_SESSION_REJECTED) in ceph_mdsc_force_umount()
4790 __unregister_session(mdsc, session); in ceph_mdsc_force_umount()
4791 __wake_requests(mdsc, &session->s_waiting); in ceph_mdsc_force_umount()
4794 mutex_lock(&session->s_mutex); in ceph_mdsc_force_umount()
4795 __close_session(mdsc, session); in ceph_mdsc_force_umount()
4796 if (session->s_state == CEPH_MDS_SESSION_CLOSING) { in ceph_mdsc_force_umount()
4797 cleanup_session_requests(mdsc, session); in ceph_mdsc_force_umount()
4798 remove_session_caps(session); in ceph_mdsc_force_umount()
4800 mutex_unlock(&session->s_mutex); in ceph_mdsc_force_umount()
4801 ceph_put_mds_session(session); in ceph_mdsc_force_umount()