• Home
  • Raw
  • Download

Lines Matching +full:dout +full:- +full:default +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0
25 #define RECONNECT_MAX_SIZE (INT_MAX - PAGE_SIZE)
87 ceph_decode_64_safe(p, end, info->max_bytes, bad); in parse_reply_info_quota()
88 ceph_decode_64_safe(p, end, info->max_files, bad); in parse_reply_info_quota()
92 return -EIO; in parse_reply_info_quota()
105 if (features == (u64)-1) { in parse_reply_info_in()
120 info->in = *p; in parse_reply_info_in()
122 sizeof(*info->in->fragtree.splits) * in parse_reply_info_in()
123 le32_to_cpu(info->in->fragtree.nsplits); in parse_reply_info_in()
125 ceph_decode_32_safe(p, end, info->symlink_len, bad); in parse_reply_info_in()
126 ceph_decode_need(p, end, info->symlink_len, bad); in parse_reply_info_in()
127 info->symlink = *p; in parse_reply_info_in()
128 *p += info->symlink_len; in parse_reply_info_in()
130 ceph_decode_copy_safe(p, end, &info->dir_layout, in parse_reply_info_in()
131 sizeof(info->dir_layout), bad); in parse_reply_info_in()
132 ceph_decode_32_safe(p, end, info->xattr_len, bad); in parse_reply_info_in()
133 ceph_decode_need(p, end, info->xattr_len, bad); in parse_reply_info_in()
134 info->xattr_data = *p; in parse_reply_info_in()
135 *p += info->xattr_len; in parse_reply_info_in()
137 if (features == (u64)-1) { in parse_reply_info_in()
139 ceph_decode_64_safe(p, end, info->inline_version, bad); in parse_reply_info_in()
140 ceph_decode_32_safe(p, end, info->inline_len, bad); in parse_reply_info_in()
141 ceph_decode_need(p, end, info->inline_len, bad); in parse_reply_info_in()
142 info->inline_data = *p; in parse_reply_info_in()
143 *p += info->inline_len; in parse_reply_info_in()
149 ceph_decode_32_safe(p, end, info->pool_ns_len, bad); in parse_reply_info_in()
150 if (info->pool_ns_len > 0) { in parse_reply_info_in()
151 ceph_decode_need(p, end, info->pool_ns_len, bad); in parse_reply_info_in()
152 info->pool_ns_data = *p; in parse_reply_info_in()
153 *p += info->pool_ns_len; in parse_reply_info_in()
157 ceph_decode_need(p, end, sizeof(info->btime), bad); in parse_reply_info_in()
158 ceph_decode_copy(p, &info->btime, sizeof(info->btime)); in parse_reply_info_in()
161 ceph_decode_64_safe(p, end, info->change_attr, bad); in parse_reply_info_in()
164 if (struct_v >= 2) { in parse_reply_info_in()
165 ceph_decode_32_safe(p, end, info->dir_pin, bad); in parse_reply_info_in()
167 info->dir_pin = -ENODATA; in parse_reply_info_in()
170 /* snapshot birth time, remains zero for v<=2 */ in parse_reply_info_in()
172 ceph_decode_need(p, end, sizeof(info->snap_btime), bad); in parse_reply_info_in()
173 ceph_decode_copy(p, &info->snap_btime, in parse_reply_info_in()
174 sizeof(info->snap_btime)); in parse_reply_info_in()
176 memset(&info->snap_btime, 0, sizeof(info->snap_btime)); in parse_reply_info_in()
182 ceph_decode_64_safe(p, end, info->inline_version, bad); in parse_reply_info_in()
183 ceph_decode_32_safe(p, end, info->inline_len, bad); in parse_reply_info_in()
184 ceph_decode_need(p, end, info->inline_len, bad); in parse_reply_info_in()
185 info->inline_data = *p; in parse_reply_info_in()
186 *p += info->inline_len; in parse_reply_info_in()
188 info->inline_version = CEPH_INLINE_NONE; in parse_reply_info_in()
195 info->max_bytes = 0; in parse_reply_info_in()
196 info->max_files = 0; in parse_reply_info_in()
199 info->pool_ns_len = 0; in parse_reply_info_in()
200 info->pool_ns_data = NULL; in parse_reply_info_in()
202 ceph_decode_32_safe(p, end, info->pool_ns_len, bad); in parse_reply_info_in()
203 if (info->pool_ns_len > 0) { in parse_reply_info_in()
204 ceph_decode_need(p, end, info->pool_ns_len, bad); in parse_reply_info_in()
205 info->pool_ns_data = *p; in parse_reply_info_in()
206 *p += info->pool_ns_len; in parse_reply_info_in()
211 ceph_decode_need(p, end, sizeof(info->btime), bad); in parse_reply_info_in()
212 ceph_decode_copy(p, &info->btime, sizeof(info->btime)); in parse_reply_info_in()
213 ceph_decode_64_safe(p, end, info->change_attr, bad); in parse_reply_info_in()
216 info->dir_pin = -ENODATA; in parse_reply_info_in()
217 /* info->snap_btime remains zero */ in parse_reply_info_in()
221 err = -EIO; in parse_reply_info_in()
230 if (features == (u64)-1) { in parse_reply_info_dir()
246 *p += sizeof(**dirfrag) + sizeof(u32) * le32_to_cpu((*dirfrag)->ndist); in parse_reply_info_dir()
249 if (features == (u64)-1) in parse_reply_info_dir()
253 return -EIO; in parse_reply_info_dir()
260 if (features == (u64)-1) { in parse_reply_info_lease()
277 if (features == (u64)-1) in parse_reply_info_lease()
281 return -EIO; in parse_reply_info_lease()
294 if (info->head->is_dentry) { in parse_reply_info_trace()
295 err = parse_reply_info_in(p, end, &info->diri, features); in parse_reply_info_trace()
299 err = parse_reply_info_dir(p, end, &info->dirfrag, features); in parse_reply_info_trace()
303 ceph_decode_32_safe(p, end, info->dname_len, bad); in parse_reply_info_trace()
304 ceph_decode_need(p, end, info->dname_len, bad); in parse_reply_info_trace()
305 info->dname = *p; in parse_reply_info_trace()
306 *p += info->dname_len; in parse_reply_info_trace()
308 err = parse_reply_info_lease(p, end, &info->dlease, features); in parse_reply_info_trace()
313 if (info->head->is_target) { in parse_reply_info_trace()
314 err = parse_reply_info_in(p, end, &info->targeti, features); in parse_reply_info_trace()
324 err = -EIO; in parse_reply_info_trace()
340 err = parse_reply_info_dir(p, end, &info->dir_dir, features); in parse_reply_info_readdir()
344 ceph_decode_need(p, end, sizeof(num) + 2, bad); in parse_reply_info_readdir()
348 info->dir_end = !!(flags & CEPH_READDIR_FRAG_END); in parse_reply_info_readdir()
349 info->dir_complete = !!(flags & CEPH_READDIR_FRAG_COMPLETE); in parse_reply_info_readdir()
350 info->hash_order = !!(flags & CEPH_READDIR_HASH_ORDER); in parse_reply_info_readdir()
351 info->offset_hash = !!(flags & CEPH_READDIR_OFFSET_HASH); in parse_reply_info_readdir()
356 BUG_ON(!info->dir_entries); in parse_reply_info_readdir()
357 if ((unsigned long)(info->dir_entries + num) > in parse_reply_info_readdir()
358 (unsigned long)info->dir_entries + info->dir_buf_size) { in parse_reply_info_readdir()
364 info->dir_nr = num; in parse_reply_info_readdir()
366 struct ceph_mds_reply_dir_entry *rde = info->dir_entries + i; in parse_reply_info_readdir()
368 ceph_decode_32_safe(p, end, rde->name_len, bad); in parse_reply_info_readdir()
369 ceph_decode_need(p, end, rde->name_len, bad); in parse_reply_info_readdir()
370 rde->name = *p; in parse_reply_info_readdir()
371 *p += rde->name_len; in parse_reply_info_readdir()
372 dout("parsed dir dname '%.*s'\n", rde->name_len, rde->name); in parse_reply_info_readdir()
375 err = parse_reply_info_lease(p, end, &rde->lease, features); in parse_reply_info_readdir()
379 err = parse_reply_info_in(p, end, &rde->inode, features); in parse_reply_info_readdir()
383 rde->offset = 0; in parse_reply_info_readdir()
385 num--; in parse_reply_info_readdir()
394 err = -EIO; in parse_reply_info_readdir()
407 if (*p + sizeof(*info->filelock_reply) > end) in parse_reply_info_filelock()
410 info->filelock_reply = *p; in parse_reply_info_filelock()
416 return -EIO; in parse_reply_info_filelock()
430 dout("got %u sets of delegated inodes\n", sets); in ceph_parse_deleg_inos()
431 while (sets--) { in ceph_parse_deleg_inos()
443 while (len--) { in ceph_parse_deleg_inos()
444 int err = xa_insert(&s->s_delegated_inos, ino = start++, in ceph_parse_deleg_inos()
448 dout("added delegated inode 0x%llx\n", in ceph_parse_deleg_inos()
449 start - 1); in ceph_parse_deleg_inos()
450 } else if (err == -EBUSY) { in ceph_parse_deleg_inos()
452 start - 1); in ceph_parse_deleg_inos()
460 return -EIO; in ceph_parse_deleg_inos()
468 xa_for_each(&s->s_delegated_inos, ino, val) { in ceph_get_deleg_ino()
469 val = xa_erase(&s->s_delegated_inos, ino); in ceph_get_deleg_ino()
478 return xa_insert(&s->s_delegated_inos, ino, DELEGATED_INO_AVAILABLE, in ceph_restore_deleg_ino()
483 * FIXME: xarrays can't handle 64-bit indexes on a 32-bit arch. For now, just
494 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad); in ceph_parse_deleg_inos()
497 return -EIO; in ceph_parse_deleg_inos()
520 if (features == (u64)-1 || in parse_reply_info_create()
524 info->has_create_ino = false; in parse_reply_info_create()
525 } else if (test_bit(CEPHFS_FEATURE_DELEG_INO, &s->s_features)) { in parse_reply_info_create()
529 info->has_create_ino = true; in parse_reply_info_create()
533 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
539 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
540 info->has_create_ino = true; in parse_reply_info_create()
551 return -EIO; in parse_reply_info_create()
561 u32 op = le32_to_cpu(info->head->op); in parse_reply_info_extra()
570 return -EIO; in parse_reply_info_extra()
584 info->head = msg->front.iov_base; in parse_reply_info()
585 p = msg->front.iov_base + sizeof(struct ceph_mds_reply_head); in parse_reply_info()
586 end = p + msg->front.iov_len - sizeof(struct ceph_mds_reply_head); in parse_reply_info()
608 info->snapblob_len = len; in parse_reply_info()
609 info->snapblob = p; in parse_reply_info()
617 err = -EIO; in parse_reply_info()
625 if (!info->dir_entries) in destroy_reply_info()
627 free_pages((unsigned long)info->dir_entries, get_order(info->dir_buf_size)); in destroy_reply_info()
646 default: return "???"; in ceph_session_state_name()
652 if (refcount_inc_not_zero(&s->s_ref)) { in ceph_get_mds_session()
653 dout("mdsc get_session %p %d -> %d\n", s, in ceph_get_mds_session()
654 refcount_read(&s->s_ref)-1, refcount_read(&s->s_ref)); in ceph_get_mds_session()
657 dout("mdsc get_session %p 0 -- FAIL\n", s); in ceph_get_mds_session()
667 dout("mdsc put_session %p %d -> %d\n", s, in ceph_put_mds_session()
668 refcount_read(&s->s_ref), refcount_read(&s->s_ref)-1); in ceph_put_mds_session()
669 if (refcount_dec_and_test(&s->s_ref)) { in ceph_put_mds_session()
670 if (s->s_auth.authorizer) in ceph_put_mds_session()
671 ceph_auth_destroy_authorizer(s->s_auth.authorizer); in ceph_put_mds_session()
672 WARN_ON(mutex_is_locked(&s->s_mutex)); in ceph_put_mds_session()
673 xa_destroy(&s->s_delegated_inos); in ceph_put_mds_session()
679 * called under mdsc->mutex
684 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __ceph_lookup_mds_session()
686 return ceph_get_mds_session(mdsc->sessions[mds]); in __ceph_lookup_mds_session()
691 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __have_session()
700 if (s->s_mds >= mdsc->max_sessions || in __verify_registered_session()
701 mdsc->sessions[s->s_mds] != s) in __verify_registered_session()
702 return -ENOENT; in __verify_registered_session()
708 * called under mdsc->mutex.
715 if (mds >= mdsc->mdsmap->possible_max_rank) in register_session()
716 return ERR_PTR(-EINVAL); in register_session()
720 return ERR_PTR(-ENOMEM); in register_session()
722 if (mds >= mdsc->max_sessions) { in register_session()
726 dout("%s: realloc to %d\n", __func__, newmax); in register_session()
730 if (mdsc->sessions) { in register_session()
731 memcpy(sa, mdsc->sessions, in register_session()
732 mdsc->max_sessions * sizeof(void *)); in register_session()
733 kfree(mdsc->sessions); in register_session()
735 mdsc->sessions = sa; in register_session()
736 mdsc->max_sessions = newmax; in register_session()
739 dout("%s: mds%d\n", __func__, mds); in register_session()
740 s->s_mdsc = mdsc; in register_session()
741 s->s_mds = mds; in register_session()
742 s->s_state = CEPH_MDS_SESSION_NEW; in register_session()
743 s->s_ttl = 0; in register_session()
744 s->s_seq = 0; in register_session()
745 mutex_init(&s->s_mutex); in register_session()
747 ceph_con_init(&s->s_con, s, &mds_con_ops, &mdsc->fsc->client->msgr); in register_session()
749 spin_lock_init(&s->s_gen_ttl_lock); in register_session()
750 s->s_cap_gen = 1; in register_session()
751 s->s_cap_ttl = jiffies - 1; in register_session()
753 spin_lock_init(&s->s_cap_lock); in register_session()
754 s->s_renew_requested = 0; in register_session()
755 s->s_renew_seq = 0; in register_session()
756 INIT_LIST_HEAD(&s->s_caps); in register_session()
757 s->s_nr_caps = 0; in register_session()
758 refcount_set(&s->s_ref, 1); in register_session()
759 INIT_LIST_HEAD(&s->s_waiting); in register_session()
760 INIT_LIST_HEAD(&s->s_unsafe); in register_session()
761 xa_init(&s->s_delegated_inos); in register_session()
762 s->s_num_cap_releases = 0; in register_session()
763 s->s_cap_reconnect = 0; in register_session()
764 s->s_cap_iterator = NULL; in register_session()
765 INIT_LIST_HEAD(&s->s_cap_releases); in register_session()
766 INIT_WORK(&s->s_cap_release_work, ceph_cap_release_work); in register_session()
768 INIT_LIST_HEAD(&s->s_cap_dirty); in register_session()
769 INIT_LIST_HEAD(&s->s_cap_flushing); in register_session()
771 mdsc->sessions[mds] = s; in register_session()
772 atomic_inc(&mdsc->num_sessions); in register_session()
773 refcount_inc(&s->s_ref); /* one ref to sessions[], one to caller */ in register_session()
775 ceph_con_open(&s->s_con, CEPH_ENTITY_TYPE_MDS, mds, in register_session()
776 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in register_session()
782 return ERR_PTR(-ENOMEM); in register_session()
786 * called under mdsc->mutex
791 dout("__unregister_session mds%d %p\n", s->s_mds, s); in __unregister_session()
792 BUG_ON(mdsc->sessions[s->s_mds] != s); in __unregister_session()
793 mdsc->sessions[s->s_mds] = NULL; in __unregister_session()
794 ceph_con_close(&s->s_con); in __unregister_session()
796 atomic_dec(&mdsc->num_sessions); in __unregister_session()
802 * should be last request ref, or hold mdsc->mutex
806 if (req->r_session) { in put_request_session()
807 ceph_put_mds_session(req->r_session); in put_request_session()
808 req->r_session = NULL; in put_request_session()
818 mutex_lock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
819 for (mds = 0; mds < mdsc->max_sessions; ++mds) { in ceph_mdsc_iterate_sessions()
831 mutex_unlock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
834 mutex_lock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
836 mutex_unlock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
845 destroy_reply_info(&req->r_reply_info); in ceph_mdsc_release_request()
846 if (req->r_request) in ceph_mdsc_release_request()
847 ceph_msg_put(req->r_request); in ceph_mdsc_release_request()
848 if (req->r_reply) in ceph_mdsc_release_request()
849 ceph_msg_put(req->r_reply); in ceph_mdsc_release_request()
850 if (req->r_inode) { in ceph_mdsc_release_request()
851 ceph_put_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_release_request()
853 ceph_async_iput(req->r_inode); in ceph_mdsc_release_request()
855 if (req->r_parent) { in ceph_mdsc_release_request()
856 ceph_put_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); in ceph_mdsc_release_request()
857 ceph_async_iput(req->r_parent); in ceph_mdsc_release_request()
859 ceph_async_iput(req->r_target_inode); in ceph_mdsc_release_request()
860 if (req->r_dentry) in ceph_mdsc_release_request()
861 dput(req->r_dentry); in ceph_mdsc_release_request()
862 if (req->r_old_dentry) in ceph_mdsc_release_request()
863 dput(req->r_old_dentry); in ceph_mdsc_release_request()
864 if (req->r_old_dentry_dir) { in ceph_mdsc_release_request()
871 ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_release_request()
873 ceph_async_iput(req->r_old_dentry_dir); in ceph_mdsc_release_request()
875 kfree(req->r_path1); in ceph_mdsc_release_request()
876 kfree(req->r_path2); in ceph_mdsc_release_request()
877 if (req->r_pagelist) in ceph_mdsc_release_request()
878 ceph_pagelist_release(req->r_pagelist); in ceph_mdsc_release_request()
880 ceph_unreserve_caps(req->r_mdsc, &req->r_caps_reservation); in ceph_mdsc_release_request()
881 WARN_ON_ONCE(!list_empty(&req->r_wait)); in ceph_mdsc_release_request()
890 * called under mdsc->mutex. in DEFINE_RB_FUNCS()
897 req = lookup_request(&mdsc->request_tree, tid); in DEFINE_RB_FUNCS()
905 * Register an in-flight request, and assign a tid. Link to directory
908 * Called under mdsc->mutex.
916 req->r_tid = ++mdsc->last_tid; in __register_request()
917 if (req->r_num_caps) { in __register_request()
918 ret = ceph_reserve_caps(mdsc, &req->r_caps_reservation, in __register_request()
919 req->r_num_caps); in __register_request()
923 /* set req->r_err to fail early from __do_request */ in __register_request()
924 req->r_err = ret; in __register_request()
928 dout("__register_request %p tid %lld\n", req, req->r_tid); in __register_request()
930 insert_request(&mdsc->request_tree, req); in __register_request()
932 req->r_uid = current_fsuid(); in __register_request()
933 req->r_gid = current_fsgid(); in __register_request()
935 if (mdsc->oldest_tid == 0 && req->r_op != CEPH_MDS_OP_SETFILELOCK) in __register_request()
936 mdsc->oldest_tid = req->r_tid; in __register_request()
942 req->r_unsafe_dir = dir; in __register_request()
943 spin_lock(&ci->i_unsafe_lock); in __register_request()
944 list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); in __register_request()
945 spin_unlock(&ci->i_unsafe_lock); in __register_request()
952 dout("__unregister_request %p tid %lld\n", req, req->r_tid); in __unregister_request()
955 list_del_init(&req->r_unsafe_item); in __unregister_request()
957 if (req->r_tid == mdsc->oldest_tid) { in __unregister_request()
958 struct rb_node *p = rb_next(&req->r_node); in __unregister_request()
959 mdsc->oldest_tid = 0; in __unregister_request()
963 if (next_req->r_op != CEPH_MDS_OP_SETFILELOCK) { in __unregister_request()
964 mdsc->oldest_tid = next_req->r_tid; in __unregister_request()
971 erase_request(&mdsc->request_tree, req); in __unregister_request()
973 if (req->r_unsafe_dir) { in __unregister_request()
974 struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); in __unregister_request()
975 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
976 list_del_init(&req->r_unsafe_dir_item); in __unregister_request()
977 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
979 if (req->r_target_inode && in __unregister_request()
980 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __unregister_request()
981 struct ceph_inode_info *ci = ceph_inode(req->r_target_inode); in __unregister_request()
982 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
983 list_del_init(&req->r_unsafe_target_item); in __unregister_request()
984 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
987 if (req->r_unsafe_dir) { in __unregister_request()
989 ceph_async_iput(req->r_unsafe_dir); in __unregister_request()
990 req->r_unsafe_dir = NULL; in __unregister_request()
993 complete_all(&req->r_safe_completion); in __unregister_request()
1000 * non-snapshot inode. We do this using the rcu_read_lock (which must be held
1013 dentry = dentry->d_parent; in get_nonsnap_parent()
1026 * Called under mdsc->mutex.
1035 int mode = req->r_direct_mode; in __choose_mds()
1036 int mds = -1; in __choose_mds()
1037 u32 hash = req->r_direct_hash; in __choose_mds()
1038 bool is_hash = test_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags); in __choose_mds()
1047 if (req->r_resend_mds >= 0 && in __choose_mds()
1048 (__have_session(mdsc, req->r_resend_mds) || in __choose_mds()
1049 ceph_mdsmap_get_state(mdsc->mdsmap, req->r_resend_mds) > 0)) { in __choose_mds()
1050 dout("%s using resend_mds mds%d\n", __func__, in __choose_mds()
1051 req->r_resend_mds); in __choose_mds()
1052 return req->r_resend_mds; in __choose_mds()
1059 if (req->r_inode) { in __choose_mds()
1060 if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) { in __choose_mds()
1061 inode = req->r_inode; in __choose_mds()
1064 /* req->r_dentry is non-null for LSSNAP request */ in __choose_mds()
1066 inode = get_nonsnap_parent(req->r_dentry); in __choose_mds()
1068 dout("%s using snapdir's parent %p\n", __func__, inode); in __choose_mds()
1070 } else if (req->r_dentry) { in __choose_mds()
1076 parent = READ_ONCE(req->r_dentry->d_parent); in __choose_mds()
1077 dir = req->r_parent ? : d_inode_rcu(parent); in __choose_mds()
1079 if (!dir || dir->i_sb != mdsc->fsc->sb) { in __choose_mds()
1081 inode = d_inode(req->r_dentry); in __choose_mds()
1088 dout("%s using nonsnap parent %p\n", __func__, inode); in __choose_mds()
1091 inode = d_inode(req->r_dentry); in __choose_mds()
1095 hash = ceph_dentry_hash(dir, req->r_dentry); in __choose_mds()
1104 dout("%s %p is_hash=%d (0x%x) mode %d\n", __func__, inode, (int)is_hash, in __choose_mds()
1110 if (is_hash && S_ISDIR(inode->i_mode)) { in __choose_mds()
1123 dout("%s %p %llx.%llx frag %u mds%d (%d/%d)\n", in __choose_mds()
1126 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1128 !ceph_mdsmap_is_laggy(mdsc->mdsmap, mds)) in __choose_mds()
1138 dout("%s %p %llx.%llx frag %u mds%d (auth)\n", in __choose_mds()
1141 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1143 if (!ceph_mdsmap_is_laggy(mdsc->mdsmap, in __choose_mds()
1152 spin_lock(&ci->i_ceph_lock); in __choose_mds()
1155 cap = ci->i_auth_cap; in __choose_mds()
1156 if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) in __choose_mds()
1157 cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); in __choose_mds()
1159 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1163 mds = cap->session->s_mds; in __choose_mds()
1164 dout("%s %p %llx.%llx mds%d (%scap %p)\n", __func__, in __choose_mds()
1166 cap == ci->i_auth_cap ? "auth " : "", cap); in __choose_mds()
1167 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1169 /* avoid calling iput_final() while holding mdsc->mutex or in __choose_mds()
1178 mds = ceph_mdsmap_get_random_mds(mdsc->mdsmap); in __choose_mds()
1179 dout("%s chose random mds%d\n", __func__, mds); in __choose_mds()
1199 h = msg->front.iov_base; in ceph_create_session_msg()
1200 h->op = cpu_to_le32(op); in ceph_create_session_msg()
1201 h->seq = cpu_to_le64(seq); in ceph_create_session_msg()
1207 #define FEATURE_BYTES(c) (DIV_ROUND_UP((size_t)feature_bits[c - 1] + 1, 64) * 8)
1218 return -ERANGE; in encode_supported_features()
1229 return -ERANGE; in encode_supported_features()
1238 #define METRIC_BYTES(cnt) (DIV_ROUND_UP((size_t)metric_bits[cnt - 1] + 1, 64) * 8)
1244 if (WARN_ON_ONCE(*p + 2 > end)) in encode_metric_spec()
1245 return -ERANGE; in encode_metric_spec()
1255 return -ERANGE; in encode_metric_spec()
1268 return -ERANGE; in encode_metric_spec()
1287 int i = -1; in create_session_open_msg()
1290 struct ceph_options *opt = mdsc->fsc->client->options; in create_session_open_msg()
1291 struct ceph_mount_options *fsopt = mdsc->fsc->mount_options; in create_session_open_msg()
1296 const char* metadata[][2] = { in create_session_open_msg()
1297 {"hostname", mdsc->nodename}, in create_session_open_msg()
1298 {"kernel_version", init_utsname()->release}, in create_session_open_msg()
1299 {"entity_id", opt->name ? : ""}, in create_session_open_msg()
1300 {"root", fsopt->server_path ? : "/"}, in create_session_open_msg()
1324 extra_bytes += 2 + 4 + 4 + size; in create_session_open_msg()
1331 return ERR_PTR(-ENOMEM); in create_session_open_msg()
1333 p = msg->front.iov_base; in create_session_open_msg()
1334 end = p + msg->front.iov_len; in create_session_open_msg()
1337 h->op = cpu_to_le32(CEPH_SESSION_REQUEST_OPEN); in create_session_open_msg()
1338 h->seq = cpu_to_le64(seq); in create_session_open_msg()
1346 msg->hdr.version = cpu_to_le16(4); in create_session_open_msg()
1347 msg->hdr.compat_version = cpu_to_le16(1); in create_session_open_msg()
1355 /* Two length-prefixed strings for each entry in the map */ in create_session_open_msg()
1382 msg->front.iov_len = p - msg->front.iov_base; in create_session_open_msg()
1383 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_session_open_msg()
1391 * called under mdsc->mutex
1398 int mds = session->s_mds; in __open_session()
1401 mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds); in __open_session()
1402 dout("open_session to mds%d (%s)\n", mds, in __open_session()
1404 session->s_state = CEPH_MDS_SESSION_OPENING; in __open_session()
1405 session->s_renew_requested = jiffies; in __open_session()
1408 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
1411 ceph_con_send(&session->s_con, msg); in __open_session()
1418 * called under mdsc->mutex
1432 if (session->s_state == CEPH_MDS_SESSION_NEW || in __open_export_target_session()
1433 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __open_export_target_session()
1447 dout("open_export_target_session to mds%d\n", target); in ceph_mdsc_open_export_target_session()
1449 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1451 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1461 int i, mds = session->s_mds; in __open_export_target_sessions()
1463 if (mds >= mdsc->mdsmap->possible_max_rank) in __open_export_target_sessions()
1466 mi = &mdsc->mdsmap->m_info[mds]; in __open_export_target_sessions()
1467 dout("open_export_target_sessions for mds%d (%d targets)\n", in __open_export_target_sessions()
1468 session->s_mds, mi->num_export_targets); in __open_export_target_sessions()
1470 for (i = 0; i < mi->num_export_targets; i++) { in __open_export_target_sessions()
1471 ts = __open_export_target_session(mdsc, mi->export_targets[i]); in __open_export_target_sessions()
1479 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1481 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1491 lockdep_assert_held(&session->s_cap_lock); in detach_cap_releases()
1493 list_splice_init(&session->s_cap_releases, target); in detach_cap_releases()
1494 session->s_num_cap_releases = 0; in detach_cap_releases()
1495 dout("dispose_cap_releases mds%d\n", session->s_mds); in detach_cap_releases()
1503 /* zero out the in-progress message */ in dispose_cap_releases()
1505 list_del(&cap->session_caps); in dispose_cap_releases()
1516 dout("cleanup_session_requests mds%d\n", session->s_mds); in cleanup_session_requests()
1517 mutex_lock(&mdsc->mutex); in cleanup_session_requests()
1518 while (!list_empty(&session->s_unsafe)) { in cleanup_session_requests()
1519 req = list_first_entry(&session->s_unsafe, in cleanup_session_requests()
1522 req->r_tid); in cleanup_session_requests()
1523 if (req->r_target_inode) in cleanup_session_requests()
1524 mapping_set_error(req->r_target_inode->i_mapping, -EIO); in cleanup_session_requests()
1525 if (req->r_unsafe_dir) in cleanup_session_requests()
1526 mapping_set_error(req->r_unsafe_dir->i_mapping, -EIO); in cleanup_session_requests()
1529 /* zero r_attempts, so kick_requests() will re-send requests */ in cleanup_session_requests()
1530 p = rb_first(&mdsc->request_tree); in cleanup_session_requests()
1534 if (req->r_session && in cleanup_session_requests()
1535 req->r_session->s_mds == session->s_mds) in cleanup_session_requests()
1536 req->r_attempts = 0; in cleanup_session_requests()
1538 mutex_unlock(&mdsc->mutex); in cleanup_session_requests()
1557 dout("iterate_session_caps %p mds%d\n", session, session->s_mds); in ceph_iterate_session_caps()
1558 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1559 p = session->s_caps.next; in ceph_iterate_session_caps()
1560 while (p != &session->s_caps) { in ceph_iterate_session_caps()
1562 inode = igrab(&cap->ci->vfs_inode); in ceph_iterate_session_caps()
1564 p = p->next; in ceph_iterate_session_caps()
1567 session->s_cap_iterator = cap; in ceph_iterate_session_caps()
1568 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1577 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1584 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1585 p = p->next; in ceph_iterate_session_caps()
1586 if (!cap->ci) { in ceph_iterate_session_caps()
1587 dout("iterate_session_caps finishing cap %p removal\n", in ceph_iterate_session_caps()
1589 BUG_ON(cap->session != session); in ceph_iterate_session_caps()
1590 cap->session = NULL; in ceph_iterate_session_caps()
1591 list_del_init(&cap->session_caps); in ceph_iterate_session_caps()
1592 session->s_nr_caps--; in ceph_iterate_session_caps()
1593 atomic64_dec(&session->s_mdsc->metric.total_caps); in ceph_iterate_session_caps()
1594 if (cap->queue_release) in ceph_iterate_session_caps()
1604 session->s_cap_iterator = NULL; in ceph_iterate_session_caps()
1605 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1609 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1620 lockdep_assert_held(&ci->i_ceph_lock); in remove_capsnaps()
1622 dout("removing capsnaps, ci is %p, inode is %p\n", ci, inode); in remove_capsnaps()
1624 while (!list_empty(&ci->i_cap_snaps)) { in remove_capsnaps()
1625 capsnap = list_first_entry(&ci->i_cap_snaps, in remove_capsnaps()
1628 ceph_put_snap_context(capsnap->context); in remove_capsnaps()
1632 wake_up_all(&ci->i_cap_wq); in remove_capsnaps()
1633 wake_up_all(&mdsc->cap_flushing_wq); in remove_capsnaps()
1641 struct ceph_mds_client *mdsc = fsc->mdsc; in remove_session_caps_cb()
1648 dout("removing cap %p, ci is %p, inode is %p\n", in remove_session_caps_cb()
1649 cap, ci, &ci->vfs_inode); in remove_session_caps_cb()
1650 spin_lock(&ci->i_ceph_lock); in remove_session_caps_cb()
1652 if (!ci->i_auth_cap) { in remove_session_caps_cb()
1655 if (READ_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in remove_session_caps_cb()
1656 if (inode->i_data.nrpages > 0) in remove_session_caps_cb()
1658 if (ci->i_wrbuffer_ref > 0) in remove_session_caps_cb()
1659 mapping_set_error(&inode->i_data, -EIO); in remove_session_caps_cb()
1662 while (!list_empty(&ci->i_cap_flush_list)) { in remove_session_caps_cb()
1663 cf = list_first_entry(&ci->i_cap_flush_list, in remove_session_caps_cb()
1665 list_move(&cf->i_list, &to_remove); in remove_session_caps_cb()
1668 spin_lock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1671 list_del_init(&cf->g_list); in remove_session_caps_cb()
1673 if (!list_empty(&ci->i_dirty_item)) { in remove_session_caps_cb()
1676 ceph_cap_string(ci->i_dirty_caps), in remove_session_caps_cb()
1678 ci->i_dirty_caps = 0; in remove_session_caps_cb()
1679 list_del_init(&ci->i_dirty_item); in remove_session_caps_cb()
1682 if (!list_empty(&ci->i_flushing_item)) { in remove_session_caps_cb()
1685 ceph_cap_string(ci->i_flushing_caps), in remove_session_caps_cb()
1687 ci->i_flushing_caps = 0; in remove_session_caps_cb()
1688 list_del_init(&ci->i_flushing_item); in remove_session_caps_cb()
1689 mdsc->num_cap_flushing--; in remove_session_caps_cb()
1692 spin_unlock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1695 mapping_set_error(inode->i_mapping, -EIO); in remove_session_caps_cb()
1697 if (ci->i_wrbuffer_ref_head == 0 && in remove_session_caps_cb()
1698 ci->i_wr_ref == 0 && in remove_session_caps_cb()
1699 ci->i_dirty_caps == 0 && in remove_session_caps_cb()
1700 ci->i_flushing_caps == 0) { in remove_session_caps_cb()
1701 ceph_put_snap_context(ci->i_head_snapc); in remove_session_caps_cb()
1702 ci->i_head_snapc = NULL; in remove_session_caps_cb()
1706 if (atomic_read(&ci->i_filelock_ref) > 0) { in remove_session_caps_cb()
1707 /* make further file lock syscall return -EIO */ in remove_session_caps_cb()
1708 ci->i_ceph_flags |= CEPH_I_ERROR_FILELOCK; in remove_session_caps_cb()
1713 if (!ci->i_dirty_caps && ci->i_prealloc_cap_flush) { in remove_session_caps_cb()
1714 list_add(&ci->i_prealloc_cap_flush->i_list, &to_remove); in remove_session_caps_cb()
1715 ci->i_prealloc_cap_flush = NULL; in remove_session_caps_cb()
1718 if (!list_empty(&ci->i_cap_snaps)) in remove_session_caps_cb()
1721 spin_unlock(&ci->i_ceph_lock); in remove_session_caps_cb()
1726 list_del_init(&cf->i_list); in remove_session_caps_cb()
1727 if (!cf->is_capsnap) in remove_session_caps_cb()
1731 wake_up_all(&ci->i_cap_wq); in remove_session_caps_cb()
1736 while (capsnap_release--) in remove_session_caps_cb()
1746 struct ceph_fs_client *fsc = session->s_mdsc->fsc; in remove_session_caps()
1747 struct super_block *sb = fsc->sb; in remove_session_caps()
1750 dout("remove_session_caps on %p\n", session); in remove_session_caps()
1753 wake_up_all(&fsc->mdsc->cap_flushing_wq); in remove_session_caps()
1755 spin_lock(&session->s_cap_lock); in remove_session_caps()
1756 if (session->s_nr_caps > 0) { in remove_session_caps()
1767 while (!list_empty(&session->s_caps)) { in remove_session_caps()
1768 cap = list_entry(session->s_caps.next, in remove_session_caps()
1773 vino = cap->ci->i_vino; in remove_session_caps()
1774 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1780 spin_lock(&session->s_cap_lock); in remove_session_caps()
1787 BUG_ON(session->s_nr_caps > 0); in remove_session_caps()
1788 BUG_ON(!list_empty(&session->s_cap_flushing)); in remove_session_caps()
1789 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1790 dispose_cap_releases(session->s_mdsc, &dispose); in remove_session_caps()
1812 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1813 ci->i_wanted_max_size = 0; in wake_up_session_cb()
1814 ci->i_requested_max_size = 0; in wake_up_session_cb()
1815 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1817 if (cap->cap_gen < cap->session->s_cap_gen) { in wake_up_session_cb()
1818 /* mds did not re-issue stale cap */ in wake_up_session_cb()
1819 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1820 cap->issued = cap->implemented = CEPH_CAP_PIN; in wake_up_session_cb()
1821 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1825 wake_up_all(&ci->i_cap_wq); in wake_up_session_cb()
1831 dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); in wake_up_session_caps()
1848 if (time_after_eq(jiffies, session->s_cap_ttl) && in send_renew_caps()
1849 time_after_eq(session->s_cap_ttl, session->s_renew_requested)) in send_renew_caps()
1850 pr_info("mds%d caps stale\n", session->s_mds); in send_renew_caps()
1851 session->s_renew_requested = jiffies; in send_renew_caps()
1855 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1857 dout("send_renew_caps ignoring mds%d (%s)\n", in send_renew_caps()
1858 session->s_mds, ceph_mds_state_name(state)); in send_renew_caps()
1862 dout("send_renew_caps to mds%d (%s)\n", session->s_mds, in send_renew_caps()
1865 ++session->s_renew_seq); in send_renew_caps()
1867 return -ENOMEM; in send_renew_caps()
1868 ceph_con_send(&session->s_con, msg); in send_renew_caps()
1877 dout("send_flushmsg_ack to mds%d (%s)s seq %lld\n", in send_flushmsg_ack()
1878 session->s_mds, ceph_session_state_name(session->s_state), seq); in send_flushmsg_ack()
1881 return -ENOMEM; in send_flushmsg_ack()
1882 ceph_con_send(&session->s_con, msg); in send_flushmsg_ack()
1888 * Note new cap ttl, and any transition from stale -> not stale (fresh?).
1890 * Called under session->s_mutex
1898 spin_lock(&session->s_cap_lock); in renewed_caps()
1899 was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl); in renewed_caps()
1901 session->s_cap_ttl = session->s_renew_requested + in renewed_caps()
1902 mdsc->mdsmap->m_session_timeout*HZ; in renewed_caps()
1905 if (time_before(jiffies, session->s_cap_ttl)) { in renewed_caps()
1906 pr_info("mds%d caps renewed\n", session->s_mds); in renewed_caps()
1909 pr_info("mds%d caps still stale\n", session->s_mds); in renewed_caps()
1912 dout("renewed_caps mds%d ttl now %lu, was %s, now %s\n", in renewed_caps()
1913 session->s_mds, session->s_cap_ttl, was_stale ? "stale" : "fresh", in renewed_caps()
1914 time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh"); in renewed_caps()
1915 spin_unlock(&session->s_cap_lock); in renewed_caps()
1928 dout("request_close_session mds%d state %s seq %lld\n", in request_close_session()
1929 session->s_mds, ceph_session_state_name(session->s_state), in request_close_session()
1930 session->s_seq); in request_close_session()
1932 session->s_seq); in request_close_session()
1934 return -ENOMEM; in request_close_session()
1935 ceph_con_send(&session->s_con, msg); in request_close_session()
1945 if (session->s_state >= CEPH_MDS_SESSION_CLOSING) in __close_session()
1947 session->s_state = CEPH_MDS_SESSION_CLOSING; in __close_session()
1959 spin_lock(&dentry->d_lock); in drop_negative_children()
1960 list_for_each_entry(child, &dentry->d_subdirs, d_child) { in drop_negative_children()
1966 spin_unlock(&dentry->d_lock); in drop_negative_children()
1991 return -1; in trim_caps_cb()
1993 spin_lock(&ci->i_ceph_lock); in trim_caps_cb()
1994 mine = cap->issued | cap->implemented; in trim_caps_cb()
1999 dout("trim_caps_cb %p cap %p mine %s oissued %s used %s wanted %s\n", in trim_caps_cb()
2002 if (cap == ci->i_auth_cap) { in trim_caps_cb()
2003 if (ci->i_dirty_caps || ci->i_flushing_caps || in trim_caps_cb()
2004 !list_empty(&ci->i_cap_snaps)) in trim_caps_cb()
2008 /* Note: it's possible that i_filelock_ref becomes non-zero in trim_caps_cb()
2010 * of lock mds request will re-add auth caps. */ in trim_caps_cb()
2011 if (atomic_read(&ci->i_filelock_ref) > 0) in trim_caps_cb()
2016 if (S_ISREG(inode->i_mode) && in trim_caps_cb()
2028 (*remaining)--; in trim_caps_cb()
2032 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2038 count = atomic_read(&inode->i_count); in trim_caps_cb()
2040 (*remaining)--; in trim_caps_cb()
2041 dout("trim_caps_cb %p cap %p pruned, count now %d\n", in trim_caps_cb()
2050 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2061 int trim_caps = session->s_nr_caps - max_caps; in ceph_trim_caps()
2063 dout("trim_caps mds%d start: %d / %d, trim %d\n", in ceph_trim_caps()
2064 session->s_mds, session->s_nr_caps, max_caps, trim_caps); in ceph_trim_caps()
2069 dout("trim_caps mds%d done: %d / %d, trimmed %d\n", in ceph_trim_caps()
2070 session->s_mds, session->s_nr_caps, max_caps, in ceph_trim_caps()
2071 trim_caps - remaining); in ceph_trim_caps()
2083 spin_lock(&mdsc->cap_dirty_lock); in check_caps_flush()
2084 if (!list_empty(&mdsc->cap_flush_list)) { in check_caps_flush()
2086 list_first_entry(&mdsc->cap_flush_list, in check_caps_flush()
2088 if (cf->tid <= want_flush_tid) { in check_caps_flush()
2089 dout("check_caps_flush still flushing tid " in check_caps_flush()
2090 "%llu <= %llu\n", cf->tid, want_flush_tid); in check_caps_flush()
2094 spin_unlock(&mdsc->cap_dirty_lock); in check_caps_flush()
2106 dout("check_caps_flush want %llu\n", want_flush_tid); in wait_caps_flush()
2108 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
2111 dout("check_caps_flush ok, flushed thru %llu\n", want_flush_tid); in wait_caps_flush()
2123 struct ceph_osd_client *osdc = &mdsc->fsc->client->osdc; in ceph_send_cap_releases()
2129 down_read(&osdc->lock); in ceph_send_cap_releases()
2130 barrier = cpu_to_le32(osdc->epoch_barrier); in ceph_send_cap_releases()
2131 up_read(&osdc->lock); in ceph_send_cap_releases()
2133 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2135 list_splice_init(&session->s_cap_releases, &tmp_list); in ceph_send_cap_releases()
2136 num_cap_releases = session->s_num_cap_releases; in ceph_send_cap_releases()
2137 session->s_num_cap_releases = 0; in ceph_send_cap_releases()
2138 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2146 head = msg->front.iov_base; in ceph_send_cap_releases()
2147 head->num = cpu_to_le32(0); in ceph_send_cap_releases()
2148 msg->front.iov_len = sizeof(*head); in ceph_send_cap_releases()
2150 msg->hdr.version = cpu_to_le16(2); in ceph_send_cap_releases()
2151 msg->hdr.compat_version = cpu_to_le16(1); in ceph_send_cap_releases()
2156 list_del(&cap->session_caps); in ceph_send_cap_releases()
2157 num_cap_releases--; in ceph_send_cap_releases()
2159 head = msg->front.iov_base; in ceph_send_cap_releases()
2160 put_unaligned_le32(get_unaligned_le32(&head->num) + 1, in ceph_send_cap_releases()
2161 &head->num); in ceph_send_cap_releases()
2162 item = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2163 item->ino = cpu_to_le64(cap->cap_ino); in ceph_send_cap_releases()
2164 item->cap_id = cpu_to_le64(cap->cap_id); in ceph_send_cap_releases()
2165 item->migrate_seq = cpu_to_le32(cap->mseq); in ceph_send_cap_releases()
2166 item->seq = cpu_to_le32(cap->issue_seq); in ceph_send_cap_releases()
2167 msg->front.iov_len += sizeof(*item); in ceph_send_cap_releases()
2171 if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { in ceph_send_cap_releases()
2173 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2175 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2177 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2178 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2179 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2186 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2187 if (!list_empty(&session->s_cap_releases)) in ceph_send_cap_releases()
2189 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2193 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2195 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2197 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2198 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2199 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2204 session->s_mds); in ceph_send_cap_releases()
2205 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2206 list_splice(&tmp_list, &session->s_cap_releases); in ceph_send_cap_releases()
2207 session->s_num_cap_releases += num_cap_releases; in ceph_send_cap_releases()
2208 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2216 mutex_lock(&session->s_mutex); in ceph_cap_release_work()
2217 if (session->s_state == CEPH_MDS_SESSION_OPEN || in ceph_cap_release_work()
2218 session->s_state == CEPH_MDS_SESSION_HUNG) in ceph_cap_release_work()
2219 ceph_send_cap_releases(session->s_mdsc, session); in ceph_cap_release_work()
2220 mutex_unlock(&session->s_mutex); in ceph_cap_release_work()
2227 if (mdsc->stopping) in ceph_flush_cap_releases()
2231 if (queue_work(mdsc->fsc->cap_wq, in ceph_flush_cap_releases()
2232 &session->s_cap_release_work)) { in ceph_flush_cap_releases()
2233 dout("cap release work queued\n"); in ceph_flush_cap_releases()
2236 dout("failed to queue cap release work\n"); in ceph_flush_cap_releases()
2241 * caller holds session->s_cap_lock
2246 list_add_tail(&cap->session_caps, &session->s_cap_releases); in __ceph_queue_cap_release()
2247 session->s_num_cap_releases++; in __ceph_queue_cap_release()
2249 if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE)) in __ceph_queue_cap_release()
2250 ceph_flush_cap_releases(session->s_mdsc, session); in __ceph_queue_cap_release()
2258 if (ret == -EAGAIN) in ceph_cap_reclaim_work()
2264 if (mdsc->stopping) in ceph_queue_cap_reclaim_work()
2267 if (queue_work(mdsc->fsc->cap_wq, &mdsc->cap_reclaim_work)) { in ceph_queue_cap_reclaim_work()
2268 dout("caps reclaim work queued\n"); in ceph_queue_cap_reclaim_work()
2270 dout("failed to queue caps release work\n"); in ceph_queue_cap_reclaim_work()
2279 val = atomic_add_return(nr, &mdsc->cap_reclaim_pending); in ceph_reclaim_caps_nr()
2281 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_reclaim_caps_nr()
2294 struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; in ceph_alloc_readdir_reply_buffer()
2295 struct ceph_mount_options *opt = req->r_mdsc->fsc->mount_options; in ceph_alloc_readdir_reply_buffer()
2300 spin_lock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2301 num_entries = ci->i_files + ci->i_subdirs; in ceph_alloc_readdir_reply_buffer()
2302 spin_unlock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2304 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2308 rinfo->dir_entries = (void*)__get_free_pages(GFP_KERNEL | in ceph_alloc_readdir_reply_buffer()
2311 if (rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2313 order--; in ceph_alloc_readdir_reply_buffer()
2315 if (!rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2316 return -ENOMEM; in ceph_alloc_readdir_reply_buffer()
2319 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2321 rinfo->dir_buf_size = PAGE_SIZE << order; in ceph_alloc_readdir_reply_buffer()
2322 req->r_num_caps = num_entries + 1; in ceph_alloc_readdir_reply_buffer()
2323 req->r_args.readdir.max_entries = cpu_to_le32(num_entries); in ceph_alloc_readdir_reply_buffer()
2324 req->r_args.readdir.max_bytes = cpu_to_le32(opt->max_readdir_bytes); in ceph_alloc_readdir_reply_buffer()
2338 return ERR_PTR(-ENOMEM); in ceph_mdsc_create_request()
2340 mutex_init(&req->r_fill_mutex); in ceph_mdsc_create_request()
2341 req->r_mdsc = mdsc; in ceph_mdsc_create_request()
2342 req->r_started = jiffies; in ceph_mdsc_create_request()
2343 req->r_start_latency = ktime_get(); in ceph_mdsc_create_request()
2344 req->r_resend_mds = -1; in ceph_mdsc_create_request()
2345 INIT_LIST_HEAD(&req->r_unsafe_dir_item); in ceph_mdsc_create_request()
2346 INIT_LIST_HEAD(&req->r_unsafe_target_item); in ceph_mdsc_create_request()
2347 req->r_fmode = -1; in ceph_mdsc_create_request()
2348 kref_init(&req->r_kref); in ceph_mdsc_create_request()
2349 RB_CLEAR_NODE(&req->r_node); in ceph_mdsc_create_request()
2350 INIT_LIST_HEAD(&req->r_wait); in ceph_mdsc_create_request()
2351 init_completion(&req->r_completion); in ceph_mdsc_create_request()
2352 init_completion(&req->r_safe_completion); in ceph_mdsc_create_request()
2353 INIT_LIST_HEAD(&req->r_unsafe_item); in ceph_mdsc_create_request()
2355 ktime_get_coarse_real_ts64(&req->r_stamp); in ceph_mdsc_create_request()
2357 req->r_op = op; in ceph_mdsc_create_request()
2358 req->r_direct_mode = mode; in ceph_mdsc_create_request()
2365 * called under mdsc->mutex.
2369 if (RB_EMPTY_ROOT(&mdsc->request_tree)) in __get_oldest_req()
2371 return rb_entry(rb_first(&mdsc->request_tree), in __get_oldest_req()
2377 return mdsc->oldest_tid; in __get_oldest_tid()
2384 * If @stop_on_nosnap, generate path relative to the first non-snapped
2388 * foo/.snap/bar -> foo//bar
2400 return ERR_PTR(-EINVAL); in ceph_mdsc_build_path()
2404 return ERR_PTR(-ENOMEM); in ceph_mdsc_build_path()
2406 pos = PATH_MAX - 1; in ceph_mdsc_build_path()
2415 spin_lock(&temp->d_lock); in ceph_mdsc_build_path()
2418 dout("build_path path+%d: %p SNAPDIR\n", in ceph_mdsc_build_path()
2422 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2426 pos -= temp->d_name.len; in ceph_mdsc_build_path()
2428 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2431 memcpy(path + pos, temp->d_name.name, temp->d_name.len); in ceph_mdsc_build_path()
2433 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2434 temp = READ_ONCE(temp->d_parent); in ceph_mdsc_build_path()
2441 if (--pos < 0) in ceph_mdsc_build_path()
2463 *plen = PATH_MAX - 1 - pos; in ceph_mdsc_build_path()
2464 dout("build_path on %p %d built %llx '%.*s'\n", in ceph_mdsc_build_path()
2477 dir = d_inode_rcu(dentry->d_parent); in build_dentry_path()
2481 *ppath = dentry->d_name.name; in build_dentry_path()
2482 *ppathlen = dentry->d_name.len; in build_dentry_path()
2529 dout(" inode %p %llx.%llx\n", rinode, ceph_ino(rinode), in set_request_path_attr()
2534 dout(" dentry %p %llx/%.*s\n", rdentry, *ino, *pathlen, in set_request_path_attr()
2540 dout(" path %.*s\n", *pathlen, rpath); in set_request_path_attr()
2547 * called under mdsc->mutex
2565 ret = set_request_path_attr(req->r_inode, req->r_dentry, in create_request_message()
2566 req->r_parent, req->r_path1, req->r_ino1.ino, in create_request_message()
2569 &req->r_req_flags)); in create_request_message()
2576 ret = set_request_path_attr(NULL, req->r_old_dentry, in create_request_message()
2577 req->r_old_dentry_dir, in create_request_message()
2578 req->r_path2, req->r_ino2.ino, in create_request_message()
2586 pathlen1 + pathlen2 + 2*(1 + sizeof(u32) + sizeof(u64)) + in create_request_message()
2591 (!!req->r_inode_drop + !!req->r_dentry_drop + in create_request_message()
2592 !!req->r_old_inode_drop + !!req->r_old_dentry_drop); in create_request_message()
2593 if (req->r_dentry_drop) in create_request_message()
2595 if (req->r_old_dentry_drop) in create_request_message()
2600 msg = ERR_PTR(-ENOMEM); in create_request_message()
2604 msg->hdr.version = cpu_to_le16(2); in create_request_message()
2605 msg->hdr.tid = cpu_to_le64(req->r_tid); in create_request_message()
2607 head = msg->front.iov_base; in create_request_message()
2608 p = msg->front.iov_base + sizeof(*head); in create_request_message()
2609 end = msg->front.iov_base + msg->front.iov_len; in create_request_message()
2611 head->mdsmap_epoch = cpu_to_le32(mdsc->mdsmap->m_epoch); in create_request_message()
2612 head->op = cpu_to_le32(req->r_op); in create_request_message()
2613 head->caller_uid = cpu_to_le32(from_kuid(&init_user_ns, req->r_uid)); in create_request_message()
2614 head->caller_gid = cpu_to_le32(from_kgid(&init_user_ns, req->r_gid)); in create_request_message()
2615 head->ino = cpu_to_le64(req->r_deleg_ino); in create_request_message()
2616 head->args = req->r_args; in create_request_message()
2622 req->r_request_release_offset = p - msg->front.iov_base; in create_request_message()
2626 if (req->r_inode_drop) in create_request_message()
2628 req->r_inode ? req->r_inode : d_inode(req->r_dentry), in create_request_message()
2629 mds, req->r_inode_drop, req->r_inode_unless, in create_request_message()
2630 req->r_op == CEPH_MDS_OP_READDIR); in create_request_message()
2631 if (req->r_dentry_drop) in create_request_message()
2632 releases += ceph_encode_dentry_release(&p, req->r_dentry, in create_request_message()
2633 req->r_parent, mds, req->r_dentry_drop, in create_request_message()
2634 req->r_dentry_unless); in create_request_message()
2635 if (req->r_old_dentry_drop) in create_request_message()
2636 releases += ceph_encode_dentry_release(&p, req->r_old_dentry, in create_request_message()
2637 req->r_old_dentry_dir, mds, in create_request_message()
2638 req->r_old_dentry_drop, in create_request_message()
2639 req->r_old_dentry_unless); in create_request_message()
2640 if (req->r_old_inode_drop) in create_request_message()
2642 d_inode(req->r_old_dentry), in create_request_message()
2643 mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); in create_request_message()
2647 p = msg->front.iov_base + req->r_request_release_offset; in create_request_message()
2650 head->num_releases = cpu_to_le16(releases); in create_request_message()
2655 ceph_encode_timespec64(&ts, &req->r_stamp); in create_request_message()
2661 msg = ERR_PTR(-ERANGE); in create_request_message()
2665 msg->front.iov_len = p - msg->front.iov_base; in create_request_message()
2666 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_request_message()
2668 if (req->r_pagelist) { in create_request_message()
2669 struct ceph_pagelist *pagelist = req->r_pagelist; in create_request_message()
2671 msg->hdr.data_len = cpu_to_le32(pagelist->length); in create_request_message()
2673 msg->hdr.data_len = 0; in create_request_message()
2676 msg->hdr.data_off = cpu_to_le16(0); in create_request_message()
2689 * called under mdsc->mutex if error, under no mutex if
2695 req->r_end_latency = ktime_get(); in complete_request()
2697 if (req->r_callback) in complete_request()
2698 req->r_callback(mdsc, req); in complete_request()
2699 complete_all(&req->r_completion); in complete_request()
2703 * called under mdsc->mutex
2713 req->r_attempts++; in __prepare_send_request()
2714 if (req->r_inode) { in __prepare_send_request()
2716 ceph_get_cap_for_mds(ceph_inode(req->r_inode), mds); in __prepare_send_request()
2719 req->r_sent_on_mseq = cap->mseq; in __prepare_send_request()
2721 req->r_sent_on_mseq = -1; in __prepare_send_request()
2723 dout("prepare_send_request %p tid %lld %s (attempt %d)\n", req, in __prepare_send_request()
2724 req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); in __prepare_send_request()
2726 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __prepare_send_request()
2734 msg = req->r_request; in __prepare_send_request()
2735 rhead = msg->front.iov_base; in __prepare_send_request()
2737 flags = le32_to_cpu(rhead->flags); in __prepare_send_request()
2739 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2741 if (req->r_target_inode) in __prepare_send_request()
2742 rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); in __prepare_send_request()
2744 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2747 rhead->num_releases = 0; in __prepare_send_request()
2750 p = msg->front.iov_base + req->r_request_release_offset; in __prepare_send_request()
2753 ceph_encode_timespec64(&ts, &req->r_stamp); in __prepare_send_request()
2757 msg->front.iov_len = p - msg->front.iov_base; in __prepare_send_request()
2758 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in __prepare_send_request()
2762 if (req->r_request) { in __prepare_send_request()
2763 ceph_msg_put(req->r_request); in __prepare_send_request()
2764 req->r_request = NULL; in __prepare_send_request()
2768 req->r_err = PTR_ERR(msg); in __prepare_send_request()
2771 req->r_request = msg; in __prepare_send_request()
2773 rhead = msg->front.iov_base; in __prepare_send_request()
2774 rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc)); in __prepare_send_request()
2775 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in __prepare_send_request()
2777 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) in __prepare_send_request()
2779 if (req->r_parent) in __prepare_send_request()
2781 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2782 rhead->num_fwd = req->r_num_fwd; in __prepare_send_request()
2783 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2785 dout(" r_parent = %p\n", req->r_parent); in __prepare_send_request()
2790 * called under mdsc->mutex
2799 err = __prepare_send_request(mdsc, req, session->s_mds, in __send_request()
2802 ceph_msg_get(req->r_request); in __send_request()
2803 ceph_con_send(&session->s_con, req->r_request); in __send_request()
2816 int mds = -1; in __do_request()
2820 if (req->r_err || test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in __do_request()
2821 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) in __do_request()
2826 if (req->r_timeout && in __do_request()
2827 time_after_eq(jiffies, req->r_started + req->r_timeout)) { in __do_request()
2828 dout("do_request timed out\n"); in __do_request()
2829 err = -ETIMEDOUT; in __do_request()
2832 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in __do_request()
2833 dout("do_request forced umount\n"); in __do_request()
2834 err = -EIO; in __do_request()
2837 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_MOUNTING) { in __do_request()
2838 if (mdsc->mdsmap_err) { in __do_request()
2839 err = mdsc->mdsmap_err; in __do_request()
2840 dout("do_request mdsmap err %d\n", err); in __do_request()
2843 if (mdsc->mdsmap->m_epoch == 0) { in __do_request()
2844 dout("do_request no mdsmap, waiting for map\n"); in __do_request()
2845 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2848 if (!(mdsc->fsc->mount_options->flags & in __do_request()
2850 !ceph_mdsmap_is_cluster_available(mdsc->mdsmap)) { in __do_request()
2851 err = -EHOSTUNREACH; in __do_request()
2860 ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { in __do_request()
2861 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2862 err = -EJUKEBOX; in __do_request()
2865 dout("do_request no mds or not active, waiting for map\n"); in __do_request()
2866 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2879 req->r_session = ceph_get_mds_session(session); in __do_request()
2881 dout("do_request mds%d session %p state %s\n", mds, session, in __do_request()
2882 ceph_session_state_name(session->s_state)); in __do_request()
2883 if (session->s_state != CEPH_MDS_SESSION_OPEN && in __do_request()
2884 session->s_state != CEPH_MDS_SESSION_HUNG) { in __do_request()
2885 if (session->s_state == CEPH_MDS_SESSION_REJECTED) { in __do_request()
2886 err = -EACCES; in __do_request()
2891 * inodes are bound to the session. Just return -EJUKEBOX and in __do_request()
2894 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2895 err = -EJUKEBOX; in __do_request()
2898 if (session->s_state == CEPH_MDS_SESSION_NEW || in __do_request()
2899 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __do_request()
2905 req->r_resend_mds = mds; in __do_request()
2907 list_add(&req->r_wait, &session->s_waiting); in __do_request()
2912 req->r_resend_mds = -1; /* forget any previous mds hint */ in __do_request()
2914 if (req->r_request_started == 0) /* note request start time */ in __do_request()
2915 req->r_request_started = jiffies; in __do_request()
2923 dout("__do_request early error %d\n", err); in __do_request()
2924 req->r_err = err; in __do_request()
2932 * called under mdsc->mutex
2945 list_del_init(&req->r_wait); in __wake_requests()
2946 dout(" wake request %p tid %llu\n", req, req->r_tid); in __wake_requests()
2958 struct rb_node *p = rb_first(&mdsc->request_tree); in kick_requests()
2960 dout("kick_requests mds%d\n", mds); in kick_requests()
2964 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in kick_requests()
2966 if (req->r_attempts > 0) in kick_requests()
2968 if (req->r_session && in kick_requests()
2969 req->r_session->s_mds == mds) { in kick_requests()
2970 dout(" kicking tid %llu\n", req->r_tid); in kick_requests()
2971 list_del_init(&req->r_wait); in kick_requests()
2983 if (req->r_inode) in ceph_mdsc_submit_request()
2984 ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_submit_request()
2985 if (req->r_parent) { in ceph_mdsc_submit_request()
2986 struct ceph_inode_info *ci = ceph_inode(req->r_parent); in ceph_mdsc_submit_request()
2987 int fmode = (req->r_op & CEPH_MDS_OP_WRITE) ? in ceph_mdsc_submit_request()
2989 spin_lock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2992 spin_unlock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2993 ihold(req->r_parent); in ceph_mdsc_submit_request()
2995 if (req->r_old_dentry_dir) in ceph_mdsc_submit_request()
2996 ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_submit_request()
2999 if (req->r_inode) { in ceph_mdsc_submit_request()
3000 err = ceph_wait_on_async_create(req->r_inode); in ceph_mdsc_submit_request()
3002 dout("%s: wait for async create returned: %d\n", in ceph_mdsc_submit_request()
3008 if (!err && req->r_old_inode) { in ceph_mdsc_submit_request()
3009 err = ceph_wait_on_async_create(req->r_old_inode); in ceph_mdsc_submit_request()
3011 dout("%s: wait for async create returned: %d\n", in ceph_mdsc_submit_request()
3017 dout("submit_request on %p for inode %p\n", req, dir); in ceph_mdsc_submit_request()
3018 mutex_lock(&mdsc->mutex); in ceph_mdsc_submit_request()
3021 err = req->r_err; in ceph_mdsc_submit_request()
3022 mutex_unlock(&mdsc->mutex); in ceph_mdsc_submit_request()
3032 dout("do_request waiting\n"); in ceph_mdsc_wait_request()
3033 if (!req->r_timeout && req->r_wait_for_completion) { in ceph_mdsc_wait_request()
3034 err = req->r_wait_for_completion(mdsc, req); in ceph_mdsc_wait_request()
3037 &req->r_completion, in ceph_mdsc_wait_request()
3038 ceph_timeout_jiffies(req->r_timeout)); in ceph_mdsc_wait_request()
3042 err = -ETIMEDOUT; /* timed out */ in ceph_mdsc_wait_request()
3046 dout("do_request waited, got %d\n", err); in ceph_mdsc_wait_request()
3047 mutex_lock(&mdsc->mutex); in ceph_mdsc_wait_request()
3050 if (test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in ceph_mdsc_wait_request()
3051 err = le32_to_cpu(req->r_reply_info.head->result); in ceph_mdsc_wait_request()
3053 dout("aborted request %lld with %d\n", req->r_tid, err); in ceph_mdsc_wait_request()
3060 mutex_lock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3061 req->r_err = err; in ceph_mdsc_wait_request()
3062 set_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags); in ceph_mdsc_wait_request()
3063 mutex_unlock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3065 if (req->r_parent && in ceph_mdsc_wait_request()
3066 (req->r_op & CEPH_MDS_OP_WRITE)) in ceph_mdsc_wait_request()
3069 err = req->r_err; in ceph_mdsc_wait_request()
3072 mutex_unlock(&mdsc->mutex); in ceph_mdsc_wait_request()
3086 dout("do_request on %p\n", req); in ceph_mdsc_do_request()
3092 dout("do_request %p done, result %d\n", req, err); in ceph_mdsc_do_request()
3102 struct inode *dir = req->r_parent; in ceph_invalidate_dir_request()
3103 struct inode *old_dir = req->r_old_dentry_dir; in ceph_invalidate_dir_request()
3105 dout("invalidate_dir_request %p %p (complete, lease(s))\n", dir, old_dir); in ceph_invalidate_dir_request()
3110 if (req->r_dentry) in ceph_invalidate_dir_request()
3111 ceph_invalidate_dentry_lease(req->r_dentry); in ceph_invalidate_dir_request()
3112 if (req->r_old_dentry) in ceph_invalidate_dir_request()
3113 ceph_invalidate_dentry_lease(req->r_old_dentry); in ceph_invalidate_dir_request()
3125 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply()
3127 struct ceph_mds_reply_head *head = msg->front.iov_base; in handle_reply()
3132 int mds = session->s_mds; in handle_reply()
3134 if (msg->front.iov_len < sizeof(*head)) { in handle_reply()
3141 tid = le64_to_cpu(msg->hdr.tid); in handle_reply()
3142 mutex_lock(&mdsc->mutex); in handle_reply()
3145 dout("handle_reply on unknown tid %llu\n", tid); in handle_reply()
3146 mutex_unlock(&mdsc->mutex); in handle_reply()
3149 dout("handle_reply %p\n", req); in handle_reply()
3152 if (req->r_session != session) { in handle_reply()
3154 " not mds%d\n", tid, session->s_mds, in handle_reply()
3155 req->r_session ? req->r_session->s_mds : -1); in handle_reply()
3156 mutex_unlock(&mdsc->mutex); in handle_reply()
3161 if ((test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags) && !head->safe) || in handle_reply()
3162 (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags) && head->safe)) { in handle_reply()
3164 head->safe ? "safe" : "unsafe", tid, mds); in handle_reply()
3165 mutex_unlock(&mdsc->mutex); in handle_reply()
3168 if (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags)) { in handle_reply()
3171 mutex_unlock(&mdsc->mutex); in handle_reply()
3175 result = le32_to_cpu(head->result); in handle_reply()
3184 if (result == -ESTALE) { in handle_reply()
3185 dout("got ESTALE on request %llu\n", req->r_tid); in handle_reply()
3186 req->r_resend_mds = -1; in handle_reply()
3187 if (req->r_direct_mode != USE_AUTH_MDS) { in handle_reply()
3188 dout("not using auth, setting for that now\n"); in handle_reply()
3189 req->r_direct_mode = USE_AUTH_MDS; in handle_reply()
3191 mutex_unlock(&mdsc->mutex); in handle_reply()
3195 if (mds >= 0 && mds != req->r_session->s_mds) { in handle_reply()
3196 dout("but auth changed, so resending\n"); in handle_reply()
3198 mutex_unlock(&mdsc->mutex); in handle_reply()
3202 dout("have to return ESTALE on request %llu\n", req->r_tid); in handle_reply()
3206 if (head->safe) { in handle_reply()
3207 set_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags); in handle_reply()
3211 if (mdsc->stopping && !__get_oldest_req(mdsc)) in handle_reply()
3212 complete_all(&mdsc->safe_umount_waiters); in handle_reply()
3214 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3222 dout("got safe reply %llu, mds%d\n", tid, mds); in handle_reply()
3224 mutex_unlock(&mdsc->mutex); in handle_reply()
3228 set_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags); in handle_reply()
3229 list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); in handle_reply()
3232 dout("handle_reply tid %lld result %d\n", tid, result); in handle_reply()
3233 rinfo = &req->r_reply_info; in handle_reply()
3234 if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features)) in handle_reply()
3235 err = parse_reply_info(session, msg, rinfo, (u64)-1); in handle_reply()
3237 err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features); in handle_reply()
3238 mutex_unlock(&mdsc->mutex); in handle_reply()
3240 mutex_lock(&session->s_mutex); in handle_reply()
3249 if (rinfo->snapblob_len) { in handle_reply()
3250 down_write(&mdsc->snap_rwsem); in handle_reply()
3251 ceph_update_snap_trace(mdsc, rinfo->snapblob, in handle_reply()
3252 rinfo->snapblob + rinfo->snapblob_len, in handle_reply()
3253 le32_to_cpu(head->op) == CEPH_MDS_OP_RMSNAP, in handle_reply()
3255 downgrade_write(&mdsc->snap_rwsem); in handle_reply()
3257 down_read(&mdsc->snap_rwsem); in handle_reply()
3261 mutex_lock(&req->r_fill_mutex); in handle_reply()
3262 current->journal_info = req; in handle_reply()
3263 err = ceph_fill_trace(mdsc->fsc->sb, req); in handle_reply()
3265 if (result == 0 && (req->r_op == CEPH_MDS_OP_READDIR || in handle_reply()
3266 req->r_op == CEPH_MDS_OP_LSSNAP)) in handle_reply()
3267 ceph_readdir_prepopulate(req, req->r_session); in handle_reply()
3269 current->journal_info = NULL; in handle_reply()
3270 mutex_unlock(&req->r_fill_mutex); in handle_reply()
3272 up_read(&mdsc->snap_rwsem); in handle_reply()
3277 if (req->r_target_inode && in handle_reply()
3278 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3280 ceph_inode(req->r_target_inode); in handle_reply()
3281 spin_lock(&ci->i_unsafe_lock); in handle_reply()
3282 list_add_tail(&req->r_unsafe_target_item, in handle_reply()
3283 &ci->i_unsafe_iops); in handle_reply()
3284 spin_unlock(&ci->i_unsafe_lock); in handle_reply()
3287 ceph_unreserve_caps(mdsc, &req->r_caps_reservation); in handle_reply()
3290 mutex_lock(&mdsc->mutex); in handle_reply()
3291 if (!test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_reply()
3293 req->r_err = err; in handle_reply()
3295 req->r_reply = ceph_msg_get(msg); in handle_reply()
3296 set_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags); in handle_reply()
3299 dout("reply arrived after request %lld was aborted\n", tid); in handle_reply()
3301 mutex_unlock(&mdsc->mutex); in handle_reply()
3303 mutex_unlock(&session->s_mutex); in handle_reply()
3308 ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency, in handle_reply()
3309 req->r_end_latency, err); in handle_reply()
3325 u64 tid = le64_to_cpu(msg->hdr.tid); in handle_forward()
3328 int err = -EINVAL; in handle_forward()
3329 void *p = msg->front.iov_base; in handle_forward()
3330 void *end = p + msg->front.iov_len; in handle_forward()
3332 ceph_decode_need(&p, end, 2*sizeof(u32), bad); in handle_forward()
3336 mutex_lock(&mdsc->mutex); in handle_forward()
3339 dout("forward tid %llu to mds%d - req dne\n", tid, next_mds); in handle_forward()
3343 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_forward()
3344 dout("forward tid %llu aborted, unregistering\n", tid); in handle_forward()
3346 } else if (fwd_seq <= req->r_num_fwd) { in handle_forward()
3347 dout("forward tid %llu to mds%d - old seq %d <= %d\n", in handle_forward()
3348 tid, next_mds, req->r_num_fwd, fwd_seq); in handle_forward()
3351 dout("forward tid %llu to mds%d (we resend)\n", tid, next_mds); in handle_forward()
3352 BUG_ON(req->r_err); in handle_forward()
3353 BUG_ON(test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)); in handle_forward()
3354 req->r_attempts = 0; in handle_forward()
3355 req->r_num_fwd = fwd_seq; in handle_forward()
3356 req->r_resend_mds = next_mds; in handle_forward()
3362 mutex_unlock(&mdsc->mutex); in handle_forward()
3376 while (n-- > 0) { in __decode_session_metadata()
3394 return -1; in __decode_session_metadata()
3403 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session()
3404 int mds = session->s_mds; in handle_session()
3405 int msg_version = le16_to_cpu(msg->hdr.version); in handle_session()
3406 void *p = msg->front.iov_base; in handle_session()
3407 void *end = p + msg->front.iov_len; in handle_session()
3419 op = le32_to_cpu(h->op); in handle_session()
3420 seq = le64_to_cpu(h->seq); in handle_session()
3424 /* version >= 2, metadata */ in handle_session()
3431 p += len - sizeof(features); in handle_session()
3435 mutex_lock(&mdsc->mutex); in handle_session()
3441 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
3442 mutex_unlock(&mdsc->mutex); in handle_session()
3444 mutex_lock(&session->s_mutex); in handle_session()
3446 dout("handle_session mds%d %s %p state %s seq %llu\n", in handle_session()
3448 ceph_session_state_name(session->s_state), seq); in handle_session()
3450 if (session->s_state == CEPH_MDS_SESSION_HUNG) { in handle_session()
3451 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3452 pr_info("mds%d came back\n", session->s_mds); in handle_session()
3457 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3458 pr_info("mds%d reconnect success\n", session->s_mds); in handle_session()
3459 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3460 session->s_features = features; in handle_session()
3462 if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features)) in handle_session()
3463 metric_schedule_delayed(&mdsc->metric); in handle_session()
3465 if (mdsc->stopping) in handle_session()
3470 if (session->s_renew_seq == seq) in handle_session()
3475 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3476 pr_info("mds%d reconnect denied\n", session->s_mds); in handle_session()
3477 session->s_state = CEPH_MDS_SESSION_CLOSED; in handle_session()
3480 wake = 2; /* for good measure */ in handle_session()
3481 wake_up_all(&mdsc->session_close_wq); in handle_session()
3486 session->s_mds); in handle_session()
3487 spin_lock(&session->s_gen_ttl_lock); in handle_session()
3488 session->s_cap_gen++; in handle_session()
3489 session->s_cap_ttl = jiffies - 1; in handle_session()
3490 spin_unlock(&session->s_gen_ttl_lock); in handle_session()
3495 ceph_trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
3500 spin_lock(&session->s_cap_lock); in handle_session()
3501 if (session->s_num_cap_releases) in handle_session()
3503 spin_unlock(&session->s_cap_lock); in handle_session()
3509 dout("force_session_readonly %p\n", session); in handle_session()
3510 spin_lock(&session->s_cap_lock); in handle_session()
3511 session->s_readonly = true; in handle_session()
3512 spin_unlock(&session->s_cap_lock); in handle_session()
3517 WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); in handle_session()
3518 pr_info("mds%d rejected session\n", session->s_mds); in handle_session()
3519 session->s_state = CEPH_MDS_SESSION_REJECTED; in handle_session()
3523 mdsc->fsc->blocklisted = true; in handle_session()
3524 wake = 2; /* for good measure */ in handle_session()
3527 default: in handle_session()
3532 mutex_unlock(&session->s_mutex); in handle_session()
3534 mutex_lock(&mdsc->mutex); in handle_session()
3535 __wake_requests(mdsc, &session->s_waiting); in handle_session()
3536 if (wake == 2) in handle_session()
3538 mutex_unlock(&mdsc->mutex); in handle_session()
3546 (int)msg->front.iov_len); in handle_session()
3555 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps()
3557 dout("releasing r_dir_caps=%s\n", ceph_cap_string(dcaps)); in ceph_mdsc_release_dir_caps()
3558 ceph_put_cap_refs(ceph_inode(req->r_parent), dcaps); in ceph_mdsc_release_dir_caps()
3566 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps_no_check()
3568 dout("releasing r_dir_caps=%s\n", ceph_cap_string(dcaps)); in ceph_mdsc_release_dir_caps_no_check()
3569 ceph_put_cap_refs_no_check_caps(ceph_inode(req->r_parent), in ceph_mdsc_release_dir_caps_no_check()
3575 * called under session->mutex.
3583 dout("replay_unsafe_requests mds%d\n", session->s_mds); in replay_unsafe_requests()
3585 mutex_lock(&mdsc->mutex); in replay_unsafe_requests()
3586 list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) in replay_unsafe_requests()
3590 * also re-send old requests when MDS enters reconnect stage. So that MDS in replay_unsafe_requests()
3593 p = rb_first(&mdsc->request_tree); in replay_unsafe_requests()
3597 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in replay_unsafe_requests()
3599 if (req->r_attempts == 0) in replay_unsafe_requests()
3601 if (!req->r_session) in replay_unsafe_requests()
3603 if (req->r_session->s_mds != session->s_mds) in replay_unsafe_requests()
3610 mutex_unlock(&mdsc->mutex); in replay_unsafe_requests()
3619 int err = -ENOMEM; in send_reconnect_partial()
3621 if (!recon_state->allow_multi) in send_reconnect_partial()
3622 return -ENOSPC; in send_reconnect_partial()
3625 BUG_ON(!recon_state->nr_caps == !recon_state->nr_realms); in send_reconnect_partial()
3627 /* pre-allocate new pagelist */ in send_reconnect_partial()
3630 return -ENOMEM; in send_reconnect_partial()
3641 if (recon_state->nr_caps) { in send_reconnect_partial()
3643 err = ceph_pagelist_encode_32(recon_state->pagelist, 0); in send_reconnect_partial()
3653 err = ceph_pagelist_encode_8(recon_state->pagelist, 1); in send_reconnect_partial()
3657 page = list_first_entry(&recon_state->pagelist->head, struct page, lru); in send_reconnect_partial()
3659 if (recon_state->nr_caps) { in send_reconnect_partial()
3661 *addr = cpu_to_le32(recon_state->nr_caps); in send_reconnect_partial()
3664 *(addr + 1) = cpu_to_le32(recon_state->nr_realms); in send_reconnect_partial()
3668 reply->hdr.version = cpu_to_le16(5); in send_reconnect_partial()
3669 reply->hdr.compat_version = cpu_to_le16(4); in send_reconnect_partial()
3671 reply->hdr.data_len = cpu_to_le32(recon_state->pagelist->length); in send_reconnect_partial()
3672 ceph_msg_data_add_pagelist(reply, recon_state->pagelist); in send_reconnect_partial()
3674 ceph_con_send(&recon_state->session->s_con, reply); in send_reconnect_partial()
3675 ceph_pagelist_release(recon_state->pagelist); in send_reconnect_partial()
3677 recon_state->pagelist = _pagelist; in send_reconnect_partial()
3678 recon_state->nr_caps = 0; in send_reconnect_partial()
3679 recon_state->nr_realms = 0; in send_reconnect_partial()
3680 recon_state->msg_version = 5; in send_reconnect_partial()
3693 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3696 spin_lock(&inode->i_lock); in d_find_primary()
3697 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3700 if (S_ISDIR(inode->i_mode)) { in d_find_primary()
3701 alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias); in d_find_primary()
3707 hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { in d_find_primary()
3708 spin_lock(&alias->d_lock); in d_find_primary()
3710 (ceph_dentry(alias)->flags & CEPH_DENTRY_PRIMARY_LINK)) { in d_find_primary()
3713 spin_unlock(&alias->d_lock); in d_find_primary()
3718 spin_unlock(&inode->i_lock); in d_find_primary()
3732 struct ceph_inode_info *ci = cap->ci; in reconnect_caps_cb()
3734 struct ceph_pagelist *pagelist = recon_state->pagelist; in reconnect_caps_cb()
3741 dout(" adding %p ino %llx.%llx cap %p %lld %s\n", in reconnect_caps_cb()
3742 inode, ceph_vinop(inode), cap, cap->cap_id, in reconnect_caps_cb()
3743 ceph_cap_string(cap->issued)); in reconnect_caps_cb()
3747 /* set pathbase to parent dir when msg_version >= 2 */ in reconnect_caps_cb()
3749 recon_state->msg_version >= 2); in reconnect_caps_cb()
3760 spin_lock(&ci->i_ceph_lock); in reconnect_caps_cb()
3761 cap->seq = 0; /* reset cap seq */ in reconnect_caps_cb()
3762 cap->issue_seq = 0; /* and issue_seq */ in reconnect_caps_cb()
3763 cap->mseq = 0; /* and migrate_seq */ in reconnect_caps_cb()
3764 cap->cap_gen = cap->session->s_cap_gen; in reconnect_caps_cb()
3767 if (S_ISDIR(inode->i_mode)) { in reconnect_caps_cb()
3768 if (cap->issued & CEPH_CAP_DIR_CREATE) { in reconnect_caps_cb()
3769 ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); in reconnect_caps_cb()
3770 memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout)); in reconnect_caps_cb()
3772 cap->issued &= ~CEPH_CAP_ANY_DIR_OPS; in reconnect_caps_cb()
3775 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3776 rec.v2.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3778 rec.v2.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3779 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3782 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1); in reconnect_caps_cb()
3784 rec.v1.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3786 rec.v1.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3787 rec.v1.size = cpu_to_le64(inode->i_size); in reconnect_caps_cb()
3788 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime); in reconnect_caps_cb()
3789 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime); in reconnect_caps_cb()
3790 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3794 if (list_empty(&ci->i_cap_snaps)) { in reconnect_caps_cb()
3795 snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0; in reconnect_caps_cb()
3798 list_first_entry(&ci->i_cap_snaps, in reconnect_caps_cb()
3800 snap_follows = capsnap->follows; in reconnect_caps_cb()
3802 spin_unlock(&ci->i_ceph_lock); in reconnect_caps_cb()
3804 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3822 err = -ENOMEM; in reconnect_caps_cb()
3831 if (err == -ENOSPC) in reconnect_caps_cb()
3840 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3842 total_len += 2 * sizeof(u8) + sizeof(u32); in reconnect_caps_cb()
3843 struct_v = 2; in reconnect_caps_cb()
3848 struct_len = 2 * sizeof(u32) + in reconnect_caps_cb()
3855 if (struct_v >= 2) in reconnect_caps_cb()
3860 if (pagelist->length + total_len > RECONNECT_MAX_SIZE) { in reconnect_caps_cb()
3864 pagelist = recon_state->pagelist; in reconnect_caps_cb()
3872 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3881 if (struct_v >= 2) in reconnect_caps_cb()
3900 recon_state->nr_caps++; in reconnect_caps_cb()
3908 struct ceph_pagelist *pagelist = recon_state->pagelist; in encode_snap_realms()
3911 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3912 err = ceph_pagelist_encode_32(pagelist, mdsc->num_snap_realms); in encode_snap_realms()
3922 for (p = rb_first(&mdsc->snap_realms); p; p = rb_next(p)) { in encode_snap_realms()
3927 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3928 size_t need = sizeof(u8) * 2 + sizeof(u32) + in encode_snap_realms()
3931 if (pagelist->length + need > RECONNECT_MAX_SIZE) { in encode_snap_realms()
3935 pagelist = recon_state->pagelist; in encode_snap_realms()
3947 dout(" adding snap realm %llx seq %lld parent %llx\n", in encode_snap_realms()
3948 realm->ino, realm->seq, realm->parent_ino); in encode_snap_realms()
3949 sr_rec.ino = cpu_to_le64(realm->ino); in encode_snap_realms()
3950 sr_rec.seq = cpu_to_le64(realm->seq); in encode_snap_realms()
3951 sr_rec.parent = cpu_to_le64(realm->parent_ino); in encode_snap_realms()
3957 recon_state->nr_realms++; in encode_snap_realms()
3978 int mds = session->s_mds; in send_mds_reconnect()
3979 int err = -ENOMEM; in send_mds_reconnect()
3995 xa_destroy(&session->s_delegated_inos); in send_mds_reconnect()
3997 mutex_lock(&session->s_mutex); in send_mds_reconnect()
3998 session->s_state = CEPH_MDS_SESSION_RECONNECTING; in send_mds_reconnect()
3999 session->s_seq = 0; in send_mds_reconnect()
4001 dout("session %p state %s\n", session, in send_mds_reconnect()
4002 ceph_session_state_name(session->s_state)); in send_mds_reconnect()
4004 spin_lock(&session->s_gen_ttl_lock); in send_mds_reconnect()
4005 session->s_cap_gen++; in send_mds_reconnect()
4006 spin_unlock(&session->s_gen_ttl_lock); in send_mds_reconnect()
4008 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
4010 session->s_readonly = 0; in send_mds_reconnect()
4016 session->s_cap_reconnect = 1; in send_mds_reconnect()
4019 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4023 if (mdsc->fsc->sb->s_root) in send_mds_reconnect()
4024 shrink_dcache_parent(mdsc->fsc->sb->s_root); in send_mds_reconnect()
4026 ceph_con_close(&session->s_con); in send_mds_reconnect()
4027 ceph_con_open(&session->s_con, in send_mds_reconnect()
4029 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in send_mds_reconnect()
4036 down_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4043 if (test_bit(CEPHFS_FEATURE_MULTI_RECONNECT, &session->s_features)) { in send_mds_reconnect()
4046 } else if (session->s_con.peer_features & CEPH_FEATURE_MDSENC) { in send_mds_reconnect()
4049 recon_state.msg_version = 2; in send_mds_reconnect()
4054 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
4055 session->s_cap_reconnect = 0; in send_mds_reconnect()
4056 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4062 if (mdsc->num_snap_realms) { in send_mds_reconnect()
4064 recon_state.pagelist->length + in send_mds_reconnect()
4065 mdsc->num_snap_realms * in send_mds_reconnect()
4071 total_len += mdsc->num_snap_realms * in send_mds_reconnect()
4072 (2 * sizeof(u8) + sizeof(u32)); in send_mds_reconnect()
4076 err = -ENOSPC; in send_mds_reconnect()
4100 list_first_entry(&recon_state.pagelist->head, in send_mds_reconnect()
4104 WARN_ON(recon_state.nr_realms != mdsc->num_snap_realms); in send_mds_reconnect()
4112 reply->hdr.version = cpu_to_le16(recon_state.msg_version); in send_mds_reconnect()
4114 reply->hdr.compat_version = cpu_to_le16(4); in send_mds_reconnect()
4116 reply->hdr.data_len = cpu_to_le32(recon_state.pagelist->length); in send_mds_reconnect()
4119 ceph_con_send(&session->s_con, reply); in send_mds_reconnect()
4121 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4123 mutex_lock(&mdsc->mutex); in send_mds_reconnect()
4124 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
4125 mutex_unlock(&mdsc->mutex); in send_mds_reconnect()
4127 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4133 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4134 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4147 * called under mdsc->mutex.
4157 dout("check_new_map new %u old %u\n", in check_new_map()
4158 newmap->m_epoch, oldmap->m_epoch); in check_new_map()
4160 for (i = 0; i < oldmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4161 if (!mdsc->sessions[i]) in check_new_map()
4163 s = mdsc->sessions[i]; in check_new_map()
4167 dout("check_new_map mds%d state %s%s -> %s%s (session %s)\n", in check_new_map()
4172 ceph_session_state_name(s->s_state)); in check_new_map()
4174 if (i >= newmap->possible_max_rank) { in check_new_map()
4178 __wake_requests(mdsc, &s->s_waiting); in check_new_map()
4179 mutex_unlock(&mdsc->mutex); in check_new_map()
4181 mutex_lock(&s->s_mutex); in check_new_map()
4184 mutex_unlock(&s->s_mutex); in check_new_map()
4188 mutex_lock(&mdsc->mutex); in check_new_map()
4197 mutex_unlock(&mdsc->mutex); in check_new_map()
4198 mutex_lock(&s->s_mutex); in check_new_map()
4199 mutex_lock(&mdsc->mutex); in check_new_map()
4200 ceph_con_close(&s->s_con); in check_new_map()
4201 mutex_unlock(&s->s_mutex); in check_new_map()
4202 s->s_state = CEPH_MDS_SESSION_RESTARTING; in check_new_map()
4210 if (s->s_state == CEPH_MDS_SESSION_RESTARTING && in check_new_map()
4212 mutex_unlock(&mdsc->mutex); in check_new_map()
4214 mutex_lock(&mdsc->mutex); in check_new_map()
4224 pr_info("mds%d recovery completed\n", s->s_mds); in check_new_map()
4226 mutex_unlock(&mdsc->mutex); in check_new_map()
4227 mutex_lock(&s->s_mutex); in check_new_map()
4228 mutex_lock(&mdsc->mutex); in check_new_map()
4230 mutex_unlock(&s->s_mutex); in check_new_map()
4235 for (i = 0; i < newmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4236 s = mdsc->sessions[i]; in check_new_map()
4241 if (s->s_state == CEPH_MDS_SESSION_OPEN || in check_new_map()
4242 s->s_state == CEPH_MDS_SESSION_HUNG || in check_new_map()
4243 s->s_state == CEPH_MDS_SESSION_CLOSING) { in check_new_map()
4244 dout(" connecting to export targets of laggy mds%d\n", in check_new_map()
4258 * caller must hold session s_mutex, dentry->d_lock
4264 ceph_put_mds_session(di->lease_session); in __ceph_mdsc_drop_dentry_lease()
4265 di->lease_session = NULL; in __ceph_mdsc_drop_dentry_lease()
4272 struct super_block *sb = mdsc->fsc->sb; in handle_lease()
4276 int mds = session->s_mds; in handle_lease()
4277 struct ceph_mds_lease *h = msg->front.iov_base; in handle_lease()
4283 dout("handle_lease from mds%d\n", mds); in handle_lease()
4286 if (msg->front.iov_len < sizeof(*h) + sizeof(u32)) in handle_lease()
4288 vino.ino = le64_to_cpu(h->ino); in handle_lease()
4290 seq = le32_to_cpu(h->seq); in handle_lease()
4292 if (msg->front.iov_len < sizeof(*h) + sizeof(u32) + dname.len) in handle_lease()
4298 dout("handle_lease %s, ino %llx %p %.*s\n", in handle_lease()
4299 ceph_lease_op_name(h->action), vino.ino, inode, in handle_lease()
4302 mutex_lock(&session->s_mutex); in handle_lease()
4306 dout("handle_lease no inode %llx\n", vino.ino); in handle_lease()
4313 dout("no parent dentry on inode %p\n", inode); in handle_lease()
4323 spin_lock(&dentry->d_lock); in handle_lease()
4325 switch (h->action) { in handle_lease()
4327 if (di->lease_session == session) { in handle_lease()
4328 if (ceph_seq_cmp(di->lease_seq, seq) > 0) in handle_lease()
4329 h->seq = cpu_to_le32(di->lease_seq); in handle_lease()
4336 if (di->lease_session == session && in handle_lease()
4337 di->lease_gen == session->s_cap_gen && in handle_lease()
4338 di->lease_renew_from && in handle_lease()
4339 di->lease_renew_after == 0) { in handle_lease()
4341 msecs_to_jiffies(le32_to_cpu(h->duration_ms)); in handle_lease()
4343 di->lease_seq = seq; in handle_lease()
4344 di->time = di->lease_renew_from + duration; in handle_lease()
4345 di->lease_renew_after = di->lease_renew_from + in handle_lease()
4347 di->lease_renew_from = 0; in handle_lease()
4351 spin_unlock(&dentry->d_lock); in handle_lease()
4359 h->action = CEPH_MDS_LEASE_REVOKE_ACK; in handle_lease()
4361 ceph_con_send(&session->s_con, msg); in handle_lease()
4364 mutex_unlock(&session->s_mutex); in handle_lease()
4383 dout("lease_send_msg identry %p %s to mds%d\n", in ceph_mdsc_lease_send_msg()
4384 dentry, ceph_lease_op_name(action), session->s_mds); in ceph_mdsc_lease_send_msg()
4389 lease = msg->front.iov_base; in ceph_mdsc_lease_send_msg()
4390 lease->action = action; in ceph_mdsc_lease_send_msg()
4391 lease->seq = cpu_to_le32(seq); in ceph_mdsc_lease_send_msg()
4393 spin_lock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4394 dir = d_inode(dentry->d_parent); in ceph_mdsc_lease_send_msg()
4395 lease->ino = cpu_to_le64(ceph_ino(dir)); in ceph_mdsc_lease_send_msg()
4396 lease->first = lease->last = cpu_to_le64(ceph_snap(dir)); in ceph_mdsc_lease_send_msg()
4398 put_unaligned_le32(dentry->d_name.len, lease + 1); in ceph_mdsc_lease_send_msg()
4400 dentry->d_name.name, dentry->d_name.len); in ceph_mdsc_lease_send_msg()
4401 spin_unlock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4407 msg->more_to_follow = (action == CEPH_MDS_LEASE_RELEASE); in ceph_mdsc_lease_send_msg()
4409 ceph_con_send(&session->s_con, msg); in ceph_mdsc_lease_send_msg()
4417 mutex_lock(&s->s_mutex); in lock_unlock_session()
4418 mutex_unlock(&s->s_mutex); in lock_unlock_session()
4423 struct ceph_fs_client *fsc = mdsc->fsc; in maybe_recover_session()
4428 if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED) in maybe_recover_session()
4431 if (!READ_ONCE(fsc->blocklisted)) in maybe_recover_session()
4434 if (fsc->last_auto_reconnect && in maybe_recover_session()
4435 time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30)) in maybe_recover_session()
4439 fsc->last_auto_reconnect = jiffies; in maybe_recover_session()
4440 ceph_force_reconnect(fsc->sb); in maybe_recover_session()
4445 switch (s->s_state) { in check_session_state()
4447 if (s->s_ttl && time_after(jiffies, s->s_ttl)) { in check_session_state()
4448 s->s_state = CEPH_MDS_SESSION_HUNG; in check_session_state()
4449 pr_info("mds%d hung\n", s->s_mds); in check_session_state()
4454 WARN_ON_ONCE(s->s_ttl); in check_session_state()
4472 lockdep_assert_held(&s->s_mutex); in inc_session_sequence()
4474 s->s_seq++; in inc_session_sequence()
4476 if (s->s_state == CEPH_MDS_SESSION_CLOSING) { in inc_session_sequence()
4479 dout("resending session close request for mds%d\n", s->s_mds); in inc_session_sequence()
4483 s->s_mds, ret); in inc_session_sequence()
4488 * delayed work -- periodically trim expired leases, renew caps with mds. If
4489 * the @delay parameter is set to 0 or if it's more than 5 secs, the default
4496 /* 5 secs default delay */ in schedule_delayed()
4499 schedule_delayed_work(&mdsc->delayed_work, in schedule_delayed()
4512 dout("mdsc delayed_work\n"); in delayed_work()
4514 if (mdsc->stopping >= CEPH_MDSC_STOPPING_FLUSHED) in delayed_work()
4517 mutex_lock(&mdsc->mutex); in delayed_work()
4518 renew_interval = mdsc->mdsmap->m_session_timeout >> 2; in delayed_work()
4520 mdsc->last_renew_caps); in delayed_work()
4522 mdsc->last_renew_caps = jiffies; in delayed_work()
4524 for (i = 0; i < mdsc->max_sessions; i++) { in delayed_work()
4533 mutex_unlock(&mdsc->mutex); in delayed_work()
4535 mutex_lock(&s->s_mutex); in delayed_work()
4539 ceph_con_keepalive(&s->s_con); in delayed_work()
4540 if (s->s_state == CEPH_MDS_SESSION_OPEN || in delayed_work()
4541 s->s_state == CEPH_MDS_SESSION_HUNG) in delayed_work()
4543 mutex_unlock(&s->s_mutex); in delayed_work()
4546 mutex_lock(&mdsc->mutex); in delayed_work()
4548 mutex_unlock(&mdsc->mutex); in delayed_work()
4569 return -ENOMEM; in ceph_mdsc_init()
4570 mdsc->fsc = fsc; in ceph_mdsc_init()
4571 mutex_init(&mdsc->mutex); in ceph_mdsc_init()
4572 mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); in ceph_mdsc_init()
4573 if (!mdsc->mdsmap) { in ceph_mdsc_init()
4574 err = -ENOMEM; in ceph_mdsc_init()
4578 init_completion(&mdsc->safe_umount_waiters); in ceph_mdsc_init()
4579 init_waitqueue_head(&mdsc->session_close_wq); in ceph_mdsc_init()
4580 INIT_LIST_HEAD(&mdsc->waiting_for_map); in ceph_mdsc_init()
4581 mdsc->sessions = NULL; in ceph_mdsc_init()
4582 atomic_set(&mdsc->num_sessions, 0); in ceph_mdsc_init()
4583 mdsc->max_sessions = 0; in ceph_mdsc_init()
4584 mdsc->stopping = 0; in ceph_mdsc_init()
4585 atomic64_set(&mdsc->quotarealms_count, 0); in ceph_mdsc_init()
4586 mdsc->quotarealms_inodes = RB_ROOT; in ceph_mdsc_init()
4587 mutex_init(&mdsc->quotarealms_inodes_mutex); in ceph_mdsc_init()
4588 mdsc->last_snap_seq = 0; in ceph_mdsc_init()
4589 init_rwsem(&mdsc->snap_rwsem); in ceph_mdsc_init()
4590 mdsc->snap_realms = RB_ROOT; in ceph_mdsc_init()
4591 INIT_LIST_HEAD(&mdsc->snap_empty); in ceph_mdsc_init()
4592 mdsc->num_snap_realms = 0; in ceph_mdsc_init()
4593 spin_lock_init(&mdsc->snap_empty_lock); in ceph_mdsc_init()
4594 mdsc->last_tid = 0; in ceph_mdsc_init()
4595 mdsc->oldest_tid = 0; in ceph_mdsc_init()
4596 mdsc->request_tree = RB_ROOT; in ceph_mdsc_init()
4597 INIT_DELAYED_WORK(&mdsc->delayed_work, delayed_work); in ceph_mdsc_init()
4598 mdsc->last_renew_caps = jiffies; in ceph_mdsc_init()
4599 INIT_LIST_HEAD(&mdsc->cap_delay_list); in ceph_mdsc_init()
4600 INIT_LIST_HEAD(&mdsc->cap_wait_list); in ceph_mdsc_init()
4601 spin_lock_init(&mdsc->cap_delay_lock); in ceph_mdsc_init()
4602 INIT_LIST_HEAD(&mdsc->snap_flush_list); in ceph_mdsc_init()
4603 spin_lock_init(&mdsc->snap_flush_lock); in ceph_mdsc_init()
4604 mdsc->last_cap_flush_tid = 1; in ceph_mdsc_init()
4605 INIT_LIST_HEAD(&mdsc->cap_flush_list); in ceph_mdsc_init()
4606 INIT_LIST_HEAD(&mdsc->cap_dirty_migrating); in ceph_mdsc_init()
4607 mdsc->num_cap_flushing = 0; in ceph_mdsc_init()
4608 spin_lock_init(&mdsc->cap_dirty_lock); in ceph_mdsc_init()
4609 init_waitqueue_head(&mdsc->cap_flushing_wq); in ceph_mdsc_init()
4610 INIT_WORK(&mdsc->cap_reclaim_work, ceph_cap_reclaim_work); in ceph_mdsc_init()
4611 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_mdsc_init()
4612 err = ceph_metric_init(&mdsc->metric); in ceph_mdsc_init()
4616 spin_lock_init(&mdsc->dentry_list_lock); in ceph_mdsc_init()
4617 INIT_LIST_HEAD(&mdsc->dentry_leases); in ceph_mdsc_init()
4618 INIT_LIST_HEAD(&mdsc->dentry_dir_leases); in ceph_mdsc_init()
4621 ceph_adjust_caps_max_min(mdsc, fsc->mount_options); in ceph_mdsc_init()
4623 spin_lock_init(&mdsc->snapid_map_lock); in ceph_mdsc_init()
4624 mdsc->snapid_map_tree = RB_ROOT; in ceph_mdsc_init()
4625 INIT_LIST_HEAD(&mdsc->snapid_map_lru); in ceph_mdsc_init()
4627 init_rwsem(&mdsc->pool_perm_rwsem); in ceph_mdsc_init()
4628 mdsc->pool_perm_tree = RB_ROOT; in ceph_mdsc_init()
4630 strscpy(mdsc->nodename, utsname()->nodename, in ceph_mdsc_init()
4631 sizeof(mdsc->nodename)); in ceph_mdsc_init()
4633 fsc->mdsc = mdsc; in ceph_mdsc_init()
4637 kfree(mdsc->mdsmap); in ceph_mdsc_init()
4649 struct ceph_options *opts = mdsc->fsc->client->options; in wait_requests()
4652 mutex_lock(&mdsc->mutex); in wait_requests()
4654 mutex_unlock(&mdsc->mutex); in wait_requests()
4656 dout("wait_requests waiting for requests\n"); in wait_requests()
4657 wait_for_completion_timeout(&mdsc->safe_umount_waiters, in wait_requests()
4658 ceph_timeout_jiffies(opts->mount_timeout)); in wait_requests()
4661 mutex_lock(&mdsc->mutex); in wait_requests()
4663 dout("wait_requests timed out on tid %llu\n", in wait_requests()
4664 req->r_tid); in wait_requests()
4665 list_del_init(&req->r_wait); in wait_requests()
4669 mutex_unlock(&mdsc->mutex); in wait_requests()
4670 dout("wait_requests done\n"); in wait_requests()
4678 * Pre-luminous MDS crashes when it sees an unknown session request in send_flush_mdlog()
4680 if (!CEPH_HAVE_FEATURE(s->s_con.peer_features, SERVER_LUMINOUS)) in send_flush_mdlog()
4683 mutex_lock(&s->s_mutex); in send_flush_mdlog()
4684 dout("request mdlog flush to mds%d (%s)s seq %lld\n", s->s_mds, in send_flush_mdlog()
4685 ceph_session_state_name(s->s_state), s->s_seq); in send_flush_mdlog()
4687 s->s_seq); in send_flush_mdlog()
4690 s->s_mds, ceph_session_state_name(s->s_state), s->s_seq); in send_flush_mdlog()
4692 ceph_con_send(&s->s_con, msg); in send_flush_mdlog()
4694 mutex_unlock(&s->s_mutex); in send_flush_mdlog()
4703 dout("pre_umount\n"); in ceph_mdsc_pre_umount()
4704 mdsc->stopping = CEPH_MDSC_STOPPING_BEGIN; in ceph_mdsc_pre_umount()
4728 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4729 dout("wait_unsafe_requests want %lld\n", want_tid); in wait_unsafe_requests()
4732 while (req && req->r_tid <= want_tid) { in wait_unsafe_requests()
4734 n = rb_next(&req->r_node); in wait_unsafe_requests()
4739 if (req->r_op != CEPH_MDS_OP_SETFILELOCK && in wait_unsafe_requests()
4740 (req->r_op & CEPH_MDS_OP_WRITE)) { in wait_unsafe_requests()
4745 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4746 dout("wait_unsafe_requests wait on %llu (want %llu)\n", in wait_unsafe_requests()
4747 req->r_tid, want_tid); in wait_unsafe_requests()
4748 wait_for_completion(&req->r_safe_completion); in wait_unsafe_requests()
4749 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4753 if (RB_EMPTY_NODE(&nextreq->r_node)) { in wait_unsafe_requests()
4762 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4763 dout("wait_unsafe_requests done\n"); in wait_unsafe_requests()
4770 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in ceph_mdsc_sync()
4773 dout("sync\n"); in ceph_mdsc_sync()
4774 mutex_lock(&mdsc->mutex); in ceph_mdsc_sync()
4775 want_tid = mdsc->last_tid; in ceph_mdsc_sync()
4776 mutex_unlock(&mdsc->mutex); in ceph_mdsc_sync()
4779 spin_lock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4780 want_flush = mdsc->last_cap_flush_tid; in ceph_mdsc_sync()
4781 if (!list_empty(&mdsc->cap_flush_list)) { in ceph_mdsc_sync()
4783 list_last_entry(&mdsc->cap_flush_list, in ceph_mdsc_sync()
4785 cf->wake = true; in ceph_mdsc_sync()
4787 spin_unlock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4789 dout("sync want tid %lld flush_seq %lld\n", in ceph_mdsc_sync()
4801 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in done_closing_sessions()
4803 return atomic_read(&mdsc->num_sessions) <= skipped; in done_closing_sessions()
4811 struct ceph_options *opts = mdsc->fsc->client->options; in ceph_mdsc_close_sessions()
4816 dout("close_sessions\n"); in ceph_mdsc_close_sessions()
4819 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4820 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4824 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4825 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4828 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4830 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4832 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4834 dout("waiting for sessions to close\n"); in ceph_mdsc_close_sessions()
4835 wait_event_timeout(mdsc->session_close_wq, in ceph_mdsc_close_sessions()
4837 ceph_timeout_jiffies(opts->mount_timeout)); in ceph_mdsc_close_sessions()
4840 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4841 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4842 if (mdsc->sessions[i]) { in ceph_mdsc_close_sessions()
4843 session = ceph_get_mds_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
4845 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4846 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4848 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4850 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4853 WARN_ON(!list_empty(&mdsc->cap_delay_list)); in ceph_mdsc_close_sessions()
4854 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4859 cancel_work_sync(&mdsc->cap_reclaim_work); in ceph_mdsc_close_sessions()
4860 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_close_sessions()
4862 dout("stopped\n"); in ceph_mdsc_close_sessions()
4870 dout("force umount\n"); in ceph_mdsc_force_umount()
4872 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4873 for (mds = 0; mds < mdsc->max_sessions; mds++) { in ceph_mdsc_force_umount()
4878 if (session->s_state == CEPH_MDS_SESSION_REJECTED) in ceph_mdsc_force_umount()
4880 __wake_requests(mdsc, &session->s_waiting); in ceph_mdsc_force_umount()
4881 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4883 mutex_lock(&session->s_mutex); in ceph_mdsc_force_umount()
4885 if (session->s_state == CEPH_MDS_SESSION_CLOSING) { in ceph_mdsc_force_umount()
4889 mutex_unlock(&session->s_mutex); in ceph_mdsc_force_umount()
4892 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4895 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_force_umount()
4896 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4901 dout("stop\n"); in ceph_mdsc_stop()
4908 * delayed work will re-arm itself again after that. in ceph_mdsc_stop()
4910 flush_delayed_work(&mdsc->delayed_work); in ceph_mdsc_stop()
4912 if (mdsc->mdsmap) in ceph_mdsc_stop()
4913 ceph_mdsmap_destroy(mdsc->mdsmap); in ceph_mdsc_stop()
4914 kfree(mdsc->sessions); in ceph_mdsc_stop()
4921 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_mdsc_destroy()
4922 dout("mdsc_destroy %p\n", mdsc); in ceph_mdsc_destroy()
4932 ceph_metric_destroy(&mdsc->metric); in ceph_mdsc_destroy()
4934 fsc->mdsc = NULL; in ceph_mdsc_destroy()
4936 dout("mdsc_destroy %p done\n", mdsc); in ceph_mdsc_destroy()
4941 struct ceph_fs_client *fsc = mdsc->fsc; in ceph_mdsc_handle_fsmap()
4942 const char *mds_namespace = fsc->mount_options->mds_namespace; in ceph_mdsc_handle_fsmap()
4943 void *p = msg->front.iov_base; in ceph_mdsc_handle_fsmap()
4944 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_fsmap()
4948 u32 mount_fscid = (u32)-1; in ceph_mdsc_handle_fsmap()
4950 int err = -EINVAL; in ceph_mdsc_handle_fsmap()
4955 dout("handle_fsmap epoch %u\n", epoch); in ceph_mdsc_handle_fsmap()
4957 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4963 p += sizeof(u32) * 2; /* skip epoch and legacy_client_fscid */ in ceph_mdsc_handle_fsmap()
4966 while (num_fs-- > 0) { in ceph_mdsc_handle_fsmap()
4972 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4981 ceph_decode_need(&info_p, info_end, sizeof(u32) * 2, bad); in ceph_mdsc_handle_fsmap()
4994 ceph_monc_got_map(&fsc->client->monc, CEPH_SUB_FSMAP, epoch); in ceph_mdsc_handle_fsmap()
4995 if (mount_fscid != (u32)-1) { in ceph_mdsc_handle_fsmap()
4996 fsc->client->monc.fs_cluster_id = mount_fscid; in ceph_mdsc_handle_fsmap()
4997 ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_fsmap()
4999 ceph_monc_renew_subs(&fsc->client->monc); in ceph_mdsc_handle_fsmap()
5001 err = -ENOENT; in ceph_mdsc_handle_fsmap()
5009 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
5010 mdsc->mdsmap_err = err; in ceph_mdsc_handle_fsmap()
5011 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_fsmap()
5012 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
5022 void *p = msg->front.iov_base; in ceph_mdsc_handle_mdsmap()
5023 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_mdsmap()
5026 int err = -EINVAL; in ceph_mdsc_handle_mdsmap()
5028 ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad); in ceph_mdsc_handle_mdsmap()
5030 if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0) in ceph_mdsc_handle_mdsmap()
5034 dout("handle_map epoch %u len %d\n", epoch, (int)maplen); in ceph_mdsc_handle_mdsmap()
5037 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5038 if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) { in ceph_mdsc_handle_mdsmap()
5039 dout("handle_map epoch %u <= our %u\n", in ceph_mdsc_handle_mdsmap()
5040 epoch, mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
5041 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5052 if (mdsc->mdsmap) { in ceph_mdsc_handle_mdsmap()
5053 oldmap = mdsc->mdsmap; in ceph_mdsc_handle_mdsmap()
5054 mdsc->mdsmap = newmap; in ceph_mdsc_handle_mdsmap()
5058 mdsc->mdsmap = newmap; /* first mds map */ in ceph_mdsc_handle_mdsmap()
5060 mdsc->fsc->max_file_size = min((loff_t)mdsc->mdsmap->m_max_file_size, in ceph_mdsc_handle_mdsmap()
5063 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_mdsmap()
5064 ceph_monc_got_map(&mdsc->fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_mdsmap()
5065 mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
5067 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5072 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5080 struct ceph_mds_session *s = con->private; in con_get()
5089 struct ceph_mds_session *s = con->private; in con_put()
5100 struct ceph_mds_session *s = con->private; in peer_reset()
5101 struct ceph_mds_client *mdsc = s->s_mdsc; in peer_reset()
5103 pr_warn("mds%d closed our session\n", s->s_mds); in peer_reset()
5109 struct ceph_mds_session *s = con->private; in dispatch()
5110 struct ceph_mds_client *mdsc = s->s_mdsc; in dispatch()
5111 int type = le16_to_cpu(msg->hdr.type); in dispatch()
5113 mutex_lock(&mdsc->mutex); in dispatch()
5115 mutex_unlock(&mdsc->mutex); in dispatch()
5118 mutex_unlock(&mdsc->mutex); in dispatch()
5149 default: in dispatch()
5168 struct ceph_mds_session *s = con->private; in get_authorizer()
5169 struct ceph_mds_client *mdsc = s->s_mdsc; in get_authorizer()
5170 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in get_authorizer()
5171 struct ceph_auth_handshake *auth = &s->s_auth; in get_authorizer()
5173 if (force_new && auth->authorizer) { in get_authorizer()
5174 ceph_auth_destroy_authorizer(auth->authorizer); in get_authorizer()
5175 auth->authorizer = NULL; in get_authorizer()
5177 if (!auth->authorizer) { in get_authorizer()
5188 *proto = ac->protocol; in get_authorizer()
5196 struct ceph_mds_session *s = con->private; in add_authorizer_challenge()
5197 struct ceph_mds_client *mdsc = s->s_mdsc; in add_authorizer_challenge()
5198 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in add_authorizer_challenge()
5200 return ceph_auth_add_authorizer_challenge(ac, s->s_auth.authorizer, in add_authorizer_challenge()
5206 struct ceph_mds_session *s = con->private; in verify_authorizer_reply()
5207 struct ceph_mds_client *mdsc = s->s_mdsc; in verify_authorizer_reply()
5208 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in verify_authorizer_reply()
5210 return ceph_auth_verify_authorizer_reply(ac, s->s_auth.authorizer); in verify_authorizer_reply()
5215 struct ceph_mds_session *s = con->private; in invalidate_authorizer()
5216 struct ceph_mds_client *mdsc = s->s_mdsc; in invalidate_authorizer()
5217 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in invalidate_authorizer()
5221 return ceph_monc_validate_auth(&mdsc->fsc->client->monc); in invalidate_authorizer()
5228 int type = (int) le16_to_cpu(hdr->type); in mds_alloc_msg()
5229 int front_len = (int) le32_to_cpu(hdr->front_len); in mds_alloc_msg()
5231 if (con->in_msg) in mds_alloc_msg()
5232 return con->in_msg; in mds_alloc_msg()
5247 struct ceph_mds_session *s = msg->con->private; in mds_sign_message()
5248 struct ceph_auth_handshake *auth = &s->s_auth; in mds_sign_message()
5255 struct ceph_mds_session *s = msg->con->private; in mds_check_message_signature()
5256 struct ceph_auth_handshake *auth = &s->s_auth; in mds_check_message_signature()