Lines Matching +full:front +full:- +full:end

1 // SPDX-License-Identifier: GPL-2.0
25 #define RECONNECT_MAX_SIZE (INT_MAX - PAGE_SIZE)
72 static int parse_reply_info_quota(void **p, void *end, in parse_reply_info_quota() argument
78 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_quota()
79 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_quota()
84 ceph_decode_32_safe(p, end, struct_len, bad); in parse_reply_info_quota()
85 ceph_decode_need(p, end, struct_len, bad); in parse_reply_info_quota()
86 end = *p + struct_len; in parse_reply_info_quota()
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()
89 *p = end; in parse_reply_info_quota()
92 return -EIO; in parse_reply_info_quota()
98 static int parse_reply_info_in(void **p, void *end, in parse_reply_info_in() argument
105 if (features == (u64)-1) { in parse_reply_info_in()
108 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_in()
109 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_in()
114 ceph_decode_32_safe(p, end, struct_len, bad); in parse_reply_info_in()
115 ceph_decode_need(p, end, struct_len, bad); in parse_reply_info_in()
116 end = *p + struct_len; in parse_reply_info_in()
119 ceph_decode_need(p, end, sizeof(struct ceph_mds_reply_inode), bad); 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()
145 err = parse_reply_info_quota(p, end, info); 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()
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()
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()
179 *p = end; 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()
191 err = parse_reply_info_quota(p, end, info); 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()
226 static int parse_reply_info_dir(void **p, void *end, in parse_reply_info_dir() argument
230 if (features == (u64)-1) { in parse_reply_info_dir()
233 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_dir()
234 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_dir()
239 ceph_decode_32_safe(p, end, struct_len, bad); in parse_reply_info_dir()
240 ceph_decode_need(p, end, struct_len, bad); in parse_reply_info_dir()
241 end = *p + struct_len; in parse_reply_info_dir()
244 ceph_decode_need(p, end, sizeof(**dirfrag), bad); in parse_reply_info_dir()
246 *p += sizeof(**dirfrag) + sizeof(u32) * le32_to_cpu((*dirfrag)->ndist); in parse_reply_info_dir()
247 if (unlikely(*p > end)) in parse_reply_info_dir()
249 if (features == (u64)-1) in parse_reply_info_dir()
250 *p = end; in parse_reply_info_dir()
253 return -EIO; in parse_reply_info_dir()
256 static int parse_reply_info_lease(void **p, void *end, in parse_reply_info_lease() argument
260 if (features == (u64)-1) { in parse_reply_info_lease()
263 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_lease()
264 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_lease()
269 ceph_decode_32_safe(p, end, struct_len, bad); in parse_reply_info_lease()
270 ceph_decode_need(p, end, struct_len, bad); in parse_reply_info_lease()
271 end = *p + struct_len; in parse_reply_info_lease()
274 ceph_decode_need(p, end, sizeof(**lease), bad); in parse_reply_info_lease()
277 if (features == (u64)-1) in parse_reply_info_lease()
278 *p = end; in parse_reply_info_lease()
281 return -EIO; in parse_reply_info_lease()
288 static int parse_reply_info_trace(void **p, void *end, in parse_reply_info_trace() argument
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()
319 if (unlikely(*p != end)) in parse_reply_info_trace()
324 err = -EIO; in parse_reply_info_trace()
333 static int parse_reply_info_readdir(void **p, void *end, in parse_reply_info_readdir() argument
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()
390 *p = end; in parse_reply_info_readdir()
394 err = -EIO; in parse_reply_info_readdir()
403 static int parse_reply_info_filelock(void **p, void *end, in parse_reply_info_filelock() argument
407 if (*p + sizeof(*info->filelock_reply) > end) in parse_reply_info_filelock()
410 info->filelock_reply = *p; in parse_reply_info_filelock()
413 *p = end; in parse_reply_info_filelock()
416 return -EIO; in parse_reply_info_filelock()
424 static int ceph_parse_deleg_inos(void **p, void *end, in ceph_parse_deleg_inos() argument
429 ceph_decode_32_safe(p, end, sets, bad); in ceph_parse_deleg_inos()
431 while (sets--) { in ceph_parse_deleg_inos()
434 ceph_decode_64_safe(p, end, start, bad); in ceph_parse_deleg_inos()
435 ceph_decode_64_safe(p, end, len, bad); in ceph_parse_deleg_inos()
436 while (len--) { in ceph_parse_deleg_inos()
437 int err = xa_insert(&s->s_delegated_inos, ino = start++, in ceph_parse_deleg_inos()
442 start - 1); in ceph_parse_deleg_inos()
443 } else if (err == -EBUSY) { in ceph_parse_deleg_inos()
445 start - 1); in ceph_parse_deleg_inos()
453 return -EIO; in ceph_parse_deleg_inos()
461 xa_for_each(&s->s_delegated_inos, ino, val) { in ceph_get_deleg_ino()
462 val = xa_erase(&s->s_delegated_inos, ino); in ceph_get_deleg_ino()
471 return xa_insert(&s->s_delegated_inos, ino, DELEGATED_INO_AVAILABLE, in ceph_restore_deleg_ino()
476 * FIXME: xarrays can't handle 64-bit indexes on a 32-bit arch. For now, just
480 static int ceph_parse_deleg_inos(void **p, void *end, in ceph_parse_deleg_inos() argument
485 ceph_decode_32_safe(p, end, sets, bad); in ceph_parse_deleg_inos()
487 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad); in ceph_parse_deleg_inos()
490 return -EIO; in ceph_parse_deleg_inos()
507 static int parse_reply_info_create(void **p, void *end, in parse_reply_info_create() argument
513 if (features == (u64)-1 || in parse_reply_info_create()
515 if (*p == end) { in parse_reply_info_create()
517 info->has_create_ino = false; in parse_reply_info_create()
518 } else if (test_bit(CEPHFS_FEATURE_DELEG_INO, &s->s_features)) { in parse_reply_info_create()
522 info->has_create_ino = true; in parse_reply_info_create()
523 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_create()
524 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_create()
525 ceph_decode_32_safe(p, end, len, bad); in parse_reply_info_create()
526 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
527 ret = ceph_parse_deleg_inos(p, end, s); in parse_reply_info_create()
532 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
533 info->has_create_ino = true; in parse_reply_info_create()
536 if (*p != end) in parse_reply_info_create()
541 *p = end; in parse_reply_info_create()
544 return -EIO; in parse_reply_info_create()
550 static int parse_reply_info_extra(void **p, void *end, in parse_reply_info_extra() argument
554 u32 op = le32_to_cpu(info->head->op); in parse_reply_info_extra()
557 return parse_reply_info_filelock(p, end, info, features); in parse_reply_info_extra()
559 return parse_reply_info_readdir(p, end, info, features); in parse_reply_info_extra()
561 return parse_reply_info_create(p, end, info, features, s); in parse_reply_info_extra()
563 return -EIO; in parse_reply_info_extra()
573 void *p, *end; in parse_reply_info() local
577 info->head = msg->front.iov_base; in parse_reply_info()
578 p = msg->front.iov_base + sizeof(struct ceph_mds_reply_head); in parse_reply_info()
579 end = p + msg->front.iov_len - sizeof(struct ceph_mds_reply_head); in parse_reply_info()
582 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
584 ceph_decode_need(&p, end, len, bad); in parse_reply_info()
591 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
593 ceph_decode_need(&p, end, len, bad); in parse_reply_info()
600 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
601 info->snapblob_len = len; in parse_reply_info()
602 info->snapblob = p; in parse_reply_info()
605 if (p != end) in parse_reply_info()
610 err = -EIO; in parse_reply_info()
618 if (!info->dir_entries) in destroy_reply_info()
620 free_pages((unsigned long)info->dir_entries, get_order(info->dir_buf_size)); in destroy_reply_info()
645 if (refcount_inc_not_zero(&s->s_ref)) { in ceph_get_mds_session()
646 dout("mdsc get_session %p %d -> %d\n", s, in ceph_get_mds_session()
647 refcount_read(&s->s_ref)-1, refcount_read(&s->s_ref)); in ceph_get_mds_session()
650 dout("mdsc get_session %p 0 -- FAIL\n", s); in ceph_get_mds_session()
657 dout("mdsc put_session %p %d -> %d\n", s, in ceph_put_mds_session()
658 refcount_read(&s->s_ref), refcount_read(&s->s_ref)-1); in ceph_put_mds_session()
659 if (refcount_dec_and_test(&s->s_ref)) { in ceph_put_mds_session()
660 if (s->s_auth.authorizer) in ceph_put_mds_session()
661 ceph_auth_destroy_authorizer(s->s_auth.authorizer); in ceph_put_mds_session()
662 WARN_ON(mutex_is_locked(&s->s_mutex)); in ceph_put_mds_session()
663 xa_destroy(&s->s_delegated_inos); in ceph_put_mds_session()
669 * called under mdsc->mutex
674 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __ceph_lookup_mds_session()
676 return ceph_get_mds_session(mdsc->sessions[mds]); in __ceph_lookup_mds_session()
681 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __have_session()
690 if (s->s_mds >= mdsc->max_sessions || in __verify_registered_session()
691 mdsc->sessions[s->s_mds] != s) in __verify_registered_session()
692 return -ENOENT; in __verify_registered_session()
698 * called under mdsc->mutex.
705 if (mds >= mdsc->mdsmap->possible_max_rank) in register_session()
706 return ERR_PTR(-EINVAL); in register_session()
710 return ERR_PTR(-ENOMEM); in register_session()
712 if (mds >= mdsc->max_sessions) { in register_session()
720 if (mdsc->sessions) { in register_session()
721 memcpy(sa, mdsc->sessions, in register_session()
722 mdsc->max_sessions * sizeof(void *)); in register_session()
723 kfree(mdsc->sessions); in register_session()
725 mdsc->sessions = sa; in register_session()
726 mdsc->max_sessions = newmax; in register_session()
730 s->s_mdsc = mdsc; in register_session()
731 s->s_mds = mds; in register_session()
732 s->s_state = CEPH_MDS_SESSION_NEW; in register_session()
733 s->s_ttl = 0; in register_session()
734 s->s_seq = 0; in register_session()
735 mutex_init(&s->s_mutex); in register_session()
737 ceph_con_init(&s->s_con, s, &mds_con_ops, &mdsc->fsc->client->msgr); in register_session()
739 spin_lock_init(&s->s_gen_ttl_lock); in register_session()
740 s->s_cap_gen = 1; in register_session()
741 s->s_cap_ttl = jiffies - 1; in register_session()
743 spin_lock_init(&s->s_cap_lock); in register_session()
744 s->s_renew_requested = 0; in register_session()
745 s->s_renew_seq = 0; in register_session()
746 INIT_LIST_HEAD(&s->s_caps); in register_session()
747 s->s_nr_caps = 0; in register_session()
748 refcount_set(&s->s_ref, 1); in register_session()
749 INIT_LIST_HEAD(&s->s_waiting); in register_session()
750 INIT_LIST_HEAD(&s->s_unsafe); in register_session()
751 xa_init(&s->s_delegated_inos); in register_session()
752 s->s_num_cap_releases = 0; in register_session()
753 s->s_cap_reconnect = 0; in register_session()
754 s->s_cap_iterator = NULL; in register_session()
755 INIT_LIST_HEAD(&s->s_cap_releases); in register_session()
756 INIT_WORK(&s->s_cap_release_work, ceph_cap_release_work); in register_session()
758 INIT_LIST_HEAD(&s->s_cap_dirty); in register_session()
759 INIT_LIST_HEAD(&s->s_cap_flushing); in register_session()
761 mdsc->sessions[mds] = s; in register_session()
762 atomic_inc(&mdsc->num_sessions); in register_session()
763 refcount_inc(&s->s_ref); /* one ref to sessions[], one to caller */ in register_session()
765 ceph_con_open(&s->s_con, CEPH_ENTITY_TYPE_MDS, mds, in register_session()
766 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in register_session()
772 return ERR_PTR(-ENOMEM); in register_session()
776 * called under mdsc->mutex
781 dout("__unregister_session mds%d %p\n", s->s_mds, s); in __unregister_session()
782 BUG_ON(mdsc->sessions[s->s_mds] != s); in __unregister_session()
783 mdsc->sessions[s->s_mds] = NULL; in __unregister_session()
784 ceph_con_close(&s->s_con); in __unregister_session()
786 atomic_dec(&mdsc->num_sessions); in __unregister_session()
792 * should be last request ref, or hold mdsc->mutex
796 if (req->r_session) { in put_request_session()
797 ceph_put_mds_session(req->r_session); in put_request_session()
798 req->r_session = NULL; in put_request_session()
808 destroy_reply_info(&req->r_reply_info); in ceph_mdsc_release_request()
809 if (req->r_request) in ceph_mdsc_release_request()
810 ceph_msg_put(req->r_request); in ceph_mdsc_release_request()
811 if (req->r_reply) in ceph_mdsc_release_request()
812 ceph_msg_put(req->r_reply); in ceph_mdsc_release_request()
813 if (req->r_inode) { in ceph_mdsc_release_request()
814 ceph_put_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_release_request()
816 ceph_async_iput(req->r_inode); in ceph_mdsc_release_request()
818 if (req->r_parent) { in ceph_mdsc_release_request()
819 ceph_put_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); in ceph_mdsc_release_request()
820 ceph_async_iput(req->r_parent); in ceph_mdsc_release_request()
822 ceph_async_iput(req->r_target_inode); in ceph_mdsc_release_request()
823 if (req->r_dentry) in ceph_mdsc_release_request()
824 dput(req->r_dentry); in ceph_mdsc_release_request()
825 if (req->r_old_dentry) in ceph_mdsc_release_request()
826 dput(req->r_old_dentry); in ceph_mdsc_release_request()
827 if (req->r_old_dentry_dir) { in ceph_mdsc_release_request()
834 ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_release_request()
836 ceph_async_iput(req->r_old_dentry_dir); in ceph_mdsc_release_request()
838 kfree(req->r_path1); in ceph_mdsc_release_request()
839 kfree(req->r_path2); in ceph_mdsc_release_request()
840 if (req->r_pagelist) in ceph_mdsc_release_request()
841 ceph_pagelist_release(req->r_pagelist); in ceph_mdsc_release_request()
843 ceph_unreserve_caps(req->r_mdsc, &req->r_caps_reservation); in ceph_mdsc_release_request()
844 WARN_ON_ONCE(!list_empty(&req->r_wait)); in ceph_mdsc_release_request()
853 * called under mdsc->mutex. in DEFINE_RB_FUNCS()
860 req = lookup_request(&mdsc->request_tree, tid); in DEFINE_RB_FUNCS()
868 * Register an in-flight request, and assign a tid. Link to directory
871 * Called under mdsc->mutex.
879 req->r_tid = ++mdsc->last_tid; in __register_request()
880 if (req->r_num_caps) { in __register_request()
881 ret = ceph_reserve_caps(mdsc, &req->r_caps_reservation, in __register_request()
882 req->r_num_caps); in __register_request()
886 /* set req->r_err to fail early from __do_request */ in __register_request()
887 req->r_err = ret; in __register_request()
891 dout("__register_request %p tid %lld\n", req, req->r_tid); in __register_request()
893 insert_request(&mdsc->request_tree, req); in __register_request()
895 req->r_uid = current_fsuid(); in __register_request()
896 req->r_gid = current_fsgid(); in __register_request()
898 if (mdsc->oldest_tid == 0 && req->r_op != CEPH_MDS_OP_SETFILELOCK) in __register_request()
899 mdsc->oldest_tid = req->r_tid; in __register_request()
905 req->r_unsafe_dir = dir; in __register_request()
906 spin_lock(&ci->i_unsafe_lock); in __register_request()
907 list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); in __register_request()
908 spin_unlock(&ci->i_unsafe_lock); in __register_request()
915 dout("__unregister_request %p tid %lld\n", req, req->r_tid); in __unregister_request()
918 list_del_init(&req->r_unsafe_item); in __unregister_request()
920 if (req->r_tid == mdsc->oldest_tid) { in __unregister_request()
921 struct rb_node *p = rb_next(&req->r_node); in __unregister_request()
922 mdsc->oldest_tid = 0; in __unregister_request()
926 if (next_req->r_op != CEPH_MDS_OP_SETFILELOCK) { in __unregister_request()
927 mdsc->oldest_tid = next_req->r_tid; in __unregister_request()
934 erase_request(&mdsc->request_tree, req); in __unregister_request()
936 if (req->r_unsafe_dir) { in __unregister_request()
937 struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); in __unregister_request()
938 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
939 list_del_init(&req->r_unsafe_dir_item); in __unregister_request()
940 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
942 if (req->r_target_inode && in __unregister_request()
943 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __unregister_request()
944 struct ceph_inode_info *ci = ceph_inode(req->r_target_inode); in __unregister_request()
945 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
946 list_del_init(&req->r_unsafe_target_item); in __unregister_request()
947 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
950 if (req->r_unsafe_dir) { in __unregister_request()
952 ceph_async_iput(req->r_unsafe_dir); in __unregister_request()
953 req->r_unsafe_dir = NULL; in __unregister_request()
956 complete_all(&req->r_safe_completion); in __unregister_request()
963 * non-snapshot inode. We do this using the rcu_read_lock (which must be held
976 dentry = dentry->d_parent; in get_nonsnap_parent()
989 * Called under mdsc->mutex.
998 int mode = req->r_direct_mode; in __choose_mds()
999 int mds = -1; in __choose_mds()
1000 u32 hash = req->r_direct_hash; in __choose_mds()
1001 bool is_hash = test_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags); in __choose_mds()
1010 if (req->r_resend_mds >= 0 && in __choose_mds()
1011 (__have_session(mdsc, req->r_resend_mds) || in __choose_mds()
1012 ceph_mdsmap_get_state(mdsc->mdsmap, req->r_resend_mds) > 0)) { in __choose_mds()
1014 req->r_resend_mds); in __choose_mds()
1015 return req->r_resend_mds; in __choose_mds()
1022 if (req->r_inode) { in __choose_mds()
1023 if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) { in __choose_mds()
1024 inode = req->r_inode; in __choose_mds()
1027 /* req->r_dentry is non-null for LSSNAP request */ in __choose_mds()
1029 inode = get_nonsnap_parent(req->r_dentry); in __choose_mds()
1033 } else if (req->r_dentry) { in __choose_mds()
1039 parent = READ_ONCE(req->r_dentry->d_parent); in __choose_mds()
1040 dir = req->r_parent ? : d_inode_rcu(parent); in __choose_mds()
1042 if (!dir || dir->i_sb != mdsc->fsc->sb) { in __choose_mds()
1044 inode = d_inode(req->r_dentry); in __choose_mds()
1054 inode = d_inode(req->r_dentry); in __choose_mds()
1058 hash = ceph_dentry_hash(dir, req->r_dentry); in __choose_mds()
1073 if (is_hash && S_ISDIR(inode->i_mode)) { in __choose_mds()
1089 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1091 !ceph_mdsmap_is_laggy(mdsc->mdsmap, mds)) in __choose_mds()
1104 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1106 if (!ceph_mdsmap_is_laggy(mdsc->mdsmap, in __choose_mds()
1115 spin_lock(&ci->i_ceph_lock); in __choose_mds()
1118 cap = ci->i_auth_cap; in __choose_mds()
1119 if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) in __choose_mds()
1120 cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); in __choose_mds()
1122 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1126 mds = cap->session->s_mds; in __choose_mds()
1129 cap == ci->i_auth_cap ? "auth " : "", cap); in __choose_mds()
1130 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1132 /* avoid calling iput_final() while holding mdsc->mutex or in __choose_mds()
1141 mds = ceph_mdsmap_get_random_mds(mdsc->mdsmap); in __choose_mds()
1161 h = msg->front.iov_base; in create_session_msg()
1162 h->op = cpu_to_le32(op); in create_session_msg()
1163 h->seq = cpu_to_le64(seq); in create_session_msg()
1169 #define FEATURE_BYTES(c) (DIV_ROUND_UP((size_t)feature_bits[c - 1] + 1, 64) * 8)
1170 static int encode_supported_features(void **p, void *end) in encode_supported_features() argument
1178 if (WARN_ON_ONCE(*p + 4 + size > end)) in encode_supported_features()
1179 return -ERANGE; in encode_supported_features()
1187 if (WARN_ON_ONCE(*p + 4 > end)) in encode_supported_features()
1188 return -ERANGE; in encode_supported_features()
1197 #define METRIC_BYTES(cnt) (DIV_ROUND_UP((size_t)metric_bits[cnt - 1] + 1, 64) * 8)
1198 static int encode_metric_spec(void **p, void *end) in encode_metric_spec() argument
1203 if (WARN_ON_ONCE(*p + 2 > end)) in encode_metric_spec()
1204 return -ERANGE; in encode_metric_spec()
1213 if (WARN_ON_ONCE(*p + 4 + 4 + size > end)) in encode_metric_spec()
1214 return -ERANGE; in encode_metric_spec()
1226 if (WARN_ON_ONCE(*p + 4 + 4 > end)) in encode_metric_spec()
1227 return -ERANGE; in encode_metric_spec()
1246 int i = -1; in create_session_open_msg()
1249 struct ceph_options *opt = mdsc->fsc->client->options; in create_session_open_msg()
1250 struct ceph_mount_options *fsopt = mdsc->fsc->mount_options; in create_session_open_msg()
1252 void *p, *end; in create_session_open_msg() local
1256 {"hostname", mdsc->nodename}, in create_session_open_msg()
1257 {"kernel_version", init_utsname()->release}, in create_session_open_msg()
1258 {"entity_id", opt->name ? : ""}, in create_session_open_msg()
1259 {"root", fsopt->server_path ? : "/"}, in create_session_open_msg()
1290 return ERR_PTR(-ENOMEM); in create_session_open_msg()
1292 p = msg->front.iov_base; in create_session_open_msg()
1293 end = p + msg->front.iov_len; in create_session_open_msg()
1296 h->op = cpu_to_le32(CEPH_SESSION_REQUEST_OPEN); in create_session_open_msg()
1297 h->seq = cpu_to_le64(seq); in create_session_open_msg()
1305 msg->hdr.version = cpu_to_le16(4); in create_session_open_msg()
1306 msg->hdr.compat_version = cpu_to_le16(1); in create_session_open_msg()
1314 /* Two length-prefixed strings for each entry in the map */ in create_session_open_msg()
1327 ret = encode_supported_features(&p, end); in create_session_open_msg()
1334 ret = encode_metric_spec(&p, end); in create_session_open_msg()
1341 msg->front.iov_len = p - msg->front.iov_base; in create_session_open_msg()
1342 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_session_open_msg()
1350 * called under mdsc->mutex
1357 int mds = session->s_mds; in __open_session()
1360 mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds); in __open_session()
1363 session->s_state = CEPH_MDS_SESSION_OPENING; in __open_session()
1364 session->s_renew_requested = jiffies; in __open_session()
1367 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
1370 ceph_con_send(&session->s_con, msg); in __open_session()
1377 * called under mdsc->mutex
1391 if (session->s_state == CEPH_MDS_SESSION_NEW || in __open_export_target_session()
1392 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __open_export_target_session()
1408 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1410 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1420 int i, mds = session->s_mds; in __open_export_target_sessions()
1422 if (mds >= mdsc->mdsmap->possible_max_rank) in __open_export_target_sessions()
1425 mi = &mdsc->mdsmap->m_info[mds]; in __open_export_target_sessions()
1427 session->s_mds, mi->num_export_targets); in __open_export_target_sessions()
1429 for (i = 0; i < mi->num_export_targets; i++) { in __open_export_target_sessions()
1430 ts = __open_export_target_session(mdsc, mi->export_targets[i]); in __open_export_target_sessions()
1439 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1441 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1451 lockdep_assert_held(&session->s_cap_lock); in detach_cap_releases()
1453 list_splice_init(&session->s_cap_releases, target); in detach_cap_releases()
1454 session->s_num_cap_releases = 0; in detach_cap_releases()
1455 dout("dispose_cap_releases mds%d\n", session->s_mds); in detach_cap_releases()
1463 /* zero out the in-progress message */ in dispose_cap_releases()
1465 list_del(&cap->session_caps); in dispose_cap_releases()
1477 dout("cleanup_session_requests mds%d\n", session->s_mds); in cleanup_session_requests()
1478 mutex_lock(&mdsc->mutex); in cleanup_session_requests()
1479 while (!list_empty(&session->s_unsafe)) { in cleanup_session_requests()
1480 req = list_first_entry(&session->s_unsafe, in cleanup_session_requests()
1483 req->r_tid); in cleanup_session_requests()
1484 if (req->r_target_inode) { in cleanup_session_requests()
1486 ci = ceph_inode(req->r_target_inode); in cleanup_session_requests()
1487 errseq_set(&ci->i_meta_err, -EIO); in cleanup_session_requests()
1489 if (req->r_unsafe_dir) { in cleanup_session_requests()
1491 ci = ceph_inode(req->r_unsafe_dir); in cleanup_session_requests()
1492 errseq_set(&ci->i_meta_err, -EIO); in cleanup_session_requests()
1496 /* zero r_attempts, so kick_requests() will re-send requests */ in cleanup_session_requests()
1497 p = rb_first(&mdsc->request_tree); in cleanup_session_requests()
1501 if (req->r_session && in cleanup_session_requests()
1502 req->r_session->s_mds == session->s_mds) in cleanup_session_requests()
1503 req->r_attempts = 0; in cleanup_session_requests()
1505 mutex_unlock(&mdsc->mutex); in cleanup_session_requests()
1524 dout("iterate_session_caps %p mds%d\n", session, session->s_mds); in ceph_iterate_session_caps()
1525 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1526 p = session->s_caps.next; in ceph_iterate_session_caps()
1527 while (p != &session->s_caps) { in ceph_iterate_session_caps()
1529 inode = igrab(&cap->ci->vfs_inode); in ceph_iterate_session_caps()
1531 p = p->next; in ceph_iterate_session_caps()
1534 session->s_cap_iterator = cap; in ceph_iterate_session_caps()
1535 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1544 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1551 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1552 p = p->next; in ceph_iterate_session_caps()
1553 if (!cap->ci) { in ceph_iterate_session_caps()
1556 BUG_ON(cap->session != session); in ceph_iterate_session_caps()
1557 cap->session = NULL; in ceph_iterate_session_caps()
1558 list_del_init(&cap->session_caps); in ceph_iterate_session_caps()
1559 session->s_nr_caps--; in ceph_iterate_session_caps()
1560 atomic64_dec(&session->s_mdsc->metric.total_caps); in ceph_iterate_session_caps()
1561 if (cap->queue_release) in ceph_iterate_session_caps()
1571 session->s_cap_iterator = NULL; in ceph_iterate_session_caps()
1572 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1576 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1591 cap, ci, &ci->vfs_inode); in remove_session_caps_cb()
1592 spin_lock(&ci->i_ceph_lock); in remove_session_caps_cb()
1594 if (!ci->i_auth_cap) { in remove_session_caps_cb()
1596 struct ceph_mds_client *mdsc = fsc->mdsc; in remove_session_caps_cb()
1598 if (READ_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in remove_session_caps_cb()
1599 if (inode->i_data.nrpages > 0) in remove_session_caps_cb()
1601 if (ci->i_wrbuffer_ref > 0) in remove_session_caps_cb()
1602 mapping_set_error(&inode->i_data, -EIO); in remove_session_caps_cb()
1605 while (!list_empty(&ci->i_cap_flush_list)) { in remove_session_caps_cb()
1606 cf = list_first_entry(&ci->i_cap_flush_list, in remove_session_caps_cb()
1608 list_move(&cf->i_list, &to_remove); in remove_session_caps_cb()
1611 spin_lock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1614 list_del(&cf->g_list); in remove_session_caps_cb()
1616 if (!list_empty(&ci->i_dirty_item)) { in remove_session_caps_cb()
1619 ceph_cap_string(ci->i_dirty_caps), in remove_session_caps_cb()
1621 ci->i_dirty_caps = 0; in remove_session_caps_cb()
1622 list_del_init(&ci->i_dirty_item); in remove_session_caps_cb()
1625 if (!list_empty(&ci->i_flushing_item)) { in remove_session_caps_cb()
1628 ceph_cap_string(ci->i_flushing_caps), in remove_session_caps_cb()
1630 ci->i_flushing_caps = 0; in remove_session_caps_cb()
1631 list_del_init(&ci->i_flushing_item); in remove_session_caps_cb()
1632 mdsc->num_cap_flushing--; in remove_session_caps_cb()
1635 spin_unlock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1638 errseq_set(&ci->i_meta_err, -EIO); in remove_session_caps_cb()
1640 if (ci->i_wrbuffer_ref_head == 0 && in remove_session_caps_cb()
1641 ci->i_wr_ref == 0 && in remove_session_caps_cb()
1642 ci->i_dirty_caps == 0 && in remove_session_caps_cb()
1643 ci->i_flushing_caps == 0) { in remove_session_caps_cb()
1644 ceph_put_snap_context(ci->i_head_snapc); in remove_session_caps_cb()
1645 ci->i_head_snapc = NULL; in remove_session_caps_cb()
1649 if (atomic_read(&ci->i_filelock_ref) > 0) { in remove_session_caps_cb()
1650 /* make further file lock syscall return -EIO */ in remove_session_caps_cb()
1651 ci->i_ceph_flags |= CEPH_I_ERROR_FILELOCK; in remove_session_caps_cb()
1656 if (!ci->i_dirty_caps && ci->i_prealloc_cap_flush) { in remove_session_caps_cb()
1657 list_add(&ci->i_prealloc_cap_flush->i_list, &to_remove); in remove_session_caps_cb()
1658 ci->i_prealloc_cap_flush = NULL; in remove_session_caps_cb()
1661 spin_unlock(&ci->i_ceph_lock); in remove_session_caps_cb()
1666 list_del(&cf->i_list); in remove_session_caps_cb()
1670 wake_up_all(&ci->i_cap_wq); in remove_session_caps_cb()
1683 struct ceph_fs_client *fsc = session->s_mdsc->fsc; in remove_session_caps()
1684 struct super_block *sb = fsc->sb; in remove_session_caps()
1690 wake_up_all(&fsc->mdsc->cap_flushing_wq); in remove_session_caps()
1692 spin_lock(&session->s_cap_lock); in remove_session_caps()
1693 if (session->s_nr_caps > 0) { in remove_session_caps()
1704 while (!list_empty(&session->s_caps)) { in remove_session_caps()
1705 cap = list_entry(session->s_caps.next, in remove_session_caps()
1710 vino = cap->ci->i_vino; in remove_session_caps()
1711 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1717 spin_lock(&session->s_cap_lock); in remove_session_caps()
1724 BUG_ON(session->s_nr_caps > 0); in remove_session_caps()
1725 BUG_ON(!list_empty(&session->s_cap_flushing)); in remove_session_caps()
1726 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1727 dispose_cap_releases(session->s_mdsc, &dispose); in remove_session_caps()
1749 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1750 ci->i_wanted_max_size = 0; in wake_up_session_cb()
1751 ci->i_requested_max_size = 0; in wake_up_session_cb()
1752 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1754 if (cap->cap_gen < cap->session->s_cap_gen) { in wake_up_session_cb()
1755 /* mds did not re-issue stale cap */ in wake_up_session_cb()
1756 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1757 cap->issued = cap->implemented = CEPH_CAP_PIN; in wake_up_session_cb()
1758 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1762 wake_up_all(&ci->i_cap_wq); in wake_up_session_cb()
1768 dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); in wake_up_session_caps()
1785 if (time_after_eq(jiffies, session->s_cap_ttl) && in send_renew_caps()
1786 time_after_eq(session->s_cap_ttl, session->s_renew_requested)) in send_renew_caps()
1787 pr_info("mds%d caps stale\n", session->s_mds); in send_renew_caps()
1788 session->s_renew_requested = jiffies; in send_renew_caps()
1792 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1795 session->s_mds, ceph_mds_state_name(state)); in send_renew_caps()
1799 dout("send_renew_caps to mds%d (%s)\n", session->s_mds, in send_renew_caps()
1802 ++session->s_renew_seq); in send_renew_caps()
1804 return -ENOMEM; in send_renew_caps()
1805 ceph_con_send(&session->s_con, msg); in send_renew_caps()
1815 session->s_mds, ceph_session_state_name(session->s_state), seq); in send_flushmsg_ack()
1818 return -ENOMEM; in send_flushmsg_ack()
1819 ceph_con_send(&session->s_con, msg); in send_flushmsg_ack()
1825 * Note new cap ttl, and any transition from stale -> not stale (fresh?).
1827 * Called under session->s_mutex
1835 spin_lock(&session->s_cap_lock); in renewed_caps()
1836 was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl); in renewed_caps()
1838 session->s_cap_ttl = session->s_renew_requested + in renewed_caps()
1839 mdsc->mdsmap->m_session_timeout*HZ; in renewed_caps()
1842 if (time_before(jiffies, session->s_cap_ttl)) { in renewed_caps()
1843 pr_info("mds%d caps renewed\n", session->s_mds); in renewed_caps()
1846 pr_info("mds%d caps still stale\n", session->s_mds); in renewed_caps()
1850 session->s_mds, session->s_cap_ttl, was_stale ? "stale" : "fresh", in renewed_caps()
1851 time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh"); in renewed_caps()
1852 spin_unlock(&session->s_cap_lock); in renewed_caps()
1866 session->s_mds, ceph_session_state_name(session->s_state), in request_close_session()
1867 session->s_seq); in request_close_session()
1868 msg = create_session_msg(CEPH_SESSION_REQUEST_CLOSE, session->s_seq); in request_close_session()
1870 return -ENOMEM; in request_close_session()
1871 ceph_con_send(&session->s_con, msg); in request_close_session()
1881 if (session->s_state >= CEPH_MDS_SESSION_CLOSING) in __close_session()
1883 session->s_state = CEPH_MDS_SESSION_CLOSING; in __close_session()
1895 spin_lock(&dentry->d_lock); in drop_negative_children()
1896 list_for_each_entry(child, &dentry->d_subdirs, d_child) { in drop_negative_children()
1902 spin_unlock(&dentry->d_lock); in drop_negative_children()
1927 return -1; in trim_caps_cb()
1929 spin_lock(&ci->i_ceph_lock); in trim_caps_cb()
1930 mine = cap->issued | cap->implemented; in trim_caps_cb()
1938 if (cap == ci->i_auth_cap) { in trim_caps_cb()
1939 if (ci->i_dirty_caps || ci->i_flushing_caps || in trim_caps_cb()
1940 !list_empty(&ci->i_cap_snaps)) in trim_caps_cb()
1944 /* Note: it's possible that i_filelock_ref becomes non-zero in trim_caps_cb()
1946 * of lock mds request will re-add auth caps. */ in trim_caps_cb()
1947 if (atomic_read(&ci->i_filelock_ref) > 0) in trim_caps_cb()
1952 if (S_ISREG(inode->i_mode) && in trim_caps_cb()
1964 (*remaining)--; in trim_caps_cb()
1968 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
1974 count = atomic_read(&inode->i_count); in trim_caps_cb()
1976 (*remaining)--; in trim_caps_cb()
1986 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
1997 int trim_caps = session->s_nr_caps - max_caps; in ceph_trim_caps()
2000 session->s_mds, session->s_nr_caps, max_caps, trim_caps); in ceph_trim_caps()
2006 session->s_mds, session->s_nr_caps, max_caps, in ceph_trim_caps()
2007 trim_caps - remaining); in ceph_trim_caps()
2019 spin_lock(&mdsc->cap_dirty_lock); in check_caps_flush()
2020 if (!list_empty(&mdsc->cap_flush_list)) { in check_caps_flush()
2022 list_first_entry(&mdsc->cap_flush_list, in check_caps_flush()
2024 if (cf->tid <= want_flush_tid) { in check_caps_flush()
2026 "%llu <= %llu\n", cf->tid, want_flush_tid); in check_caps_flush()
2030 spin_unlock(&mdsc->cap_dirty_lock); in check_caps_flush()
2044 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
2059 struct ceph_osd_client *osdc = &mdsc->fsc->client->osdc; in ceph_send_cap_releases()
2065 down_read(&osdc->lock); in ceph_send_cap_releases()
2066 barrier = cpu_to_le32(osdc->epoch_barrier); in ceph_send_cap_releases()
2067 up_read(&osdc->lock); in ceph_send_cap_releases()
2069 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2071 list_splice_init(&session->s_cap_releases, &tmp_list); in ceph_send_cap_releases()
2072 num_cap_releases = session->s_num_cap_releases; in ceph_send_cap_releases()
2073 session->s_num_cap_releases = 0; in ceph_send_cap_releases()
2074 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2082 head = msg->front.iov_base; in ceph_send_cap_releases()
2083 head->num = cpu_to_le32(0); in ceph_send_cap_releases()
2084 msg->front.iov_len = sizeof(*head); in ceph_send_cap_releases()
2086 msg->hdr.version = cpu_to_le16(2); in ceph_send_cap_releases()
2087 msg->hdr.compat_version = cpu_to_le16(1); in ceph_send_cap_releases()
2092 list_del(&cap->session_caps); in ceph_send_cap_releases()
2093 num_cap_releases--; in ceph_send_cap_releases()
2095 head = msg->front.iov_base; in ceph_send_cap_releases()
2096 put_unaligned_le32(get_unaligned_le32(&head->num) + 1, in ceph_send_cap_releases()
2097 &head->num); in ceph_send_cap_releases()
2098 item = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2099 item->ino = cpu_to_le64(cap->cap_ino); in ceph_send_cap_releases()
2100 item->cap_id = cpu_to_le64(cap->cap_id); in ceph_send_cap_releases()
2101 item->migrate_seq = cpu_to_le32(cap->mseq); in ceph_send_cap_releases()
2102 item->seq = cpu_to_le32(cap->issue_seq); in ceph_send_cap_releases()
2103 msg->front.iov_len += sizeof(*item); in ceph_send_cap_releases()
2107 if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { in ceph_send_cap_releases()
2109 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2111 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2113 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2114 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2115 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2122 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2123 if (!list_empty(&session->s_cap_releases)) in ceph_send_cap_releases()
2125 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2129 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2131 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2133 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2134 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2135 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2140 session->s_mds); in ceph_send_cap_releases()
2141 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2142 list_splice(&tmp_list, &session->s_cap_releases); in ceph_send_cap_releases()
2143 session->s_num_cap_releases += num_cap_releases; in ceph_send_cap_releases()
2144 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2152 mutex_lock(&session->s_mutex); in ceph_cap_release_work()
2153 if (session->s_state == CEPH_MDS_SESSION_OPEN || in ceph_cap_release_work()
2154 session->s_state == CEPH_MDS_SESSION_HUNG) in ceph_cap_release_work()
2155 ceph_send_cap_releases(session->s_mdsc, session); in ceph_cap_release_work()
2156 mutex_unlock(&session->s_mutex); in ceph_cap_release_work()
2163 if (mdsc->stopping) in ceph_flush_cap_releases()
2167 if (queue_work(mdsc->fsc->cap_wq, in ceph_flush_cap_releases()
2168 &session->s_cap_release_work)) { in ceph_flush_cap_releases()
2177 * caller holds session->s_cap_lock
2182 list_add_tail(&cap->session_caps, &session->s_cap_releases); in __ceph_queue_cap_release()
2183 session->s_num_cap_releases++; in __ceph_queue_cap_release()
2185 if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE)) in __ceph_queue_cap_release()
2186 ceph_flush_cap_releases(session->s_mdsc, session); in __ceph_queue_cap_release()
2194 if (ret == -EAGAIN) in ceph_cap_reclaim_work()
2200 if (mdsc->stopping) in ceph_queue_cap_reclaim_work()
2203 if (queue_work(mdsc->fsc->cap_wq, &mdsc->cap_reclaim_work)) { in ceph_queue_cap_reclaim_work()
2215 val = atomic_add_return(nr, &mdsc->cap_reclaim_pending); in ceph_reclaim_caps_nr()
2217 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_reclaim_caps_nr()
2230 struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; in ceph_alloc_readdir_reply_buffer()
2231 struct ceph_mount_options *opt = req->r_mdsc->fsc->mount_options; in ceph_alloc_readdir_reply_buffer()
2236 spin_lock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2237 num_entries = ci->i_files + ci->i_subdirs; in ceph_alloc_readdir_reply_buffer()
2238 spin_unlock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2240 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2244 rinfo->dir_entries = (void*)__get_free_pages(GFP_KERNEL | in ceph_alloc_readdir_reply_buffer()
2247 if (rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2249 order--; in ceph_alloc_readdir_reply_buffer()
2251 if (!rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2252 return -ENOMEM; in ceph_alloc_readdir_reply_buffer()
2255 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2257 rinfo->dir_buf_size = PAGE_SIZE << order; in ceph_alloc_readdir_reply_buffer()
2258 req->r_num_caps = num_entries + 1; in ceph_alloc_readdir_reply_buffer()
2259 req->r_args.readdir.max_entries = cpu_to_le32(num_entries); in ceph_alloc_readdir_reply_buffer()
2260 req->r_args.readdir.max_bytes = cpu_to_le32(opt->max_readdir_bytes); in ceph_alloc_readdir_reply_buffer()
2274 return ERR_PTR(-ENOMEM); in ceph_mdsc_create_request()
2276 mutex_init(&req->r_fill_mutex); in ceph_mdsc_create_request()
2277 req->r_mdsc = mdsc; in ceph_mdsc_create_request()
2278 req->r_started = jiffies; in ceph_mdsc_create_request()
2279 req->r_start_latency = ktime_get(); in ceph_mdsc_create_request()
2280 req->r_resend_mds = -1; in ceph_mdsc_create_request()
2281 INIT_LIST_HEAD(&req->r_unsafe_dir_item); in ceph_mdsc_create_request()
2282 INIT_LIST_HEAD(&req->r_unsafe_target_item); in ceph_mdsc_create_request()
2283 req->r_fmode = -1; in ceph_mdsc_create_request()
2284 kref_init(&req->r_kref); in ceph_mdsc_create_request()
2285 RB_CLEAR_NODE(&req->r_node); in ceph_mdsc_create_request()
2286 INIT_LIST_HEAD(&req->r_wait); in ceph_mdsc_create_request()
2287 init_completion(&req->r_completion); in ceph_mdsc_create_request()
2288 init_completion(&req->r_safe_completion); in ceph_mdsc_create_request()
2289 INIT_LIST_HEAD(&req->r_unsafe_item); in ceph_mdsc_create_request()
2291 ktime_get_coarse_real_ts64(&req->r_stamp); in ceph_mdsc_create_request()
2293 req->r_op = op; in ceph_mdsc_create_request()
2294 req->r_direct_mode = mode; in ceph_mdsc_create_request()
2301 * called under mdsc->mutex.
2305 if (RB_EMPTY_ROOT(&mdsc->request_tree)) in __get_oldest_req()
2307 return rb_entry(rb_first(&mdsc->request_tree), in __get_oldest_req()
2313 return mdsc->oldest_tid; in __get_oldest_tid()
2320 * If @stop_on_nosnap, generate path relative to the first non-snapped
2324 * foo/.snap/bar -> foo//bar
2336 return ERR_PTR(-EINVAL); in ceph_mdsc_build_path()
2340 return ERR_PTR(-ENOMEM); in ceph_mdsc_build_path()
2342 pos = PATH_MAX - 1; in ceph_mdsc_build_path()
2351 spin_lock(&temp->d_lock); in ceph_mdsc_build_path()
2358 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2362 pos -= temp->d_name.len; in ceph_mdsc_build_path()
2364 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2367 memcpy(path + pos, temp->d_name.name, temp->d_name.len); in ceph_mdsc_build_path()
2369 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2370 temp = READ_ONCE(temp->d_parent); in ceph_mdsc_build_path()
2377 if (--pos < 0) in ceph_mdsc_build_path()
2390 * A rename didn't occur, but somehow we didn't end up where in ceph_mdsc_build_path()
2393 pr_warn("build_path did not end path lookup where " in ceph_mdsc_build_path()
2399 *plen = PATH_MAX - 1 - pos; in ceph_mdsc_build_path()
2413 dir = d_inode_rcu(dentry->d_parent); in build_dentry_path()
2417 *ppath = dentry->d_name.name; in build_dentry_path()
2418 *ppathlen = dentry->d_name.len; in build_dentry_path()
2483 * called under mdsc->mutex
2498 void *p, *end; in create_request_message() local
2501 ret = set_request_path_attr(req->r_inode, req->r_dentry, in create_request_message()
2502 req->r_parent, req->r_path1, req->r_ino1.ino, in create_request_message()
2505 &req->r_req_flags)); in create_request_message()
2512 ret = set_request_path_attr(NULL, req->r_old_dentry, in create_request_message()
2513 req->r_old_dentry_dir, in create_request_message()
2514 req->r_path2, req->r_ino2.ino, in create_request_message()
2527 (!!req->r_inode_drop + !!req->r_dentry_drop + in create_request_message()
2528 !!req->r_old_inode_drop + !!req->r_old_dentry_drop); in create_request_message()
2529 if (req->r_dentry_drop) in create_request_message()
2531 if (req->r_old_dentry_drop) in create_request_message()
2536 msg = ERR_PTR(-ENOMEM); in create_request_message()
2540 msg->hdr.version = cpu_to_le16(2); in create_request_message()
2541 msg->hdr.tid = cpu_to_le64(req->r_tid); in create_request_message()
2543 head = msg->front.iov_base; in create_request_message()
2544 p = msg->front.iov_base + sizeof(*head); in create_request_message()
2545 end = msg->front.iov_base + msg->front.iov_len; in create_request_message()
2547 head->mdsmap_epoch = cpu_to_le32(mdsc->mdsmap->m_epoch); in create_request_message()
2548 head->op = cpu_to_le32(req->r_op); in create_request_message()
2549 head->caller_uid = cpu_to_le32(from_kuid(&init_user_ns, req->r_uid)); in create_request_message()
2550 head->caller_gid = cpu_to_le32(from_kgid(&init_user_ns, req->r_gid)); in create_request_message()
2551 head->ino = cpu_to_le64(req->r_deleg_ino); in create_request_message()
2552 head->args = req->r_args; in create_request_message()
2554 ceph_encode_filepath(&p, end, ino1, path1); in create_request_message()
2555 ceph_encode_filepath(&p, end, ino2, path2); in create_request_message()
2558 req->r_request_release_offset = p - msg->front.iov_base; in create_request_message()
2562 if (req->r_inode_drop) in create_request_message()
2564 req->r_inode ? req->r_inode : d_inode(req->r_dentry), in create_request_message()
2565 mds, req->r_inode_drop, req->r_inode_unless, in create_request_message()
2566 req->r_op == CEPH_MDS_OP_READDIR); in create_request_message()
2567 if (req->r_dentry_drop) in create_request_message()
2568 releases += ceph_encode_dentry_release(&p, req->r_dentry, in create_request_message()
2569 req->r_parent, mds, req->r_dentry_drop, in create_request_message()
2570 req->r_dentry_unless); in create_request_message()
2571 if (req->r_old_dentry_drop) in create_request_message()
2572 releases += ceph_encode_dentry_release(&p, req->r_old_dentry, in create_request_message()
2573 req->r_old_dentry_dir, mds, in create_request_message()
2574 req->r_old_dentry_drop, in create_request_message()
2575 req->r_old_dentry_unless); in create_request_message()
2576 if (req->r_old_inode_drop) in create_request_message()
2578 d_inode(req->r_old_dentry), in create_request_message()
2579 mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); in create_request_message()
2583 p = msg->front.iov_base + req->r_request_release_offset; in create_request_message()
2586 head->num_releases = cpu_to_le16(releases); in create_request_message()
2591 ceph_encode_timespec64(&ts, &req->r_stamp); in create_request_message()
2595 if (WARN_ON_ONCE(p > end)) { in create_request_message()
2597 msg = ERR_PTR(-ERANGE); in create_request_message()
2601 msg->front.iov_len = p - msg->front.iov_base; in create_request_message()
2602 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_request_message()
2604 if (req->r_pagelist) { in create_request_message()
2605 struct ceph_pagelist *pagelist = req->r_pagelist; in create_request_message()
2607 msg->hdr.data_len = cpu_to_le32(pagelist->length); in create_request_message()
2609 msg->hdr.data_len = 0; in create_request_message()
2612 msg->hdr.data_off = cpu_to_le16(0); in create_request_message()
2625 * called under mdsc->mutex if error, under no mutex if
2631 req->r_end_latency = ktime_get(); in complete_request()
2633 if (req->r_callback) in complete_request()
2634 req->r_callback(mdsc, req); in complete_request()
2635 complete_all(&req->r_completion); in complete_request()
2639 * called under mdsc->mutex
2649 req->r_attempts++; in __prepare_send_request()
2650 if (req->r_inode) { in __prepare_send_request()
2652 ceph_get_cap_for_mds(ceph_inode(req->r_inode), mds); in __prepare_send_request()
2655 req->r_sent_on_mseq = cap->mseq; in __prepare_send_request()
2657 req->r_sent_on_mseq = -1; in __prepare_send_request()
2660 req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); in __prepare_send_request()
2662 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __prepare_send_request()
2670 msg = req->r_request; in __prepare_send_request()
2671 rhead = msg->front.iov_base; in __prepare_send_request()
2673 flags = le32_to_cpu(rhead->flags); in __prepare_send_request()
2675 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2677 if (req->r_target_inode) in __prepare_send_request()
2678 rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); in __prepare_send_request()
2680 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2683 rhead->num_releases = 0; in __prepare_send_request()
2686 p = msg->front.iov_base + req->r_request_release_offset; in __prepare_send_request()
2689 ceph_encode_timespec64(&ts, &req->r_stamp); in __prepare_send_request()
2693 msg->front.iov_len = p - msg->front.iov_base; in __prepare_send_request()
2694 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in __prepare_send_request()
2698 if (req->r_request) { in __prepare_send_request()
2699 ceph_msg_put(req->r_request); in __prepare_send_request()
2700 req->r_request = NULL; in __prepare_send_request()
2704 req->r_err = PTR_ERR(msg); in __prepare_send_request()
2707 req->r_request = msg; in __prepare_send_request()
2709 rhead = msg->front.iov_base; in __prepare_send_request()
2710 rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc)); in __prepare_send_request()
2711 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in __prepare_send_request()
2713 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) in __prepare_send_request()
2715 if (req->r_parent) in __prepare_send_request()
2717 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2718 rhead->num_fwd = req->r_num_fwd; in __prepare_send_request()
2719 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2721 dout(" r_parent = %p\n", req->r_parent); in __prepare_send_request()
2726 * called under mdsc->mutex
2735 err = __prepare_send_request(mdsc, req, session->s_mds, in __send_request()
2738 ceph_msg_get(req->r_request); in __send_request()
2739 ceph_con_send(&session->s_con, req->r_request); in __send_request()
2752 int mds = -1; in __do_request()
2756 if (req->r_err || test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in __do_request()
2757 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) in __do_request()
2762 if (req->r_timeout && in __do_request()
2763 time_after_eq(jiffies, req->r_started + req->r_timeout)) { in __do_request()
2765 err = -ETIMEDOUT; in __do_request()
2768 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in __do_request()
2770 err = -EIO; in __do_request()
2773 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_MOUNTING) { in __do_request()
2774 if (mdsc->mdsmap_err) { in __do_request()
2775 err = mdsc->mdsmap_err; in __do_request()
2779 if (mdsc->mdsmap->m_epoch == 0) { in __do_request()
2781 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2784 if (!(mdsc->fsc->mount_options->flags & in __do_request()
2786 !ceph_mdsmap_is_cluster_available(mdsc->mdsmap)) { in __do_request()
2787 err = -EHOSTUNREACH; in __do_request()
2796 ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { in __do_request()
2797 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2798 err = -EJUKEBOX; in __do_request()
2802 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2815 req->r_session = ceph_get_mds_session(session); in __do_request()
2818 ceph_session_state_name(session->s_state)); in __do_request()
2819 if (session->s_state != CEPH_MDS_SESSION_OPEN && in __do_request()
2820 session->s_state != CEPH_MDS_SESSION_HUNG) { in __do_request()
2821 if (session->s_state == CEPH_MDS_SESSION_REJECTED) { in __do_request()
2822 err = -EACCES; in __do_request()
2827 * inodes are bound to the session. Just return -EJUKEBOX and in __do_request()
2830 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2831 err = -EJUKEBOX; in __do_request()
2834 if (session->s_state == CEPH_MDS_SESSION_NEW || in __do_request()
2835 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __do_request()
2841 req->r_resend_mds = mds; in __do_request()
2843 list_add(&req->r_wait, &session->s_waiting); in __do_request()
2848 req->r_resend_mds = -1; /* forget any previous mds hint */ in __do_request()
2850 if (req->r_request_started == 0) /* note request start time */ in __do_request()
2851 req->r_request_started = jiffies; in __do_request()
2860 req->r_err = err; in __do_request()
2868 * called under mdsc->mutex
2881 list_del_init(&req->r_wait); in __wake_requests()
2882 dout(" wake request %p tid %llu\n", req, req->r_tid); in __wake_requests()
2894 struct rb_node *p = rb_first(&mdsc->request_tree); in kick_requests()
2900 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in kick_requests()
2902 if (req->r_attempts > 0) in kick_requests()
2904 if (req->r_session && in kick_requests()
2905 req->r_session->s_mds == mds) { in kick_requests()
2906 dout(" kicking tid %llu\n", req->r_tid); in kick_requests()
2907 list_del_init(&req->r_wait); in kick_requests()
2919 if (req->r_inode) in ceph_mdsc_submit_request()
2920 ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_submit_request()
2921 if (req->r_parent) { in ceph_mdsc_submit_request()
2922 struct ceph_inode_info *ci = ceph_inode(req->r_parent); in ceph_mdsc_submit_request()
2923 int fmode = (req->r_op & CEPH_MDS_OP_WRITE) ? in ceph_mdsc_submit_request()
2925 spin_lock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2928 spin_unlock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2929 ihold(req->r_parent); in ceph_mdsc_submit_request()
2931 if (req->r_old_dentry_dir) in ceph_mdsc_submit_request()
2932 ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_submit_request()
2935 if (req->r_inode) { in ceph_mdsc_submit_request()
2936 err = ceph_wait_on_async_create(req->r_inode); in ceph_mdsc_submit_request()
2944 if (!err && req->r_old_inode) { in ceph_mdsc_submit_request()
2945 err = ceph_wait_on_async_create(req->r_old_inode); in ceph_mdsc_submit_request()
2954 mutex_lock(&mdsc->mutex); in ceph_mdsc_submit_request()
2957 err = req->r_err; in ceph_mdsc_submit_request()
2958 mutex_unlock(&mdsc->mutex); in ceph_mdsc_submit_request()
2969 if (!req->r_timeout && req->r_wait_for_completion) { in ceph_mdsc_wait_request()
2970 err = req->r_wait_for_completion(mdsc, req); in ceph_mdsc_wait_request()
2973 &req->r_completion, in ceph_mdsc_wait_request()
2974 ceph_timeout_jiffies(req->r_timeout)); in ceph_mdsc_wait_request()
2978 err = -ETIMEDOUT; /* timed out */ in ceph_mdsc_wait_request()
2983 mutex_lock(&mdsc->mutex); in ceph_mdsc_wait_request()
2986 if (test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in ceph_mdsc_wait_request()
2987 err = le32_to_cpu(req->r_reply_info.head->result); in ceph_mdsc_wait_request()
2989 dout("aborted request %lld with %d\n", req->r_tid, err); in ceph_mdsc_wait_request()
2996 mutex_lock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
2997 req->r_err = err; in ceph_mdsc_wait_request()
2998 set_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags); in ceph_mdsc_wait_request()
2999 mutex_unlock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3001 if (req->r_parent && in ceph_mdsc_wait_request()
3002 (req->r_op & CEPH_MDS_OP_WRITE)) in ceph_mdsc_wait_request()
3005 err = req->r_err; in ceph_mdsc_wait_request()
3008 mutex_unlock(&mdsc->mutex); in ceph_mdsc_wait_request()
3038 struct inode *dir = req->r_parent; in ceph_invalidate_dir_request()
3039 struct inode *old_dir = req->r_old_dentry_dir; in ceph_invalidate_dir_request()
3046 if (req->r_dentry) in ceph_invalidate_dir_request()
3047 ceph_invalidate_dentry_lease(req->r_dentry); in ceph_invalidate_dir_request()
3048 if (req->r_old_dentry) in ceph_invalidate_dir_request()
3049 ceph_invalidate_dentry_lease(req->r_old_dentry); in ceph_invalidate_dir_request()
3061 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply()
3063 struct ceph_mds_reply_head *head = msg->front.iov_base; in handle_reply()
3068 int mds = session->s_mds; in handle_reply()
3070 if (msg->front.iov_len < sizeof(*head)) { in handle_reply()
3077 tid = le64_to_cpu(msg->hdr.tid); in handle_reply()
3078 mutex_lock(&mdsc->mutex); in handle_reply()
3082 mutex_unlock(&mdsc->mutex); in handle_reply()
3088 if (req->r_session != session) { in handle_reply()
3090 " not mds%d\n", tid, session->s_mds, in handle_reply()
3091 req->r_session ? req->r_session->s_mds : -1); in handle_reply()
3092 mutex_unlock(&mdsc->mutex); in handle_reply()
3097 if ((test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags) && !head->safe) || in handle_reply()
3098 (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags) && head->safe)) { in handle_reply()
3100 head->safe ? "safe" : "unsafe", tid, mds); in handle_reply()
3101 mutex_unlock(&mdsc->mutex); in handle_reply()
3104 if (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags)) { in handle_reply()
3107 mutex_unlock(&mdsc->mutex); in handle_reply()
3111 result = le32_to_cpu(head->result); in handle_reply()
3120 if (result == -ESTALE) { in handle_reply()
3121 dout("got ESTALE on request %llu\n", req->r_tid); in handle_reply()
3122 req->r_resend_mds = -1; in handle_reply()
3123 if (req->r_direct_mode != USE_AUTH_MDS) { in handle_reply()
3125 req->r_direct_mode = USE_AUTH_MDS; in handle_reply()
3127 mutex_unlock(&mdsc->mutex); in handle_reply()
3131 if (mds >= 0 && mds != req->r_session->s_mds) { in handle_reply()
3134 mutex_unlock(&mdsc->mutex); in handle_reply()
3138 dout("have to return ESTALE on request %llu\n", req->r_tid); in handle_reply()
3142 if (head->safe) { in handle_reply()
3143 set_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags); in handle_reply()
3147 if (mdsc->stopping && !__get_oldest_req(mdsc)) in handle_reply()
3148 complete_all(&mdsc->safe_umount_waiters); in handle_reply()
3150 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3160 mutex_unlock(&mdsc->mutex); in handle_reply()
3164 set_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags); in handle_reply()
3165 list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); in handle_reply()
3169 rinfo = &req->r_reply_info; in handle_reply()
3170 if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features)) in handle_reply()
3171 err = parse_reply_info(session, msg, rinfo, (u64)-1); in handle_reply()
3173 err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features); in handle_reply()
3174 mutex_unlock(&mdsc->mutex); in handle_reply()
3176 mutex_lock(&session->s_mutex); in handle_reply()
3185 if (rinfo->snapblob_len) { in handle_reply()
3186 down_write(&mdsc->snap_rwsem); in handle_reply()
3187 ceph_update_snap_trace(mdsc, rinfo->snapblob, in handle_reply()
3188 rinfo->snapblob + rinfo->snapblob_len, in handle_reply()
3189 le32_to_cpu(head->op) == CEPH_MDS_OP_RMSNAP, in handle_reply()
3191 downgrade_write(&mdsc->snap_rwsem); in handle_reply()
3193 down_read(&mdsc->snap_rwsem); in handle_reply()
3197 mutex_lock(&req->r_fill_mutex); in handle_reply()
3198 current->journal_info = req; in handle_reply()
3199 err = ceph_fill_trace(mdsc->fsc->sb, req); in handle_reply()
3201 if (result == 0 && (req->r_op == CEPH_MDS_OP_READDIR || in handle_reply()
3202 req->r_op == CEPH_MDS_OP_LSSNAP)) in handle_reply()
3203 ceph_readdir_prepopulate(req, req->r_session); in handle_reply()
3205 current->journal_info = NULL; in handle_reply()
3206 mutex_unlock(&req->r_fill_mutex); in handle_reply()
3208 up_read(&mdsc->snap_rwsem); in handle_reply()
3213 if (req->r_target_inode && in handle_reply()
3214 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3216 ceph_inode(req->r_target_inode); in handle_reply()
3217 spin_lock(&ci->i_unsafe_lock); in handle_reply()
3218 list_add_tail(&req->r_unsafe_target_item, in handle_reply()
3219 &ci->i_unsafe_iops); in handle_reply()
3220 spin_unlock(&ci->i_unsafe_lock); in handle_reply()
3223 ceph_unreserve_caps(mdsc, &req->r_caps_reservation); in handle_reply()
3226 mutex_lock(&mdsc->mutex); in handle_reply()
3227 if (!test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_reply()
3229 req->r_err = err; in handle_reply()
3231 req->r_reply = ceph_msg_get(msg); in handle_reply()
3232 set_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags); in handle_reply()
3237 mutex_unlock(&mdsc->mutex); in handle_reply()
3239 mutex_unlock(&session->s_mutex); in handle_reply()
3244 ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency, in handle_reply()
3245 req->r_end_latency, err); in handle_reply()
3261 u64 tid = le64_to_cpu(msg->hdr.tid); in handle_forward()
3264 int err = -EINVAL; in handle_forward()
3265 void *p = msg->front.iov_base; in handle_forward()
3266 void *end = p + msg->front.iov_len; in handle_forward() local
3268 ceph_decode_need(&p, end, 2*sizeof(u32), bad); in handle_forward()
3272 mutex_lock(&mdsc->mutex); in handle_forward()
3275 dout("forward tid %llu to mds%d - req dne\n", tid, next_mds); in handle_forward()
3279 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_forward()
3282 } else if (fwd_seq <= req->r_num_fwd) { in handle_forward()
3283 dout("forward tid %llu to mds%d - old seq %d <= %d\n", in handle_forward()
3284 tid, next_mds, req->r_num_fwd, fwd_seq); in handle_forward()
3288 BUG_ON(req->r_err); in handle_forward()
3289 BUG_ON(test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)); in handle_forward()
3290 req->r_attempts = 0; in handle_forward()
3291 req->r_num_fwd = fwd_seq; in handle_forward()
3292 req->r_resend_mds = next_mds; in handle_forward()
3298 mutex_unlock(&mdsc->mutex); in handle_forward()
3305 static int __decode_session_metadata(void **p, void *end, in __decode_session_metadata() argument
3311 ceph_decode_32_safe(p, end, n, bad); in __decode_session_metadata()
3312 while (n-- > 0) { in __decode_session_metadata()
3314 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3315 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3318 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3319 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3330 return -1; in __decode_session_metadata()
3339 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session()
3340 int mds = session->s_mds; in handle_session()
3341 int msg_version = le16_to_cpu(msg->hdr.version); in handle_session()
3342 void *p = msg->front.iov_base; in handle_session()
3343 void *end = p + msg->front.iov_len; in handle_session() local
3351 ceph_decode_need(&p, end, sizeof(*h), bad); in handle_session()
3355 op = le32_to_cpu(h->op); in handle_session()
3356 seq = le64_to_cpu(h->seq); in handle_session()
3361 if (__decode_session_metadata(&p, end, &blocklisted) < 0) in handle_session()
3364 ceph_decode_32_safe(&p, end, len, bad); in handle_session()
3366 ceph_decode_64_safe(&p, end, features, bad); in handle_session()
3367 p += len - sizeof(features); in handle_session()
3371 mutex_lock(&mdsc->mutex); in handle_session()
3377 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
3378 mutex_unlock(&mdsc->mutex); in handle_session()
3380 mutex_lock(&session->s_mutex); in handle_session()
3384 ceph_session_state_name(session->s_state), seq); in handle_session()
3386 if (session->s_state == CEPH_MDS_SESSION_HUNG) { in handle_session()
3387 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3388 pr_info("mds%d came back\n", session->s_mds); in handle_session()
3393 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3394 pr_info("mds%d reconnect success\n", session->s_mds); in handle_session()
3395 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3396 session->s_features = features; in handle_session()
3398 if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features)) in handle_session()
3399 metric_schedule_delayed(&mdsc->metric); in handle_session()
3401 if (mdsc->stopping) in handle_session()
3406 if (session->s_renew_seq == seq) in handle_session()
3411 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3412 pr_info("mds%d reconnect denied\n", session->s_mds); in handle_session()
3413 session->s_state = CEPH_MDS_SESSION_CLOSED; in handle_session()
3417 wake_up_all(&mdsc->session_close_wq); in handle_session()
3422 session->s_mds); in handle_session()
3423 spin_lock(&session->s_gen_ttl_lock); in handle_session()
3424 session->s_cap_gen++; in handle_session()
3425 session->s_cap_ttl = jiffies - 1; in handle_session()
3426 spin_unlock(&session->s_gen_ttl_lock); in handle_session()
3431 ceph_trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
3440 spin_lock(&session->s_cap_lock); in handle_session()
3441 session->s_readonly = true; in handle_session()
3442 spin_unlock(&session->s_cap_lock); in handle_session()
3447 WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); in handle_session()
3448 pr_info("mds%d rejected session\n", session->s_mds); in handle_session()
3449 session->s_state = CEPH_MDS_SESSION_REJECTED; in handle_session()
3453 mdsc->fsc->blocklisted = true; in handle_session()
3462 mutex_unlock(&session->s_mutex); in handle_session()
3464 mutex_lock(&mdsc->mutex); in handle_session()
3465 __wake_requests(mdsc, &session->s_waiting); in handle_session()
3468 mutex_unlock(&mdsc->mutex); in handle_session()
3476 (int)msg->front.iov_len); in handle_session()
3485 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps()
3488 ceph_put_cap_refs(ceph_inode(req->r_parent), dcaps); in ceph_mdsc_release_dir_caps()
3496 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps_no_check()
3499 ceph_put_cap_refs_no_check_caps(ceph_inode(req->r_parent), in ceph_mdsc_release_dir_caps_no_check()
3505 * called under session->mutex.
3513 dout("replay_unsafe_requests mds%d\n", session->s_mds); in replay_unsafe_requests()
3515 mutex_lock(&mdsc->mutex); in replay_unsafe_requests()
3516 list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) in replay_unsafe_requests()
3520 * also re-send old requests when MDS enters reconnect stage. So that MDS in replay_unsafe_requests()
3523 p = rb_first(&mdsc->request_tree); in replay_unsafe_requests()
3527 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in replay_unsafe_requests()
3529 if (req->r_attempts == 0) in replay_unsafe_requests()
3531 if (!req->r_session) in replay_unsafe_requests()
3533 if (req->r_session->s_mds != session->s_mds) in replay_unsafe_requests()
3540 mutex_unlock(&mdsc->mutex); in replay_unsafe_requests()
3549 int err = -ENOMEM; in send_reconnect_partial()
3551 if (!recon_state->allow_multi) in send_reconnect_partial()
3552 return -ENOSPC; in send_reconnect_partial()
3555 BUG_ON(!recon_state->nr_caps == !recon_state->nr_realms); in send_reconnect_partial()
3557 /* pre-allocate new pagelist */ in send_reconnect_partial()
3560 return -ENOMEM; in send_reconnect_partial()
3571 if (recon_state->nr_caps) { in send_reconnect_partial()
3573 err = ceph_pagelist_encode_32(recon_state->pagelist, 0); in send_reconnect_partial()
3583 err = ceph_pagelist_encode_8(recon_state->pagelist, 1); in send_reconnect_partial()
3587 page = list_first_entry(&recon_state->pagelist->head, struct page, lru); in send_reconnect_partial()
3589 if (recon_state->nr_caps) { in send_reconnect_partial()
3591 *addr = cpu_to_le32(recon_state->nr_caps); in send_reconnect_partial()
3594 *(addr + 1) = cpu_to_le32(recon_state->nr_realms); in send_reconnect_partial()
3598 reply->hdr.version = cpu_to_le16(5); in send_reconnect_partial()
3599 reply->hdr.compat_version = cpu_to_le16(4); in send_reconnect_partial()
3601 reply->hdr.data_len = cpu_to_le32(recon_state->pagelist->length); in send_reconnect_partial()
3602 ceph_msg_data_add_pagelist(reply, recon_state->pagelist); in send_reconnect_partial()
3604 ceph_con_send(&recon_state->session->s_con, reply); in send_reconnect_partial()
3605 ceph_pagelist_release(recon_state->pagelist); in send_reconnect_partial()
3607 recon_state->pagelist = _pagelist; in send_reconnect_partial()
3608 recon_state->nr_caps = 0; in send_reconnect_partial()
3609 recon_state->nr_realms = 0; in send_reconnect_partial()
3610 recon_state->msg_version = 5; in send_reconnect_partial()
3623 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3626 spin_lock(&inode->i_lock); in d_find_primary()
3627 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3630 if (S_ISDIR(inode->i_mode)) { in d_find_primary()
3631 alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias); in d_find_primary()
3637 hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { in d_find_primary()
3638 spin_lock(&alias->d_lock); in d_find_primary()
3640 (ceph_dentry(alias)->flags & CEPH_DENTRY_PRIMARY_LINK)) { in d_find_primary()
3643 spin_unlock(&alias->d_lock); in d_find_primary()
3648 spin_unlock(&inode->i_lock); in d_find_primary()
3662 struct ceph_inode_info *ci = cap->ci; in reconnect_caps_cb()
3664 struct ceph_pagelist *pagelist = recon_state->pagelist; in reconnect_caps_cb()
3672 inode, ceph_vinop(inode), cap, cap->cap_id, in reconnect_caps_cb()
3673 ceph_cap_string(cap->issued)); in reconnect_caps_cb()
3679 recon_state->msg_version >= 2); in reconnect_caps_cb()
3691 spin_lock(&ci->i_ceph_lock); in reconnect_caps_cb()
3692 cap->seq = 0; /* reset cap seq */ in reconnect_caps_cb()
3693 cap->issue_seq = 0; /* and issue_seq */ in reconnect_caps_cb()
3694 cap->mseq = 0; /* and migrate_seq */ in reconnect_caps_cb()
3695 cap->cap_gen = cap->session->s_cap_gen; in reconnect_caps_cb()
3698 if (S_ISDIR(inode->i_mode)) { in reconnect_caps_cb()
3699 if (cap->issued & CEPH_CAP_DIR_CREATE) { in reconnect_caps_cb()
3700 ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); in reconnect_caps_cb()
3701 memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout)); in reconnect_caps_cb()
3703 cap->issued &= ~CEPH_CAP_ANY_DIR_OPS; in reconnect_caps_cb()
3706 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3707 rec.v2.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3709 rec.v2.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3710 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3713 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1); in reconnect_caps_cb()
3715 rec.v1.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3717 rec.v1.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3718 rec.v1.size = cpu_to_le64(inode->i_size); in reconnect_caps_cb()
3719 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime); in reconnect_caps_cb()
3720 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime); in reconnect_caps_cb()
3721 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3725 if (list_empty(&ci->i_cap_snaps)) { in reconnect_caps_cb()
3726 snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0; in reconnect_caps_cb()
3729 list_first_entry(&ci->i_cap_snaps, in reconnect_caps_cb()
3731 snap_follows = capsnap->follows; in reconnect_caps_cb()
3733 spin_unlock(&ci->i_ceph_lock); in reconnect_caps_cb()
3735 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3753 err = -ENOMEM; in reconnect_caps_cb()
3762 if (err == -ENOSPC) in reconnect_caps_cb()
3771 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3791 if (pagelist->length + total_len > RECONNECT_MAX_SIZE) { in reconnect_caps_cb()
3795 pagelist = recon_state->pagelist; in reconnect_caps_cb()
3803 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3831 recon_state->nr_caps++; in reconnect_caps_cb()
3839 struct ceph_pagelist *pagelist = recon_state->pagelist; in encode_snap_realms()
3842 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3843 err = ceph_pagelist_encode_32(pagelist, mdsc->num_snap_realms); in encode_snap_realms()
3853 for (p = rb_first(&mdsc->snap_realms); p; p = rb_next(p)) { in encode_snap_realms()
3858 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3862 if (pagelist->length + need > RECONNECT_MAX_SIZE) { in encode_snap_realms()
3866 pagelist = recon_state->pagelist; in encode_snap_realms()
3879 realm->ino, realm->seq, realm->parent_ino); in encode_snap_realms()
3880 sr_rec.ino = cpu_to_le64(realm->ino); in encode_snap_realms()
3881 sr_rec.seq = cpu_to_le64(realm->seq); in encode_snap_realms()
3882 sr_rec.parent = cpu_to_le64(realm->parent_ino); in encode_snap_realms()
3888 recon_state->nr_realms++; in encode_snap_realms()
3909 int mds = session->s_mds; in send_mds_reconnect()
3910 int err = -ENOMEM; in send_mds_reconnect()
3926 xa_destroy(&session->s_delegated_inos); in send_mds_reconnect()
3928 mutex_lock(&session->s_mutex); in send_mds_reconnect()
3929 session->s_state = CEPH_MDS_SESSION_RECONNECTING; in send_mds_reconnect()
3930 session->s_seq = 0; in send_mds_reconnect()
3933 ceph_session_state_name(session->s_state)); in send_mds_reconnect()
3935 spin_lock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3936 session->s_cap_gen++; in send_mds_reconnect()
3937 spin_unlock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3939 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
3941 session->s_readonly = 0; in send_mds_reconnect()
3947 session->s_cap_reconnect = 1; in send_mds_reconnect()
3950 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
3954 if (mdsc->fsc->sb->s_root) in send_mds_reconnect()
3955 shrink_dcache_parent(mdsc->fsc->sb->s_root); in send_mds_reconnect()
3957 ceph_con_close(&session->s_con); in send_mds_reconnect()
3958 ceph_con_open(&session->s_con, in send_mds_reconnect()
3960 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in send_mds_reconnect()
3967 down_read(&mdsc->snap_rwsem); in send_mds_reconnect()
3974 if (test_bit(CEPHFS_FEATURE_MULTI_RECONNECT, &session->s_features)) { in send_mds_reconnect()
3977 } else if (session->s_con.peer_features & CEPH_FEATURE_MDSENC) { in send_mds_reconnect()
3985 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
3986 session->s_cap_reconnect = 0; in send_mds_reconnect()
3987 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
3993 if (mdsc->num_snap_realms) { in send_mds_reconnect()
3995 recon_state.pagelist->length + in send_mds_reconnect()
3996 mdsc->num_snap_realms * in send_mds_reconnect()
4002 total_len += mdsc->num_snap_realms * in send_mds_reconnect()
4007 err = -ENOSPC; in send_mds_reconnect()
4031 list_first_entry(&recon_state.pagelist->head, in send_mds_reconnect()
4035 WARN_ON(recon_state.nr_realms != mdsc->num_snap_realms); in send_mds_reconnect()
4043 reply->hdr.version = cpu_to_le16(recon_state.msg_version); in send_mds_reconnect()
4045 reply->hdr.compat_version = cpu_to_le16(4); in send_mds_reconnect()
4047 reply->hdr.data_len = cpu_to_le32(recon_state.pagelist->length); in send_mds_reconnect()
4050 ceph_con_send(&session->s_con, reply); in send_mds_reconnect()
4052 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4054 mutex_lock(&mdsc->mutex); in send_mds_reconnect()
4055 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
4056 mutex_unlock(&mdsc->mutex); in send_mds_reconnect()
4058 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4064 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4065 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4078 * called under mdsc->mutex.
4089 newmap->m_epoch, oldmap->m_epoch); in check_new_map()
4091 for (i = 0; i < oldmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4092 if (!mdsc->sessions[i]) in check_new_map()
4094 s = mdsc->sessions[i]; in check_new_map()
4098 dout("check_new_map mds%d state %s%s -> %s%s (session %s)\n", in check_new_map()
4103 ceph_session_state_name(s->s_state)); in check_new_map()
4105 if (i >= newmap->possible_max_rank) { in check_new_map()
4109 __wake_requests(mdsc, &s->s_waiting); in check_new_map()
4110 mutex_unlock(&mdsc->mutex); in check_new_map()
4112 mutex_lock(&s->s_mutex); in check_new_map()
4115 mutex_unlock(&s->s_mutex); in check_new_map()
4119 mutex_lock(&mdsc->mutex); in check_new_map()
4128 mutex_unlock(&mdsc->mutex); in check_new_map()
4129 mutex_lock(&s->s_mutex); in check_new_map()
4130 mutex_lock(&mdsc->mutex); in check_new_map()
4131 ceph_con_close(&s->s_con); in check_new_map()
4132 mutex_unlock(&s->s_mutex); in check_new_map()
4133 s->s_state = CEPH_MDS_SESSION_RESTARTING; in check_new_map()
4141 if (s->s_state == CEPH_MDS_SESSION_RESTARTING && in check_new_map()
4143 mutex_unlock(&mdsc->mutex); in check_new_map()
4145 mutex_lock(&mdsc->mutex); in check_new_map()
4155 pr_info("mds%d recovery completed\n", s->s_mds); in check_new_map()
4157 mutex_unlock(&mdsc->mutex); in check_new_map()
4158 mutex_lock(&s->s_mutex); in check_new_map()
4159 mutex_lock(&mdsc->mutex); in check_new_map()
4161 mutex_unlock(&s->s_mutex); in check_new_map()
4166 for (i = 0; i < newmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4167 s = mdsc->sessions[i]; in check_new_map()
4172 if (s->s_state == CEPH_MDS_SESSION_OPEN || in check_new_map()
4173 s->s_state == CEPH_MDS_SESSION_HUNG || in check_new_map()
4174 s->s_state == CEPH_MDS_SESSION_CLOSING) { in check_new_map()
4189 * caller must hold session s_mutex, dentry->d_lock
4195 ceph_put_mds_session(di->lease_session); in __ceph_mdsc_drop_dentry_lease()
4196 di->lease_session = NULL; in __ceph_mdsc_drop_dentry_lease()
4203 struct super_block *sb = mdsc->fsc->sb; in handle_lease()
4207 int mds = session->s_mds; in handle_lease()
4208 struct ceph_mds_lease *h = msg->front.iov_base; in handle_lease()
4217 if (msg->front.iov_len < sizeof(*h) + sizeof(u32)) in handle_lease()
4219 vino.ino = le64_to_cpu(h->ino); in handle_lease()
4221 seq = le32_to_cpu(h->seq); in handle_lease()
4223 if (msg->front.iov_len < sizeof(*h) + sizeof(u32) + dname.len) in handle_lease()
4230 ceph_lease_op_name(h->action), vino.ino, inode, in handle_lease()
4233 mutex_lock(&session->s_mutex); in handle_lease()
4254 spin_lock(&dentry->d_lock); in handle_lease()
4256 switch (h->action) { in handle_lease()
4258 if (di->lease_session == session) { in handle_lease()
4259 if (ceph_seq_cmp(di->lease_seq, seq) > 0) in handle_lease()
4260 h->seq = cpu_to_le32(di->lease_seq); in handle_lease()
4267 if (di->lease_session == session && in handle_lease()
4268 di->lease_gen == session->s_cap_gen && in handle_lease()
4269 di->lease_renew_from && in handle_lease()
4270 di->lease_renew_after == 0) { in handle_lease()
4272 msecs_to_jiffies(le32_to_cpu(h->duration_ms)); in handle_lease()
4274 di->lease_seq = seq; in handle_lease()
4275 di->time = di->lease_renew_from + duration; in handle_lease()
4276 di->lease_renew_after = di->lease_renew_from + in handle_lease()
4278 di->lease_renew_from = 0; in handle_lease()
4282 spin_unlock(&dentry->d_lock); in handle_lease()
4290 h->action = CEPH_MDS_LEASE_REVOKE_ACK; in handle_lease()
4292 ceph_con_send(&session->s_con, msg); in handle_lease()
4295 mutex_unlock(&session->s_mutex); in handle_lease()
4315 dentry, ceph_lease_op_name(action), session->s_mds); in ceph_mdsc_lease_send_msg()
4320 lease = msg->front.iov_base; in ceph_mdsc_lease_send_msg()
4321 lease->action = action; in ceph_mdsc_lease_send_msg()
4322 lease->seq = cpu_to_le32(seq); in ceph_mdsc_lease_send_msg()
4324 spin_lock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4325 dir = d_inode(dentry->d_parent); in ceph_mdsc_lease_send_msg()
4326 lease->ino = cpu_to_le64(ceph_ino(dir)); in ceph_mdsc_lease_send_msg()
4327 lease->first = lease->last = cpu_to_le64(ceph_snap(dir)); in ceph_mdsc_lease_send_msg()
4329 put_unaligned_le32(dentry->d_name.len, lease + 1); in ceph_mdsc_lease_send_msg()
4331 dentry->d_name.name, dentry->d_name.len); in ceph_mdsc_lease_send_msg()
4332 spin_unlock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4338 msg->more_to_follow = (action == CEPH_MDS_LEASE_RELEASE); in ceph_mdsc_lease_send_msg()
4340 ceph_con_send(&session->s_con, msg); in ceph_mdsc_lease_send_msg()
4350 mutex_lock(&mdsc->mutex); in lock_unlock_sessions()
4351 for (i = 0; i < mdsc->max_sessions; i++) { in lock_unlock_sessions()
4355 mutex_unlock(&mdsc->mutex); in lock_unlock_sessions()
4356 mutex_lock(&s->s_mutex); in lock_unlock_sessions()
4357 mutex_unlock(&s->s_mutex); in lock_unlock_sessions()
4359 mutex_lock(&mdsc->mutex); in lock_unlock_sessions()
4361 mutex_unlock(&mdsc->mutex); in lock_unlock_sessions()
4366 struct ceph_fs_client *fsc = mdsc->fsc; in maybe_recover_session()
4371 if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED) in maybe_recover_session()
4374 if (!READ_ONCE(fsc->blocklisted)) in maybe_recover_session()
4377 if (fsc->last_auto_reconnect && in maybe_recover_session()
4378 time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30)) in maybe_recover_session()
4382 fsc->last_auto_reconnect = jiffies; in maybe_recover_session()
4383 ceph_force_reconnect(fsc->sb); in maybe_recover_session()
4388 switch (s->s_state) { in check_session_state()
4390 if (s->s_ttl && time_after(jiffies, s->s_ttl)) { in check_session_state()
4391 s->s_state = CEPH_MDS_SESSION_HUNG; in check_session_state()
4392 pr_info("mds%d hung\n", s->s_mds); in check_session_state()
4415 lockdep_assert_held(&s->s_mutex); in inc_session_sequence()
4417 s->s_seq++; in inc_session_sequence()
4419 if (s->s_state == CEPH_MDS_SESSION_CLOSING) { in inc_session_sequence()
4422 dout("resending session close request for mds%d\n", s->s_mds); in inc_session_sequence()
4426 s->s_mds, ret); in inc_session_sequence()
4431 * delayed work -- periodically trim expired leases, renew caps with mds
4437 schedule_delayed_work(&mdsc->delayed_work, hz); in schedule_delayed()
4450 if (mdsc->stopping) in delayed_work()
4453 mutex_lock(&mdsc->mutex); in delayed_work()
4454 renew_interval = mdsc->mdsmap->m_session_timeout >> 2; in delayed_work()
4456 mdsc->last_renew_caps); in delayed_work()
4458 mdsc->last_renew_caps = jiffies; in delayed_work()
4460 for (i = 0; i < mdsc->max_sessions; i++) { in delayed_work()
4469 mutex_unlock(&mdsc->mutex); in delayed_work()
4471 mutex_lock(&s->s_mutex); in delayed_work()
4475 ceph_con_keepalive(&s->s_con); in delayed_work()
4476 if (s->s_state == CEPH_MDS_SESSION_OPEN || in delayed_work()
4477 s->s_state == CEPH_MDS_SESSION_HUNG) in delayed_work()
4479 mutex_unlock(&s->s_mutex); in delayed_work()
4482 mutex_lock(&mdsc->mutex); in delayed_work()
4484 mutex_unlock(&mdsc->mutex); in delayed_work()
4505 return -ENOMEM; in ceph_mdsc_init()
4506 mdsc->fsc = fsc; in ceph_mdsc_init()
4507 mutex_init(&mdsc->mutex); in ceph_mdsc_init()
4508 mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); in ceph_mdsc_init()
4509 if (!mdsc->mdsmap) { in ceph_mdsc_init()
4510 err = -ENOMEM; in ceph_mdsc_init()
4514 init_completion(&mdsc->safe_umount_waiters); in ceph_mdsc_init()
4515 init_waitqueue_head(&mdsc->session_close_wq); in ceph_mdsc_init()
4516 INIT_LIST_HEAD(&mdsc->waiting_for_map); in ceph_mdsc_init()
4517 mdsc->sessions = NULL; in ceph_mdsc_init()
4518 atomic_set(&mdsc->num_sessions, 0); in ceph_mdsc_init()
4519 mdsc->max_sessions = 0; in ceph_mdsc_init()
4520 mdsc->stopping = 0; in ceph_mdsc_init()
4521 atomic64_set(&mdsc->quotarealms_count, 0); in ceph_mdsc_init()
4522 mdsc->quotarealms_inodes = RB_ROOT; in ceph_mdsc_init()
4523 mutex_init(&mdsc->quotarealms_inodes_mutex); in ceph_mdsc_init()
4524 mdsc->last_snap_seq = 0; in ceph_mdsc_init()
4525 init_rwsem(&mdsc->snap_rwsem); in ceph_mdsc_init()
4526 mdsc->snap_realms = RB_ROOT; in ceph_mdsc_init()
4527 INIT_LIST_HEAD(&mdsc->snap_empty); in ceph_mdsc_init()
4528 mdsc->num_snap_realms = 0; in ceph_mdsc_init()
4529 spin_lock_init(&mdsc->snap_empty_lock); in ceph_mdsc_init()
4530 mdsc->last_tid = 0; in ceph_mdsc_init()
4531 mdsc->oldest_tid = 0; in ceph_mdsc_init()
4532 mdsc->request_tree = RB_ROOT; in ceph_mdsc_init()
4533 INIT_DELAYED_WORK(&mdsc->delayed_work, delayed_work); in ceph_mdsc_init()
4534 mdsc->last_renew_caps = jiffies; in ceph_mdsc_init()
4535 INIT_LIST_HEAD(&mdsc->cap_delay_list); in ceph_mdsc_init()
4536 INIT_LIST_HEAD(&mdsc->cap_wait_list); in ceph_mdsc_init()
4537 spin_lock_init(&mdsc->cap_delay_lock); in ceph_mdsc_init()
4538 INIT_LIST_HEAD(&mdsc->snap_flush_list); in ceph_mdsc_init()
4539 spin_lock_init(&mdsc->snap_flush_lock); in ceph_mdsc_init()
4540 mdsc->last_cap_flush_tid = 1; in ceph_mdsc_init()
4541 INIT_LIST_HEAD(&mdsc->cap_flush_list); in ceph_mdsc_init()
4542 INIT_LIST_HEAD(&mdsc->cap_dirty_migrating); in ceph_mdsc_init()
4543 mdsc->num_cap_flushing = 0; in ceph_mdsc_init()
4544 spin_lock_init(&mdsc->cap_dirty_lock); in ceph_mdsc_init()
4545 init_waitqueue_head(&mdsc->cap_flushing_wq); in ceph_mdsc_init()
4546 INIT_WORK(&mdsc->cap_reclaim_work, ceph_cap_reclaim_work); in ceph_mdsc_init()
4547 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_mdsc_init()
4548 err = ceph_metric_init(&mdsc->metric); in ceph_mdsc_init()
4552 spin_lock_init(&mdsc->dentry_list_lock); in ceph_mdsc_init()
4553 INIT_LIST_HEAD(&mdsc->dentry_leases); in ceph_mdsc_init()
4554 INIT_LIST_HEAD(&mdsc->dentry_dir_leases); in ceph_mdsc_init()
4557 ceph_adjust_caps_max_min(mdsc, fsc->mount_options); in ceph_mdsc_init()
4559 spin_lock_init(&mdsc->snapid_map_lock); in ceph_mdsc_init()
4560 mdsc->snapid_map_tree = RB_ROOT; in ceph_mdsc_init()
4561 INIT_LIST_HEAD(&mdsc->snapid_map_lru); in ceph_mdsc_init()
4563 init_rwsem(&mdsc->pool_perm_rwsem); in ceph_mdsc_init()
4564 mdsc->pool_perm_tree = RB_ROOT; in ceph_mdsc_init()
4566 strscpy(mdsc->nodename, utsname()->nodename, in ceph_mdsc_init()
4567 sizeof(mdsc->nodename)); in ceph_mdsc_init()
4569 fsc->mdsc = mdsc; in ceph_mdsc_init()
4573 kfree(mdsc->mdsmap); in ceph_mdsc_init()
4585 struct ceph_options *opts = mdsc->fsc->client->options; in wait_requests()
4588 mutex_lock(&mdsc->mutex); in wait_requests()
4590 mutex_unlock(&mdsc->mutex); in wait_requests()
4593 wait_for_completion_timeout(&mdsc->safe_umount_waiters, in wait_requests()
4594 ceph_timeout_jiffies(opts->mount_timeout)); in wait_requests()
4597 mutex_lock(&mdsc->mutex); in wait_requests()
4600 req->r_tid); in wait_requests()
4601 list_del_init(&req->r_wait); in wait_requests()
4605 mutex_unlock(&mdsc->mutex); in wait_requests()
4616 mdsc->stopping = 1; in ceph_mdsc_pre_umount()
4639 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4643 while (req && req->r_tid <= want_tid) { in wait_unsafe_requests()
4645 n = rb_next(&req->r_node); in wait_unsafe_requests()
4650 if (req->r_op != CEPH_MDS_OP_SETFILELOCK && in wait_unsafe_requests()
4651 (req->r_op & CEPH_MDS_OP_WRITE)) { in wait_unsafe_requests()
4656 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4658 req->r_tid, want_tid); in wait_unsafe_requests()
4659 wait_for_completion(&req->r_safe_completion); in wait_unsafe_requests()
4660 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4664 if (RB_EMPTY_NODE(&nextreq->r_node)) { in wait_unsafe_requests()
4673 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4681 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in ceph_mdsc_sync()
4685 mutex_lock(&mdsc->mutex); in ceph_mdsc_sync()
4686 want_tid = mdsc->last_tid; in ceph_mdsc_sync()
4687 mutex_unlock(&mdsc->mutex); in ceph_mdsc_sync()
4690 spin_lock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4691 want_flush = mdsc->last_cap_flush_tid; in ceph_mdsc_sync()
4692 if (!list_empty(&mdsc->cap_flush_list)) { in ceph_mdsc_sync()
4694 list_last_entry(&mdsc->cap_flush_list, in ceph_mdsc_sync()
4696 cf->wake = true; in ceph_mdsc_sync()
4698 spin_unlock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4712 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in done_closing_sessions()
4714 return atomic_read(&mdsc->num_sessions) <= skipped; in done_closing_sessions()
4722 struct ceph_options *opts = mdsc->fsc->client->options; in ceph_mdsc_close_sessions()
4730 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4731 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4735 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4736 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4739 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4741 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4743 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4746 wait_event_timeout(mdsc->session_close_wq, in ceph_mdsc_close_sessions()
4748 ceph_timeout_jiffies(opts->mount_timeout)); in ceph_mdsc_close_sessions()
4751 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4752 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4753 if (mdsc->sessions[i]) { in ceph_mdsc_close_sessions()
4754 session = ceph_get_mds_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
4756 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4757 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4759 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4761 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4764 WARN_ON(!list_empty(&mdsc->cap_delay_list)); in ceph_mdsc_close_sessions()
4765 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4770 cancel_work_sync(&mdsc->cap_reclaim_work); in ceph_mdsc_close_sessions()
4771 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_close_sessions()
4783 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4784 for (mds = 0; mds < mdsc->max_sessions; mds++) { in ceph_mdsc_force_umount()
4789 if (session->s_state == CEPH_MDS_SESSION_REJECTED) in ceph_mdsc_force_umount()
4791 __wake_requests(mdsc, &session->s_waiting); in ceph_mdsc_force_umount()
4792 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4794 mutex_lock(&session->s_mutex); in ceph_mdsc_force_umount()
4796 if (session->s_state == CEPH_MDS_SESSION_CLOSING) { in ceph_mdsc_force_umount()
4800 mutex_unlock(&session->s_mutex); in ceph_mdsc_force_umount()
4803 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4806 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_force_umount()
4807 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4819 * delayed work will re-arm itself again after that. in ceph_mdsc_stop()
4821 flush_delayed_work(&mdsc->delayed_work); in ceph_mdsc_stop()
4823 if (mdsc->mdsmap) in ceph_mdsc_stop()
4824 ceph_mdsmap_destroy(mdsc->mdsmap); in ceph_mdsc_stop()
4825 kfree(mdsc->sessions); in ceph_mdsc_stop()
4832 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_mdsc_destroy()
4843 ceph_metric_destroy(&mdsc->metric); in ceph_mdsc_destroy()
4845 flush_delayed_work(&mdsc->metric.delayed_work); in ceph_mdsc_destroy()
4846 fsc->mdsc = NULL; in ceph_mdsc_destroy()
4853 struct ceph_fs_client *fsc = mdsc->fsc; in ceph_mdsc_handle_fsmap()
4854 const char *mds_namespace = fsc->mount_options->mds_namespace; in ceph_mdsc_handle_fsmap()
4855 void *p = msg->front.iov_base; in ceph_mdsc_handle_fsmap()
4856 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_fsmap() local
4860 u32 mount_fscid = (u32)-1; in ceph_mdsc_handle_fsmap()
4862 int err = -EINVAL; in ceph_mdsc_handle_fsmap()
4864 ceph_decode_need(&p, end, sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4869 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4874 ceph_decode_need(&p, end, sizeof(u32) * 3, bad); in ceph_mdsc_handle_fsmap()
4878 while (num_fs-- > 0) { in ceph_mdsc_handle_fsmap()
4884 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4888 ceph_decode_need(&p, end, info_len, bad); in ceph_mdsc_handle_fsmap()
4906 ceph_monc_got_map(&fsc->client->monc, CEPH_SUB_FSMAP, epoch); in ceph_mdsc_handle_fsmap()
4907 if (mount_fscid != (u32)-1) { in ceph_mdsc_handle_fsmap()
4908 fsc->client->monc.fs_cluster_id = mount_fscid; in ceph_mdsc_handle_fsmap()
4909 ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_fsmap()
4911 ceph_monc_renew_subs(&fsc->client->monc); in ceph_mdsc_handle_fsmap()
4913 err = -ENOENT; in ceph_mdsc_handle_fsmap()
4921 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
4922 mdsc->mdsmap_err = err; in ceph_mdsc_handle_fsmap()
4923 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_fsmap()
4924 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
4934 void *p = msg->front.iov_base; in ceph_mdsc_handle_mdsmap()
4935 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_mdsmap() local
4938 int err = -EINVAL; in ceph_mdsc_handle_mdsmap()
4940 ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad); in ceph_mdsc_handle_mdsmap()
4942 if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0) in ceph_mdsc_handle_mdsmap()
4949 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4950 if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) { in ceph_mdsc_handle_mdsmap()
4952 epoch, mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
4953 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4957 newmap = ceph_mdsmap_decode(&p, end); in ceph_mdsc_handle_mdsmap()
4964 if (mdsc->mdsmap) { in ceph_mdsc_handle_mdsmap()
4965 oldmap = mdsc->mdsmap; in ceph_mdsc_handle_mdsmap()
4966 mdsc->mdsmap = newmap; in ceph_mdsc_handle_mdsmap()
4970 mdsc->mdsmap = newmap; /* first mds map */ in ceph_mdsc_handle_mdsmap()
4972 mdsc->fsc->max_file_size = min((loff_t)mdsc->mdsmap->m_max_file_size, in ceph_mdsc_handle_mdsmap()
4975 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_mdsmap()
4976 ceph_monc_got_map(&mdsc->fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_mdsmap()
4977 mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
4979 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4984 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4992 struct ceph_mds_session *s = con->private; in con_get()
5001 struct ceph_mds_session *s = con->private; in con_put()
5012 struct ceph_mds_session *s = con->private; in peer_reset()
5013 struct ceph_mds_client *mdsc = s->s_mdsc; in peer_reset()
5015 pr_warn("mds%d closed our session\n", s->s_mds); in peer_reset()
5021 struct ceph_mds_session *s = con->private; in dispatch()
5022 struct ceph_mds_client *mdsc = s->s_mdsc; in dispatch()
5023 int type = le16_to_cpu(msg->hdr.type); in dispatch()
5025 mutex_lock(&mdsc->mutex); in dispatch()
5027 mutex_unlock(&mdsc->mutex); in dispatch()
5030 mutex_unlock(&mdsc->mutex); in dispatch()
5080 struct ceph_mds_session *s = con->private; in get_authorizer()
5081 struct ceph_mds_client *mdsc = s->s_mdsc; in get_authorizer()
5082 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in get_authorizer()
5083 struct ceph_auth_handshake *auth = &s->s_auth; in get_authorizer()
5085 if (force_new && auth->authorizer) { in get_authorizer()
5086 ceph_auth_destroy_authorizer(auth->authorizer); in get_authorizer()
5087 auth->authorizer = NULL; in get_authorizer()
5089 if (!auth->authorizer) { in get_authorizer()
5100 *proto = ac->protocol; in get_authorizer()
5108 struct ceph_mds_session *s = con->private; in add_authorizer_challenge()
5109 struct ceph_mds_client *mdsc = s->s_mdsc; in add_authorizer_challenge()
5110 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in add_authorizer_challenge()
5112 return ceph_auth_add_authorizer_challenge(ac, s->s_auth.authorizer, in add_authorizer_challenge()
5118 struct ceph_mds_session *s = con->private; in verify_authorizer_reply()
5119 struct ceph_mds_client *mdsc = s->s_mdsc; in verify_authorizer_reply()
5120 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in verify_authorizer_reply()
5122 return ceph_auth_verify_authorizer_reply(ac, s->s_auth.authorizer); in verify_authorizer_reply()
5127 struct ceph_mds_session *s = con->private; in invalidate_authorizer()
5128 struct ceph_mds_client *mdsc = s->s_mdsc; in invalidate_authorizer()
5129 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in invalidate_authorizer()
5133 return ceph_monc_validate_auth(&mdsc->fsc->client->monc); in invalidate_authorizer()
5140 int type = (int) le16_to_cpu(hdr->type); in mds_alloc_msg()
5141 int front_len = (int) le32_to_cpu(hdr->front_len); in mds_alloc_msg()
5143 if (con->in_msg) in mds_alloc_msg()
5144 return con->in_msg; in mds_alloc_msg()
5159 struct ceph_mds_session *s = msg->con->private; in mds_sign_message()
5160 struct ceph_auth_handshake *auth = &s->s_auth; in mds_sign_message()
5167 struct ceph_mds_session *s = msg->con->private; in mds_check_message_signature()
5168 struct ceph_auth_handshake *auth = &s->s_auth; in mds_check_message_signature()