Lines Matching refs:mdsc
54 static void __wake_requests(struct ceph_mds_client *mdsc,
391 struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc, in __ceph_lookup_mds_session() argument
396 if (mds >= mdsc->max_sessions || mdsc->sessions[mds] == NULL) in __ceph_lookup_mds_session()
398 session = mdsc->sessions[mds]; in __ceph_lookup_mds_session()
405 static bool __have_session(struct ceph_mds_client *mdsc, int mds) in __have_session() argument
407 if (mds >= mdsc->max_sessions) in __have_session()
409 return mdsc->sessions[mds]; in __have_session()
412 static int __verify_registered_session(struct ceph_mds_client *mdsc, in __verify_registered_session() argument
415 if (s->s_mds >= mdsc->max_sessions || in __verify_registered_session()
416 mdsc->sessions[s->s_mds] != s) in __verify_registered_session()
425 static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc, in register_session() argument
430 if (mds >= mdsc->mdsmap->m_max_mds) in register_session()
436 s->s_mdsc = mdsc; in register_session()
443 ceph_con_init(&s->s_con, s, &mds_con_ops, &mdsc->fsc->client->msgr); in register_session()
466 if (mds >= mdsc->max_sessions) { in register_session()
474 if (mdsc->sessions) { in register_session()
475 memcpy(sa, mdsc->sessions, in register_session()
476 mdsc->max_sessions * sizeof(void *)); in register_session()
477 kfree(mdsc->sessions); in register_session()
479 mdsc->sessions = sa; in register_session()
480 mdsc->max_sessions = newmax; in register_session()
482 mdsc->sessions[mds] = s; in register_session()
483 atomic_inc(&mdsc->num_sessions); in register_session()
487 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in register_session()
499 static void __unregister_session(struct ceph_mds_client *mdsc, in __unregister_session() argument
503 BUG_ON(mdsc->sessions[s->s_mds] != s); in __unregister_session()
504 mdsc->sessions[s->s_mds] = NULL; in __unregister_session()
507 atomic_dec(&mdsc->num_sessions); in __unregister_session()
569 static struct ceph_mds_request *__lookup_request(struct ceph_mds_client *mdsc, in __lookup_request() argument
573 struct rb_node *n = mdsc->request_tree.rb_node; in __lookup_request()
589 static void __insert_request(struct ceph_mds_client *mdsc, in __insert_request() argument
592 struct rb_node **p = &mdsc->request_tree.rb_node; in __insert_request()
608 rb_insert_color(&new->r_node, &mdsc->request_tree); in __insert_request()
617 static void __register_request(struct ceph_mds_client *mdsc, in __register_request() argument
621 req->r_tid = ++mdsc->last_tid; in __register_request()
623 ceph_reserve_caps(mdsc, &req->r_caps_reservation, in __register_request()
627 __insert_request(mdsc, req); in __register_request()
632 if (mdsc->oldest_tid == 0 && req->r_op != CEPH_MDS_OP_SETFILELOCK) in __register_request()
633 mdsc->oldest_tid = req->r_tid; in __register_request()
641 static void __unregister_request(struct ceph_mds_client *mdsc, in __unregister_request() argument
646 if (req->r_tid == mdsc->oldest_tid) { in __unregister_request()
648 mdsc->oldest_tid = 0; in __unregister_request()
653 mdsc->oldest_tid = next_req->r_tid; in __unregister_request()
660 rb_erase(&req->r_node, &mdsc->request_tree); in __unregister_request()
707 static int __choose_mds(struct ceph_mds_client *mdsc, in __choose_mds() argument
723 (__have_session(mdsc, req->r_resend_mds) || in __choose_mds()
724 ceph_mdsmap_get_state(mdsc->mdsmap, req->r_resend_mds) > 0)) { in __choose_mds()
741 if (dir->i_sb != mdsc->fsc->sb) { in __choose_mds()
786 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
801 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
826 mds = ceph_mdsmap_get_random_mds(mdsc->mdsmap); in __choose_mds()
857 static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u64 seq) in create_session_open_msg() argument
864 struct ceph_options *opt = mdsc->fsc->client->options; in create_session_open_msg()
929 static int __open_session(struct ceph_mds_client *mdsc, in __open_session() argument
937 mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds); in __open_session()
944 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
957 __open_export_target_session(struct ceph_mds_client *mdsc, int target) in __open_export_target_session() argument
961 session = __ceph_lookup_mds_session(mdsc, target); in __open_export_target_session()
963 session = register_session(mdsc, target); in __open_export_target_session()
969 __open_session(mdsc, session); in __open_export_target_session()
975 ceph_mdsc_open_export_target_session(struct ceph_mds_client *mdsc, int target) in ceph_mdsc_open_export_target_session() argument
981 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
982 session = __open_export_target_session(mdsc, target); in ceph_mdsc_open_export_target_session()
983 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
988 static void __open_export_target_sessions(struct ceph_mds_client *mdsc, in __open_export_target_sessions() argument
995 if (mds >= mdsc->mdsmap->m_max_mds) in __open_export_target_sessions()
998 mi = &mdsc->mdsmap->m_info[mds]; in __open_export_target_sessions()
1003 ts = __open_export_target_session(mdsc, mi->export_targets[i]); in __open_export_target_sessions()
1009 void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, in ceph_mdsc_open_export_target_sessions() argument
1012 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1013 __open_export_target_sessions(mdsc, session); in ceph_mdsc_open_export_target_sessions()
1014 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1022 static void cleanup_cap_releases(struct ceph_mds_client *mdsc, in cleanup_cap_releases() argument
1038 ceph_put_cap(mdsc, cap); in cleanup_cap_releases()
1042 static void cleanup_session_requests(struct ceph_mds_client *mdsc, in cleanup_session_requests() argument
1049 mutex_lock(&mdsc->mutex); in cleanup_session_requests()
1056 __unregister_request(mdsc, req); in cleanup_session_requests()
1059 p = rb_first(&mdsc->request_tree); in cleanup_session_requests()
1067 mutex_unlock(&mdsc->mutex); in cleanup_session_requests()
1156 struct ceph_mds_client *mdsc = in remove_session_caps_cb() local
1157 ceph_sb_to_client(inode->i_sb)->mdsc; in remove_session_caps_cb()
1168 spin_lock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1171 rb_erase(&cf->g_node, &mdsc->cap_flush_tree); in remove_session_caps_cb()
1189 mdsc->num_cap_flushing--; in remove_session_caps_cb()
1192 spin_unlock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1291 static int send_renew_caps(struct ceph_mds_client *mdsc, in send_renew_caps() argument
1304 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1321 static int send_flushmsg_ack(struct ceph_mds_client *mdsc, in send_flushmsg_ack() argument
1341 static void renewed_caps(struct ceph_mds_client *mdsc, in renewed_caps() argument
1351 mdsc->mdsmap->m_session_timeout*HZ; in renewed_caps()
1373 static int request_close_session(struct ceph_mds_client *mdsc, in request_close_session() argument
1391 static int __close_session(struct ceph_mds_client *mdsc, in __close_session() argument
1397 return request_close_session(mdsc, session); in __close_session()
1466 static int trim_caps(struct ceph_mds_client *mdsc, in trim_caps() argument
1483 ceph_send_cap_releases(mdsc, session); in trim_caps()
1502 static int check_caps_flush(struct ceph_mds_client *mdsc, in check_caps_flush() argument
1509 spin_lock(&mdsc->cap_dirty_lock); in check_caps_flush()
1510 n = rb_first(&mdsc->cap_flush_tree); in check_caps_flush()
1517 spin_unlock(&mdsc->cap_dirty_lock); in check_caps_flush()
1526 static void wait_caps_flush(struct ceph_mds_client *mdsc, in wait_caps_flush() argument
1533 mutex_lock(&mdsc->mutex); in wait_caps_flush()
1534 for (mds = 0; mds < mdsc->max_sessions; ) { in wait_caps_flush()
1535 struct ceph_mds_session *session = mdsc->sessions[mds]; in wait_caps_flush()
1543 mutex_unlock(&mdsc->mutex); in wait_caps_flush()
1564 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
1572 mutex_lock(&mdsc->mutex); in wait_caps_flush()
1574 mutex_unlock(&mdsc->mutex); in wait_caps_flush()
1576 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
1577 check_caps_flush(mdsc, want_flush_tid)); in wait_caps_flush()
1585 void ceph_send_cap_releases(struct ceph_mds_client *mdsc, in ceph_send_cap_releases() argument
1626 ceph_put_cap(mdsc, cap); in ceph_send_cap_releases()
1704 ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode) in ceph_mdsc_create_request() argument
1712 req->r_mdsc = mdsc; in ceph_mdsc_create_request()
1736 static struct ceph_mds_request *__get_oldest_req(struct ceph_mds_client *mdsc) in __get_oldest_req() argument
1738 if (RB_EMPTY_ROOT(&mdsc->request_tree)) in __get_oldest_req()
1740 return rb_entry(rb_first(&mdsc->request_tree), in __get_oldest_req()
1744 static inline u64 __get_oldest_tid(struct ceph_mds_client *mdsc) in __get_oldest_tid() argument
1746 return mdsc->oldest_tid; in __get_oldest_tid()
1914 static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, in create_request_message() argument
1972 head->mdsmap_epoch = cpu_to_le32(mdsc->mdsmap->m_epoch); in create_request_message()
2044 static void complete_request(struct ceph_mds_client *mdsc, in complete_request() argument
2048 req->r_callback(mdsc, req); in complete_request()
2056 static int __prepare_send_request(struct ceph_mds_client *mdsc, in __prepare_send_request() argument
2117 msg = create_request_message(mdsc, req, mds, drop_cap_releases); in __prepare_send_request()
2125 rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc)); in __prepare_send_request()
2142 static int __do_request(struct ceph_mds_client *mdsc, in __do_request() argument
2151 __unregister_request(mdsc, req); in __do_request()
2161 if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in __do_request()
2169 mds = __choose_mds(mdsc, req); in __do_request()
2171 ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { in __do_request()
2173 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2178 session = __ceph_lookup_mds_session(mdsc, mds); in __do_request()
2180 session = register_session(mdsc, mds); in __do_request()
2194 __open_session(mdsc, session); in __do_request()
2205 err = __prepare_send_request(mdsc, req, mds, false); in __do_request()
2217 complete_request(mdsc, req); in __do_request()
2218 __unregister_request(mdsc, req); in __do_request()
2227 static void __wake_requests(struct ceph_mds_client *mdsc, in __wake_requests() argument
2240 __do_request(mdsc, req); in __wake_requests()
2248 static void kick_requests(struct ceph_mds_client *mdsc, int mds) in kick_requests() argument
2251 struct rb_node *p = rb_first(&mdsc->request_tree); in kick_requests()
2265 __do_request(mdsc, req); in kick_requests()
2270 void ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, in ceph_mdsc_submit_request() argument
2274 mutex_lock(&mdsc->mutex); in ceph_mdsc_submit_request()
2275 __register_request(mdsc, req, NULL); in ceph_mdsc_submit_request()
2276 __do_request(mdsc, req); in ceph_mdsc_submit_request()
2277 mutex_unlock(&mdsc->mutex); in ceph_mdsc_submit_request()
2284 int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, in ceph_mdsc_do_request() argument
2302 mutex_lock(&mdsc->mutex); in ceph_mdsc_do_request()
2303 __register_request(mdsc, req, dir); in ceph_mdsc_do_request()
2304 __do_request(mdsc, req); in ceph_mdsc_do_request()
2312 mutex_unlock(&mdsc->mutex); in ceph_mdsc_do_request()
2315 err = req->r_wait_for_completion(mdsc, req); in ceph_mdsc_do_request()
2328 mutex_lock(&mdsc->mutex); in ceph_mdsc_do_request()
2354 mutex_unlock(&mdsc->mutex); in ceph_mdsc_do_request()
2385 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply() local
2402 mutex_lock(&mdsc->mutex); in handle_reply()
2403 req = __lookup_request(mdsc, tid); in handle_reply()
2406 mutex_unlock(&mdsc->mutex); in handle_reply()
2416 mutex_unlock(&mdsc->mutex); in handle_reply()
2425 mutex_unlock(&mdsc->mutex); in handle_reply()
2431 mutex_unlock(&mdsc->mutex); in handle_reply()
2450 __do_request(mdsc, req); in handle_reply()
2451 mutex_unlock(&mdsc->mutex); in handle_reply()
2454 int mds = __choose_mds(mdsc, req); in handle_reply()
2457 __do_request(mdsc, req); in handle_reply()
2458 mutex_unlock(&mdsc->mutex); in handle_reply()
2468 __unregister_request(mdsc, req); in handle_reply()
2482 if (mdsc->stopping && !__get_oldest_req(mdsc)) in handle_reply()
2483 complete_all(&mdsc->safe_umount_waiters); in handle_reply()
2484 mutex_unlock(&mdsc->mutex); in handle_reply()
2503 mutex_unlock(&mdsc->mutex); in handle_reply()
2515 down_write(&mdsc->snap_rwsem); in handle_reply()
2516 ceph_update_snap_trace(mdsc, rinfo->snapblob, in handle_reply()
2520 downgrade_write(&mdsc->snap_rwsem); in handle_reply()
2522 down_read(&mdsc->snap_rwsem); in handle_reply()
2527 err = ceph_fill_trace(mdsc->fsc->sb, req, req->r_session); in handle_reply()
2532 ceph_unreserve_caps(mdsc, &req->r_caps_reservation); in handle_reply()
2536 up_read(&mdsc->snap_rwsem); in handle_reply()
2538 ceph_put_snap_realm(mdsc, realm); in handle_reply()
2547 mutex_lock(&mdsc->mutex); in handle_reply()
2558 mutex_unlock(&mdsc->mutex); in handle_reply()
2563 complete_request(mdsc, req); in handle_reply()
2574 static void handle_forward(struct ceph_mds_client *mdsc, in handle_forward() argument
2590 mutex_lock(&mdsc->mutex); in handle_forward()
2591 req = __lookup_request(mdsc, tid); in handle_forward()
2599 __unregister_request(mdsc, req); in handle_forward()
2612 __do_request(mdsc, req); in handle_forward()
2616 mutex_unlock(&mdsc->mutex); in handle_forward()
2629 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session() local
2642 mutex_lock(&mdsc->mutex); in handle_session()
2644 __unregister_session(mdsc, session); in handle_session()
2646 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
2647 mutex_unlock(&mdsc->mutex); in handle_session()
2665 renewed_caps(mdsc, session, 0); in handle_session()
2667 if (mdsc->stopping) in handle_session()
2668 __close_session(mdsc, session); in handle_session()
2673 renewed_caps(mdsc, session, 1); in handle_session()
2679 cleanup_session_requests(mdsc, session); in handle_session()
2682 wake_up_all(&mdsc->session_close_wq); in handle_session()
2692 send_renew_caps(mdsc, session); in handle_session()
2696 trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
2700 send_flushmsg_ack(mdsc, session, seq); in handle_session()
2718 mutex_lock(&mdsc->mutex); in handle_session()
2719 __wake_requests(mdsc, &session->s_waiting); in handle_session()
2721 kick_requests(mdsc, mds); in handle_session()
2722 mutex_unlock(&mdsc->mutex); in handle_session()
2737 static void replay_unsafe_requests(struct ceph_mds_client *mdsc, in replay_unsafe_requests() argument
2746 mutex_lock(&mdsc->mutex); in replay_unsafe_requests()
2748 err = __prepare_send_request(mdsc, req, session->s_mds, true); in replay_unsafe_requests()
2759 p = rb_first(&mdsc->request_tree); in replay_unsafe_requests()
2769 err = __prepare_send_request(mdsc, req, in replay_unsafe_requests()
2777 mutex_unlock(&mdsc->mutex); in replay_unsafe_requests()
2908 static void send_mds_reconnect(struct ceph_mds_client *mdsc, in send_mds_reconnect() argument
2951 cleanup_cap_releases(mdsc, session); in send_mds_reconnect()
2954 if (mdsc->fsc->sb->s_root) in send_mds_reconnect()
2955 shrink_dcache_parent(mdsc->fsc->sb->s_root); in send_mds_reconnect()
2960 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in send_mds_reconnect()
2963 replay_unsafe_requests(mdsc, session); in send_mds_reconnect()
2965 down_read(&mdsc->snap_rwsem); in send_mds_reconnect()
2989 for (p = rb_first(&mdsc->snap_realms); p; p = rb_next(p)) { in send_mds_reconnect()
3019 ceph_early_kick_flushing_caps(mdsc, session); in send_mds_reconnect()
3025 mutex_lock(&mdsc->mutex); in send_mds_reconnect()
3026 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
3027 mutex_unlock(&mdsc->mutex); in send_mds_reconnect()
3029 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
3034 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
3050 static void check_new_map(struct ceph_mds_client *mdsc, in check_new_map() argument
3061 for (i = 0; i < oldmap->m_max_mds && i < mdsc->max_sessions; i++) { in check_new_map()
3062 if (mdsc->sessions[i] == NULL) in check_new_map()
3064 s = mdsc->sessions[i]; in check_new_map()
3082 __wake_requests(mdsc, &s->s_waiting); in check_new_map()
3083 __unregister_session(mdsc, s); in check_new_map()
3086 mutex_unlock(&mdsc->mutex); in check_new_map()
3088 mutex_lock(&mdsc->mutex); in check_new_map()
3102 mutex_unlock(&mdsc->mutex); in check_new_map()
3103 send_mds_reconnect(mdsc, s); in check_new_map()
3104 mutex_lock(&mdsc->mutex); in check_new_map()
3115 kick_requests(mdsc, i); in check_new_map()
3116 ceph_kick_flushing_caps(mdsc, s); in check_new_map()
3121 for (i = 0; i < newmap->m_max_mds && i < mdsc->max_sessions; i++) { in check_new_map()
3122 s = mdsc->sessions[i]; in check_new_map()
3132 __open_export_target_sessions(mdsc, s); in check_new_map()
3154 static void handle_lease(struct ceph_mds_client *mdsc, in handle_lease() argument
3158 struct super_block *sb = mdsc->fsc->sb; in handle_lease()
3299 void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode, in ceph_mdsc_lease_release() argument
3339 static void drop_leases(struct ceph_mds_client *mdsc) in drop_leases() argument
3344 mutex_lock(&mdsc->mutex); in drop_leases()
3345 for (i = 0; i < mdsc->max_sessions; i++) { in drop_leases()
3346 struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i); in drop_leases()
3349 mutex_unlock(&mdsc->mutex); in drop_leases()
3353 mutex_lock(&mdsc->mutex); in drop_leases()
3355 mutex_unlock(&mdsc->mutex); in drop_leases()
3363 static void schedule_delayed(struct ceph_mds_client *mdsc) in schedule_delayed() argument
3367 schedule_delayed_work(&mdsc->delayed_work, hz); in schedule_delayed()
3373 struct ceph_mds_client *mdsc = in delayed_work() local
3379 ceph_check_delayed_caps(mdsc); in delayed_work()
3381 mutex_lock(&mdsc->mutex); in delayed_work()
3382 renew_interval = mdsc->mdsmap->m_session_timeout >> 2; in delayed_work()
3384 mdsc->last_renew_caps); in delayed_work()
3386 mdsc->last_renew_caps = jiffies; in delayed_work()
3388 for (i = 0; i < mdsc->max_sessions; i++) { in delayed_work()
3389 struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i); in delayed_work()
3395 request_close_session(mdsc, s); in delayed_work()
3410 mutex_unlock(&mdsc->mutex); in delayed_work()
3414 send_renew_caps(mdsc, s); in delayed_work()
3419 ceph_send_cap_releases(mdsc, s); in delayed_work()
3423 mutex_lock(&mdsc->mutex); in delayed_work()
3425 mutex_unlock(&mdsc->mutex); in delayed_work()
3427 schedule_delayed(mdsc); in delayed_work()
3433 struct ceph_mds_client *mdsc; in ceph_mdsc_init() local
3435 mdsc = kzalloc(sizeof(struct ceph_mds_client), GFP_NOFS); in ceph_mdsc_init()
3436 if (!mdsc) in ceph_mdsc_init()
3438 mdsc->fsc = fsc; in ceph_mdsc_init()
3439 fsc->mdsc = mdsc; in ceph_mdsc_init()
3440 mutex_init(&mdsc->mutex); in ceph_mdsc_init()
3441 mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); in ceph_mdsc_init()
3442 if (mdsc->mdsmap == NULL) { in ceph_mdsc_init()
3443 kfree(mdsc); in ceph_mdsc_init()
3447 init_completion(&mdsc->safe_umount_waiters); in ceph_mdsc_init()
3448 init_waitqueue_head(&mdsc->session_close_wq); in ceph_mdsc_init()
3449 INIT_LIST_HEAD(&mdsc->waiting_for_map); in ceph_mdsc_init()
3450 mdsc->sessions = NULL; in ceph_mdsc_init()
3451 atomic_set(&mdsc->num_sessions, 0); in ceph_mdsc_init()
3452 mdsc->max_sessions = 0; in ceph_mdsc_init()
3453 mdsc->stopping = 0; in ceph_mdsc_init()
3454 mdsc->last_snap_seq = 0; in ceph_mdsc_init()
3455 init_rwsem(&mdsc->snap_rwsem); in ceph_mdsc_init()
3456 mdsc->snap_realms = RB_ROOT; in ceph_mdsc_init()
3457 INIT_LIST_HEAD(&mdsc->snap_empty); in ceph_mdsc_init()
3458 spin_lock_init(&mdsc->snap_empty_lock); in ceph_mdsc_init()
3459 mdsc->last_tid = 0; in ceph_mdsc_init()
3460 mdsc->oldest_tid = 0; in ceph_mdsc_init()
3461 mdsc->request_tree = RB_ROOT; in ceph_mdsc_init()
3462 INIT_DELAYED_WORK(&mdsc->delayed_work, delayed_work); in ceph_mdsc_init()
3463 mdsc->last_renew_caps = jiffies; in ceph_mdsc_init()
3464 INIT_LIST_HEAD(&mdsc->cap_delay_list); in ceph_mdsc_init()
3465 spin_lock_init(&mdsc->cap_delay_lock); in ceph_mdsc_init()
3466 INIT_LIST_HEAD(&mdsc->snap_flush_list); in ceph_mdsc_init()
3467 spin_lock_init(&mdsc->snap_flush_lock); in ceph_mdsc_init()
3468 mdsc->last_cap_flush_tid = 1; in ceph_mdsc_init()
3469 mdsc->cap_flush_tree = RB_ROOT; in ceph_mdsc_init()
3470 INIT_LIST_HEAD(&mdsc->cap_dirty); in ceph_mdsc_init()
3471 INIT_LIST_HEAD(&mdsc->cap_dirty_migrating); in ceph_mdsc_init()
3472 mdsc->num_cap_flushing = 0; in ceph_mdsc_init()
3473 spin_lock_init(&mdsc->cap_dirty_lock); in ceph_mdsc_init()
3474 init_waitqueue_head(&mdsc->cap_flushing_wq); in ceph_mdsc_init()
3475 spin_lock_init(&mdsc->dentry_lru_lock); in ceph_mdsc_init()
3476 INIT_LIST_HEAD(&mdsc->dentry_lru); in ceph_mdsc_init()
3478 ceph_caps_init(mdsc); in ceph_mdsc_init()
3479 ceph_adjust_min_caps(mdsc, fsc->min_caps); in ceph_mdsc_init()
3481 init_rwsem(&mdsc->pool_perm_rwsem); in ceph_mdsc_init()
3482 mdsc->pool_perm_tree = RB_ROOT; in ceph_mdsc_init()
3491 static void wait_requests(struct ceph_mds_client *mdsc) in wait_requests() argument
3493 struct ceph_options *opts = mdsc->fsc->client->options; in wait_requests()
3496 mutex_lock(&mdsc->mutex); in wait_requests()
3497 if (__get_oldest_req(mdsc)) { in wait_requests()
3498 mutex_unlock(&mdsc->mutex); in wait_requests()
3501 wait_for_completion_timeout(&mdsc->safe_umount_waiters, in wait_requests()
3505 mutex_lock(&mdsc->mutex); in wait_requests()
3506 while ((req = __get_oldest_req(mdsc))) { in wait_requests()
3509 __unregister_request(mdsc, req); in wait_requests()
3512 mutex_unlock(&mdsc->mutex); in wait_requests()
3520 void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc) in ceph_mdsc_pre_umount() argument
3523 mdsc->stopping = 1; in ceph_mdsc_pre_umount()
3525 drop_leases(mdsc); in ceph_mdsc_pre_umount()
3526 ceph_flush_dirty_caps(mdsc); in ceph_mdsc_pre_umount()
3527 wait_requests(mdsc); in ceph_mdsc_pre_umount()
3539 static void wait_unsafe_requests(struct ceph_mds_client *mdsc, u64 want_tid) in wait_unsafe_requests() argument
3544 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
3547 req = __get_oldest_req(mdsc); in wait_unsafe_requests()
3561 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
3565 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
3578 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
3582 void ceph_mdsc_sync(struct ceph_mds_client *mdsc) in ceph_mdsc_sync() argument
3586 if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in ceph_mdsc_sync()
3590 mutex_lock(&mdsc->mutex); in ceph_mdsc_sync()
3591 want_tid = mdsc->last_tid; in ceph_mdsc_sync()
3592 mutex_unlock(&mdsc->mutex); in ceph_mdsc_sync()
3594 ceph_flush_dirty_caps(mdsc); in ceph_mdsc_sync()
3595 spin_lock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
3596 want_flush = mdsc->last_cap_flush_tid; in ceph_mdsc_sync()
3597 spin_unlock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
3599 down_read(&mdsc->snap_rwsem); in ceph_mdsc_sync()
3600 want_snap = mdsc->last_snap_seq; in ceph_mdsc_sync()
3601 up_read(&mdsc->snap_rwsem); in ceph_mdsc_sync()
3606 wait_unsafe_requests(mdsc, want_tid); in ceph_mdsc_sync()
3607 wait_caps_flush(mdsc, want_flush, want_snap); in ceph_mdsc_sync()
3613 static bool done_closing_sessions(struct ceph_mds_client *mdsc) in done_closing_sessions() argument
3615 if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in done_closing_sessions()
3617 return atomic_read(&mdsc->num_sessions) == 0; in done_closing_sessions()
3623 void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) in ceph_mdsc_close_sessions() argument
3625 struct ceph_options *opts = mdsc->fsc->client->options; in ceph_mdsc_close_sessions()
3632 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3633 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
3634 session = __ceph_lookup_mds_session(mdsc, i); in ceph_mdsc_close_sessions()
3637 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3639 __close_session(mdsc, session); in ceph_mdsc_close_sessions()
3642 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3644 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3647 wait_event_timeout(mdsc->session_close_wq, done_closing_sessions(mdsc), in ceph_mdsc_close_sessions()
3651 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3652 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
3653 if (mdsc->sessions[i]) { in ceph_mdsc_close_sessions()
3654 session = get_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
3655 __unregister_session(mdsc, session); in ceph_mdsc_close_sessions()
3656 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3661 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3664 WARN_ON(!list_empty(&mdsc->cap_delay_list)); in ceph_mdsc_close_sessions()
3665 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
3667 ceph_cleanup_empty_realms(mdsc); in ceph_mdsc_close_sessions()
3669 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_close_sessions()
3674 void ceph_mdsc_force_umount(struct ceph_mds_client *mdsc) in ceph_mdsc_force_umount() argument
3681 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
3682 for (mds = 0; mds < mdsc->max_sessions; mds++) { in ceph_mdsc_force_umount()
3683 session = __ceph_lookup_mds_session(mdsc, mds); in ceph_mdsc_force_umount()
3686 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
3688 __close_session(mdsc, session); in ceph_mdsc_force_umount()
3690 cleanup_session_requests(mdsc, session); in ceph_mdsc_force_umount()
3695 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
3696 kick_requests(mdsc, mds); in ceph_mdsc_force_umount()
3698 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_force_umount()
3699 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
3702 static void ceph_mdsc_stop(struct ceph_mds_client *mdsc) in ceph_mdsc_stop() argument
3705 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_stop()
3706 if (mdsc->mdsmap) in ceph_mdsc_stop()
3707 ceph_mdsmap_destroy(mdsc->mdsmap); in ceph_mdsc_stop()
3708 kfree(mdsc->sessions); in ceph_mdsc_stop()
3709 ceph_caps_finalize(mdsc); in ceph_mdsc_stop()
3710 ceph_pool_perm_destroy(mdsc); in ceph_mdsc_stop()
3715 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_mdsc_destroy() local
3717 dout("mdsc_destroy %p\n", mdsc); in ceph_mdsc_destroy()
3718 ceph_mdsc_stop(mdsc); in ceph_mdsc_destroy()
3723 fsc->mdsc = NULL; in ceph_mdsc_destroy()
3724 kfree(mdsc); in ceph_mdsc_destroy()
3725 dout("mdsc_destroy %p done\n", mdsc); in ceph_mdsc_destroy()
3732 void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg) in ceph_mdsc_handle_map() argument
3744 if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0) in ceph_mdsc_handle_map()
3751 ceph_monc_got_mdsmap(&mdsc->fsc->client->monc, epoch); in ceph_mdsc_handle_map()
3752 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_map()
3753 if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) { in ceph_mdsc_handle_map()
3755 epoch, mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_map()
3756 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_map()
3767 if (mdsc->mdsmap) { in ceph_mdsc_handle_map()
3768 oldmap = mdsc->mdsmap; in ceph_mdsc_handle_map()
3769 mdsc->mdsmap = newmap; in ceph_mdsc_handle_map()
3770 check_new_map(mdsc, newmap, oldmap); in ceph_mdsc_handle_map()
3773 mdsc->mdsmap = newmap; /* first mds map */ in ceph_mdsc_handle_map()
3775 mdsc->fsc->sb->s_maxbytes = mdsc->mdsmap->m_max_file_size; in ceph_mdsc_handle_map()
3777 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_map()
3779 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_map()
3780 schedule_delayed(mdsc); in ceph_mdsc_handle_map()
3784 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_map()
3817 struct ceph_mds_client *mdsc = s->s_mdsc; in peer_reset() local
3820 send_mds_reconnect(mdsc, s); in peer_reset()
3826 struct ceph_mds_client *mdsc = s->s_mdsc; in dispatch() local
3829 mutex_lock(&mdsc->mutex); in dispatch()
3830 if (__verify_registered_session(mdsc, s) < 0) { in dispatch()
3831 mutex_unlock(&mdsc->mutex); in dispatch()
3834 mutex_unlock(&mdsc->mutex); in dispatch()
3838 ceph_mdsc_handle_map(mdsc, msg); in dispatch()
3847 handle_forward(mdsc, s, msg); in dispatch()
3853 ceph_handle_snap(mdsc, s, msg); in dispatch()
3856 handle_lease(mdsc, s, msg); in dispatch()
3879 struct ceph_mds_client *mdsc = s->s_mdsc; in get_authorizer() local
3880 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in get_authorizer()
3907 struct ceph_mds_client *mdsc = s->s_mdsc; in verify_authorizer_reply() local
3908 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in verify_authorizer_reply()
3916 struct ceph_mds_client *mdsc = s->s_mdsc; in invalidate_authorizer() local
3917 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in invalidate_authorizer()
3921 return ceph_monc_validate_auth(&mdsc->fsc->client->monc); in invalidate_authorizer()