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()
443 while (len--) { in ceph_parse_deleg_inos()
444 int err = xa_insert(&s->s_delegated_inos, ino = start++, in ceph_parse_deleg_inos()
449 start - 1); in ceph_parse_deleg_inos()
450 } else if (err == -EBUSY) { in ceph_parse_deleg_inos()
452 start - 1); in ceph_parse_deleg_inos()
460 return -EIO; in ceph_parse_deleg_inos()
468 xa_for_each(&s->s_delegated_inos, ino, val) { in ceph_get_deleg_ino()
469 val = xa_erase(&s->s_delegated_inos, ino); in ceph_get_deleg_ino()
478 return xa_insert(&s->s_delegated_inos, ino, DELEGATED_INO_AVAILABLE, in ceph_restore_deleg_ino()
483 * FIXME: xarrays can't handle 64-bit indexes on a 32-bit arch. For now, just
487 static int ceph_parse_deleg_inos(void **p, void *end, in ceph_parse_deleg_inos() argument
492 ceph_decode_32_safe(p, end, sets, bad); in ceph_parse_deleg_inos()
494 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad); in ceph_parse_deleg_inos()
497 return -EIO; in ceph_parse_deleg_inos()
514 static int parse_reply_info_create(void **p, void *end, in parse_reply_info_create() argument
520 if (features == (u64)-1 || in parse_reply_info_create()
522 if (*p == end) { in parse_reply_info_create()
524 info->has_create_ino = false; in parse_reply_info_create()
525 } else if (test_bit(CEPHFS_FEATURE_DELEG_INO, &s->s_features)) { in parse_reply_info_create()
529 info->has_create_ino = true; in parse_reply_info_create()
530 ceph_decode_8_safe(p, end, struct_v, bad); in parse_reply_info_create()
531 ceph_decode_8_safe(p, end, struct_compat, bad); in parse_reply_info_create()
532 ceph_decode_32_safe(p, end, len, bad); in parse_reply_info_create()
533 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
534 ret = ceph_parse_deleg_inos(p, end, s); in parse_reply_info_create()
539 ceph_decode_64_safe(p, end, info->ino, bad); in parse_reply_info_create()
540 info->has_create_ino = true; in parse_reply_info_create()
543 if (*p != end) in parse_reply_info_create()
548 *p = end; in parse_reply_info_create()
551 return -EIO; in parse_reply_info_create()
557 static int parse_reply_info_extra(void **p, void *end, in parse_reply_info_extra() argument
561 u32 op = le32_to_cpu(info->head->op); in parse_reply_info_extra()
564 return parse_reply_info_filelock(p, end, info, features); in parse_reply_info_extra()
566 return parse_reply_info_readdir(p, end, info, features); in parse_reply_info_extra()
568 return parse_reply_info_create(p, end, info, features, s); in parse_reply_info_extra()
570 return -EIO; in parse_reply_info_extra()
580 void *p, *end; in parse_reply_info() local
584 info->head = msg->front.iov_base; in parse_reply_info()
585 p = msg->front.iov_base + sizeof(struct ceph_mds_reply_head); in parse_reply_info()
586 end = p + msg->front.iov_len - sizeof(struct ceph_mds_reply_head); in parse_reply_info()
589 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
591 ceph_decode_need(&p, end, len, bad); in parse_reply_info()
598 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
600 ceph_decode_need(&p, end, len, bad); in parse_reply_info()
607 ceph_decode_32_safe(&p, end, len, bad); in parse_reply_info()
608 info->snapblob_len = len; in parse_reply_info()
609 info->snapblob = p; in parse_reply_info()
612 if (p != end) in parse_reply_info()
617 err = -EIO; in parse_reply_info()
625 if (!info->dir_entries) in destroy_reply_info()
627 free_pages((unsigned long)info->dir_entries, get_order(info->dir_buf_size)); in destroy_reply_info()
652 if (refcount_inc_not_zero(&s->s_ref)) { in ceph_get_mds_session()
653 dout("mdsc get_session %p %d -> %d\n", s, in ceph_get_mds_session()
654 refcount_read(&s->s_ref)-1, refcount_read(&s->s_ref)); in ceph_get_mds_session()
657 dout("mdsc get_session %p 0 -- FAIL\n", s); in ceph_get_mds_session()
667 dout("mdsc put_session %p %d -> %d\n", s, in ceph_put_mds_session()
668 refcount_read(&s->s_ref), refcount_read(&s->s_ref)-1); in ceph_put_mds_session()
669 if (refcount_dec_and_test(&s->s_ref)) { in ceph_put_mds_session()
670 if (s->s_auth.authorizer) in ceph_put_mds_session()
671 ceph_auth_destroy_authorizer(s->s_auth.authorizer); in ceph_put_mds_session()
672 WARN_ON(mutex_is_locked(&s->s_mutex)); in ceph_put_mds_session()
673 xa_destroy(&s->s_delegated_inos); in ceph_put_mds_session()
679 * called under mdsc->mutex
684 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __ceph_lookup_mds_session()
686 return ceph_get_mds_session(mdsc->sessions[mds]); in __ceph_lookup_mds_session()
691 if (mds >= mdsc->max_sessions || !mdsc->sessions[mds]) in __have_session()
700 if (s->s_mds >= mdsc->max_sessions || in __verify_registered_session()
701 mdsc->sessions[s->s_mds] != s) in __verify_registered_session()
702 return -ENOENT; in __verify_registered_session()
708 * called under mdsc->mutex.
715 if (mds >= mdsc->mdsmap->possible_max_rank) in register_session()
716 return ERR_PTR(-EINVAL); in register_session()
720 return ERR_PTR(-ENOMEM); in register_session()
722 if (mds >= mdsc->max_sessions) { in register_session()
730 if (mdsc->sessions) { in register_session()
731 memcpy(sa, mdsc->sessions, in register_session()
732 mdsc->max_sessions * sizeof(void *)); in register_session()
733 kfree(mdsc->sessions); in register_session()
735 mdsc->sessions = sa; in register_session()
736 mdsc->max_sessions = newmax; in register_session()
740 s->s_mdsc = mdsc; in register_session()
741 s->s_mds = mds; in register_session()
742 s->s_state = CEPH_MDS_SESSION_NEW; in register_session()
743 s->s_ttl = 0; in register_session()
744 s->s_seq = 0; in register_session()
745 mutex_init(&s->s_mutex); in register_session()
747 ceph_con_init(&s->s_con, s, &mds_con_ops, &mdsc->fsc->client->msgr); in register_session()
749 spin_lock_init(&s->s_gen_ttl_lock); in register_session()
750 s->s_cap_gen = 1; in register_session()
751 s->s_cap_ttl = jiffies - 1; in register_session()
753 spin_lock_init(&s->s_cap_lock); in register_session()
754 s->s_renew_requested = 0; in register_session()
755 s->s_renew_seq = 0; in register_session()
756 INIT_LIST_HEAD(&s->s_caps); in register_session()
757 s->s_nr_caps = 0; in register_session()
758 refcount_set(&s->s_ref, 1); in register_session()
759 INIT_LIST_HEAD(&s->s_waiting); in register_session()
760 INIT_LIST_HEAD(&s->s_unsafe); in register_session()
761 xa_init(&s->s_delegated_inos); in register_session()
762 s->s_num_cap_releases = 0; in register_session()
763 s->s_cap_reconnect = 0; in register_session()
764 s->s_cap_iterator = NULL; in register_session()
765 INIT_LIST_HEAD(&s->s_cap_releases); in register_session()
766 INIT_WORK(&s->s_cap_release_work, ceph_cap_release_work); in register_session()
768 INIT_LIST_HEAD(&s->s_cap_dirty); in register_session()
769 INIT_LIST_HEAD(&s->s_cap_flushing); in register_session()
771 mdsc->sessions[mds] = s; in register_session()
772 atomic_inc(&mdsc->num_sessions); in register_session()
773 refcount_inc(&s->s_ref); /* one ref to sessions[], one to caller */ in register_session()
775 ceph_con_open(&s->s_con, CEPH_ENTITY_TYPE_MDS, mds, in register_session()
776 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in register_session()
782 return ERR_PTR(-ENOMEM); in register_session()
786 * called under mdsc->mutex
791 dout("__unregister_session mds%d %p\n", s->s_mds, s); in __unregister_session()
792 BUG_ON(mdsc->sessions[s->s_mds] != s); in __unregister_session()
793 mdsc->sessions[s->s_mds] = NULL; in __unregister_session()
794 ceph_con_close(&s->s_con); in __unregister_session()
796 atomic_dec(&mdsc->num_sessions); in __unregister_session()
802 * should be last request ref, or hold mdsc->mutex
806 if (req->r_session) { in put_request_session()
807 ceph_put_mds_session(req->r_session); in put_request_session()
808 req->r_session = NULL; in put_request_session()
818 destroy_reply_info(&req->r_reply_info); in ceph_mdsc_release_request()
819 if (req->r_request) in ceph_mdsc_release_request()
820 ceph_msg_put(req->r_request); in ceph_mdsc_release_request()
821 if (req->r_reply) in ceph_mdsc_release_request()
822 ceph_msg_put(req->r_reply); in ceph_mdsc_release_request()
823 if (req->r_inode) { in ceph_mdsc_release_request()
824 ceph_put_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_release_request()
826 ceph_async_iput(req->r_inode); in ceph_mdsc_release_request()
828 if (req->r_parent) { in ceph_mdsc_release_request()
829 ceph_put_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); in ceph_mdsc_release_request()
830 ceph_async_iput(req->r_parent); in ceph_mdsc_release_request()
832 ceph_async_iput(req->r_target_inode); in ceph_mdsc_release_request()
833 if (req->r_dentry) in ceph_mdsc_release_request()
834 dput(req->r_dentry); in ceph_mdsc_release_request()
835 if (req->r_old_dentry) in ceph_mdsc_release_request()
836 dput(req->r_old_dentry); in ceph_mdsc_release_request()
837 if (req->r_old_dentry_dir) { in ceph_mdsc_release_request()
844 ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_release_request()
846 ceph_async_iput(req->r_old_dentry_dir); in ceph_mdsc_release_request()
848 kfree(req->r_path1); in ceph_mdsc_release_request()
849 kfree(req->r_path2); in ceph_mdsc_release_request()
850 if (req->r_pagelist) in ceph_mdsc_release_request()
851 ceph_pagelist_release(req->r_pagelist); in ceph_mdsc_release_request()
853 ceph_unreserve_caps(req->r_mdsc, &req->r_caps_reservation); in ceph_mdsc_release_request()
854 WARN_ON_ONCE(!list_empty(&req->r_wait)); in ceph_mdsc_release_request()
863 * called under mdsc->mutex. in DEFINE_RB_FUNCS()
870 req = lookup_request(&mdsc->request_tree, tid); in DEFINE_RB_FUNCS()
878 * Register an in-flight request, and assign a tid. Link to directory
881 * Called under mdsc->mutex.
889 req->r_tid = ++mdsc->last_tid; in __register_request()
890 if (req->r_num_caps) { in __register_request()
891 ret = ceph_reserve_caps(mdsc, &req->r_caps_reservation, in __register_request()
892 req->r_num_caps); in __register_request()
896 /* set req->r_err to fail early from __do_request */ in __register_request()
897 req->r_err = ret; in __register_request()
901 dout("__register_request %p tid %lld\n", req, req->r_tid); in __register_request()
903 insert_request(&mdsc->request_tree, req); in __register_request()
905 req->r_uid = current_fsuid(); in __register_request()
906 req->r_gid = current_fsgid(); in __register_request()
908 if (mdsc->oldest_tid == 0 && req->r_op != CEPH_MDS_OP_SETFILELOCK) in __register_request()
909 mdsc->oldest_tid = req->r_tid; in __register_request()
915 req->r_unsafe_dir = dir; in __register_request()
916 spin_lock(&ci->i_unsafe_lock); in __register_request()
917 list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); in __register_request()
918 spin_unlock(&ci->i_unsafe_lock); in __register_request()
925 dout("__unregister_request %p tid %lld\n", req, req->r_tid); in __unregister_request()
928 list_del_init(&req->r_unsafe_item); in __unregister_request()
930 if (req->r_tid == mdsc->oldest_tid) { in __unregister_request()
931 struct rb_node *p = rb_next(&req->r_node); in __unregister_request()
932 mdsc->oldest_tid = 0; in __unregister_request()
936 if (next_req->r_op != CEPH_MDS_OP_SETFILELOCK) { in __unregister_request()
937 mdsc->oldest_tid = next_req->r_tid; in __unregister_request()
944 erase_request(&mdsc->request_tree, req); in __unregister_request()
946 if (req->r_unsafe_dir) { in __unregister_request()
947 struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); in __unregister_request()
948 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
949 list_del_init(&req->r_unsafe_dir_item); in __unregister_request()
950 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
952 if (req->r_target_inode && in __unregister_request()
953 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __unregister_request()
954 struct ceph_inode_info *ci = ceph_inode(req->r_target_inode); in __unregister_request()
955 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
956 list_del_init(&req->r_unsafe_target_item); in __unregister_request()
957 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
960 if (req->r_unsafe_dir) { in __unregister_request()
962 ceph_async_iput(req->r_unsafe_dir); in __unregister_request()
963 req->r_unsafe_dir = NULL; in __unregister_request()
966 complete_all(&req->r_safe_completion); in __unregister_request()
973 * non-snapshot inode. We do this using the rcu_read_lock (which must be held
986 dentry = dentry->d_parent; in get_nonsnap_parent()
999 * Called under mdsc->mutex.
1008 int mode = req->r_direct_mode; in __choose_mds()
1009 int mds = -1; in __choose_mds()
1010 u32 hash = req->r_direct_hash; in __choose_mds()
1011 bool is_hash = test_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags); in __choose_mds()
1020 if (req->r_resend_mds >= 0 && in __choose_mds()
1021 (__have_session(mdsc, req->r_resend_mds) || in __choose_mds()
1022 ceph_mdsmap_get_state(mdsc->mdsmap, req->r_resend_mds) > 0)) { in __choose_mds()
1024 req->r_resend_mds); in __choose_mds()
1025 return req->r_resend_mds; in __choose_mds()
1032 if (req->r_inode) { in __choose_mds()
1033 if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) { in __choose_mds()
1034 inode = req->r_inode; in __choose_mds()
1037 /* req->r_dentry is non-null for LSSNAP request */ in __choose_mds()
1039 inode = get_nonsnap_parent(req->r_dentry); in __choose_mds()
1043 } else if (req->r_dentry) { in __choose_mds()
1049 parent = READ_ONCE(req->r_dentry->d_parent); in __choose_mds()
1050 dir = req->r_parent ? : d_inode_rcu(parent); in __choose_mds()
1052 if (!dir || dir->i_sb != mdsc->fsc->sb) { in __choose_mds()
1054 inode = d_inode(req->r_dentry); in __choose_mds()
1064 inode = d_inode(req->r_dentry); in __choose_mds()
1068 hash = ceph_dentry_hash(dir, req->r_dentry); in __choose_mds()
1083 if (is_hash && S_ISDIR(inode->i_mode)) { in __choose_mds()
1099 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1101 !ceph_mdsmap_is_laggy(mdsc->mdsmap, mds)) in __choose_mds()
1114 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1116 if (!ceph_mdsmap_is_laggy(mdsc->mdsmap, in __choose_mds()
1125 spin_lock(&ci->i_ceph_lock); in __choose_mds()
1128 cap = ci->i_auth_cap; in __choose_mds()
1129 if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) in __choose_mds()
1130 cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); in __choose_mds()
1132 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1136 mds = cap->session->s_mds; in __choose_mds()
1139 cap == ci->i_auth_cap ? "auth " : "", cap); in __choose_mds()
1140 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1142 /* avoid calling iput_final() while holding mdsc->mutex or in __choose_mds()
1151 mds = ceph_mdsmap_get_random_mds(mdsc->mdsmap); in __choose_mds()
1171 h = msg->front.iov_base; in create_session_msg()
1172 h->op = cpu_to_le32(op); in create_session_msg()
1173 h->seq = cpu_to_le64(seq); in create_session_msg()
1179 #define FEATURE_BYTES(c) (DIV_ROUND_UP((size_t)feature_bits[c - 1] + 1, 64) * 8)
1180 static int encode_supported_features(void **p, void *end) in encode_supported_features() argument
1188 if (WARN_ON_ONCE(*p + 4 + size > end)) in encode_supported_features()
1189 return -ERANGE; in encode_supported_features()
1197 if (WARN_ON_ONCE(*p + 4 > end)) in encode_supported_features()
1198 return -ERANGE; in encode_supported_features()
1207 #define METRIC_BYTES(cnt) (DIV_ROUND_UP((size_t)metric_bits[cnt - 1] + 1, 64) * 8)
1208 static int encode_metric_spec(void **p, void *end) in encode_metric_spec() argument
1213 if (WARN_ON_ONCE(*p + 2 > end)) in encode_metric_spec()
1214 return -ERANGE; in encode_metric_spec()
1223 if (WARN_ON_ONCE(*p + 4 + 4 + size > end)) in encode_metric_spec()
1224 return -ERANGE; in encode_metric_spec()
1236 if (WARN_ON_ONCE(*p + 4 + 4 > end)) in encode_metric_spec()
1237 return -ERANGE; in encode_metric_spec()
1256 int i = -1; in create_session_open_msg()
1259 struct ceph_options *opt = mdsc->fsc->client->options; in create_session_open_msg()
1260 struct ceph_mount_options *fsopt = mdsc->fsc->mount_options; in create_session_open_msg()
1262 void *p, *end; in create_session_open_msg() local
1266 {"hostname", mdsc->nodename}, in create_session_open_msg()
1267 {"kernel_version", init_utsname()->release}, in create_session_open_msg()
1268 {"entity_id", opt->name ? : ""}, in create_session_open_msg()
1269 {"root", fsopt->server_path ? : "/"}, in create_session_open_msg()
1300 return ERR_PTR(-ENOMEM); in create_session_open_msg()
1302 p = msg->front.iov_base; in create_session_open_msg()
1303 end = p + msg->front.iov_len; in create_session_open_msg()
1306 h->op = cpu_to_le32(CEPH_SESSION_REQUEST_OPEN); in create_session_open_msg()
1307 h->seq = cpu_to_le64(seq); in create_session_open_msg()
1315 msg->hdr.version = cpu_to_le16(4); in create_session_open_msg()
1316 msg->hdr.compat_version = cpu_to_le16(1); in create_session_open_msg()
1324 /* Two length-prefixed strings for each entry in the map */ in create_session_open_msg()
1337 ret = encode_supported_features(&p, end); in create_session_open_msg()
1344 ret = encode_metric_spec(&p, end); in create_session_open_msg()
1351 msg->front.iov_len = p - msg->front.iov_base; in create_session_open_msg()
1352 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_session_open_msg()
1360 * called under mdsc->mutex
1367 int mds = session->s_mds; in __open_session()
1370 mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds); in __open_session()
1373 session->s_state = CEPH_MDS_SESSION_OPENING; in __open_session()
1374 session->s_renew_requested = jiffies; in __open_session()
1377 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
1380 ceph_con_send(&session->s_con, msg); in __open_session()
1387 * called under mdsc->mutex
1401 if (session->s_state == CEPH_MDS_SESSION_NEW || in __open_export_target_session()
1402 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __open_export_target_session()
1418 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1420 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1430 int i, mds = session->s_mds; in __open_export_target_sessions()
1432 if (mds >= mdsc->mdsmap->possible_max_rank) in __open_export_target_sessions()
1435 mi = &mdsc->mdsmap->m_info[mds]; in __open_export_target_sessions()
1437 session->s_mds, mi->num_export_targets); in __open_export_target_sessions()
1439 for (i = 0; i < mi->num_export_targets; i++) { in __open_export_target_sessions()
1440 ts = __open_export_target_session(mdsc, mi->export_targets[i]); in __open_export_target_sessions()
1448 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1450 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1460 lockdep_assert_held(&session->s_cap_lock); in detach_cap_releases()
1462 list_splice_init(&session->s_cap_releases, target); in detach_cap_releases()
1463 session->s_num_cap_releases = 0; in detach_cap_releases()
1464 dout("dispose_cap_releases mds%d\n", session->s_mds); in detach_cap_releases()
1472 /* zero out the in-progress message */ in dispose_cap_releases()
1474 list_del(&cap->session_caps); in dispose_cap_releases()
1485 dout("cleanup_session_requests mds%d\n", session->s_mds); in cleanup_session_requests()
1486 mutex_lock(&mdsc->mutex); in cleanup_session_requests()
1487 while (!list_empty(&session->s_unsafe)) { in cleanup_session_requests()
1488 req = list_first_entry(&session->s_unsafe, in cleanup_session_requests()
1491 req->r_tid); in cleanup_session_requests()
1492 if (req->r_target_inode) in cleanup_session_requests()
1493 mapping_set_error(req->r_target_inode->i_mapping, -EIO); in cleanup_session_requests()
1494 if (req->r_unsafe_dir) in cleanup_session_requests()
1495 mapping_set_error(req->r_unsafe_dir->i_mapping, -EIO); in cleanup_session_requests()
1498 /* zero r_attempts, so kick_requests() will re-send requests */ in cleanup_session_requests()
1499 p = rb_first(&mdsc->request_tree); in cleanup_session_requests()
1503 if (req->r_session && in cleanup_session_requests()
1504 req->r_session->s_mds == session->s_mds) in cleanup_session_requests()
1505 req->r_attempts = 0; in cleanup_session_requests()
1507 mutex_unlock(&mdsc->mutex); in cleanup_session_requests()
1526 dout("iterate_session_caps %p mds%d\n", session, session->s_mds); in ceph_iterate_session_caps()
1527 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1528 p = session->s_caps.next; in ceph_iterate_session_caps()
1529 while (p != &session->s_caps) { in ceph_iterate_session_caps()
1531 inode = igrab(&cap->ci->vfs_inode); in ceph_iterate_session_caps()
1533 p = p->next; in ceph_iterate_session_caps()
1536 session->s_cap_iterator = cap; in ceph_iterate_session_caps()
1537 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1546 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1553 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1554 p = p->next; in ceph_iterate_session_caps()
1555 if (!cap->ci) { in ceph_iterate_session_caps()
1558 BUG_ON(cap->session != session); in ceph_iterate_session_caps()
1559 cap->session = NULL; in ceph_iterate_session_caps()
1560 list_del_init(&cap->session_caps); in ceph_iterate_session_caps()
1561 session->s_nr_caps--; in ceph_iterate_session_caps()
1562 atomic64_dec(&session->s_mdsc->metric.total_caps); in ceph_iterate_session_caps()
1563 if (cap->queue_release) in ceph_iterate_session_caps()
1573 session->s_cap_iterator = NULL; in ceph_iterate_session_caps()
1574 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1578 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1589 lockdep_assert_held(&ci->i_ceph_lock); in remove_capsnaps()
1593 while (!list_empty(&ci->i_cap_snaps)) { in remove_capsnaps()
1594 capsnap = list_first_entry(&ci->i_cap_snaps, in remove_capsnaps()
1597 ceph_put_snap_context(capsnap->context); in remove_capsnaps()
1601 wake_up_all(&ci->i_cap_wq); in remove_capsnaps()
1602 wake_up_all(&mdsc->cap_flushing_wq); in remove_capsnaps()
1610 struct ceph_mds_client *mdsc = fsc->mdsc; in remove_session_caps_cb()
1618 cap, ci, &ci->vfs_inode); in remove_session_caps_cb()
1619 spin_lock(&ci->i_ceph_lock); in remove_session_caps_cb()
1621 if (!ci->i_auth_cap) { in remove_session_caps_cb()
1624 if (READ_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in remove_session_caps_cb()
1625 if (inode->i_data.nrpages > 0) in remove_session_caps_cb()
1627 if (ci->i_wrbuffer_ref > 0) in remove_session_caps_cb()
1628 mapping_set_error(&inode->i_data, -EIO); in remove_session_caps_cb()
1631 while (!list_empty(&ci->i_cap_flush_list)) { in remove_session_caps_cb()
1632 cf = list_first_entry(&ci->i_cap_flush_list, in remove_session_caps_cb()
1634 list_move(&cf->i_list, &to_remove); in remove_session_caps_cb()
1637 spin_lock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1640 list_del_init(&cf->g_list); in remove_session_caps_cb()
1642 if (!list_empty(&ci->i_dirty_item)) { in remove_session_caps_cb()
1645 ceph_cap_string(ci->i_dirty_caps), in remove_session_caps_cb()
1647 ci->i_dirty_caps = 0; in remove_session_caps_cb()
1648 list_del_init(&ci->i_dirty_item); in remove_session_caps_cb()
1651 if (!list_empty(&ci->i_flushing_item)) { in remove_session_caps_cb()
1654 ceph_cap_string(ci->i_flushing_caps), in remove_session_caps_cb()
1656 ci->i_flushing_caps = 0; in remove_session_caps_cb()
1657 list_del_init(&ci->i_flushing_item); in remove_session_caps_cb()
1658 mdsc->num_cap_flushing--; in remove_session_caps_cb()
1661 spin_unlock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1664 mapping_set_error(inode->i_mapping, -EIO); in remove_session_caps_cb()
1666 if (ci->i_wrbuffer_ref_head == 0 && in remove_session_caps_cb()
1667 ci->i_wr_ref == 0 && in remove_session_caps_cb()
1668 ci->i_dirty_caps == 0 && in remove_session_caps_cb()
1669 ci->i_flushing_caps == 0) { in remove_session_caps_cb()
1670 ceph_put_snap_context(ci->i_head_snapc); in remove_session_caps_cb()
1671 ci->i_head_snapc = NULL; in remove_session_caps_cb()
1675 if (atomic_read(&ci->i_filelock_ref) > 0) { in remove_session_caps_cb()
1676 /* make further file lock syscall return -EIO */ in remove_session_caps_cb()
1677 ci->i_ceph_flags |= CEPH_I_ERROR_FILELOCK; in remove_session_caps_cb()
1682 if (!ci->i_dirty_caps && ci->i_prealloc_cap_flush) { in remove_session_caps_cb()
1683 list_add(&ci->i_prealloc_cap_flush->i_list, &to_remove); in remove_session_caps_cb()
1684 ci->i_prealloc_cap_flush = NULL; in remove_session_caps_cb()
1687 if (!list_empty(&ci->i_cap_snaps)) in remove_session_caps_cb()
1690 spin_unlock(&ci->i_ceph_lock); in remove_session_caps_cb()
1695 list_del_init(&cf->i_list); in remove_session_caps_cb()
1696 if (!cf->is_capsnap) in remove_session_caps_cb()
1700 wake_up_all(&ci->i_cap_wq); in remove_session_caps_cb()
1705 while (capsnap_release--) in remove_session_caps_cb()
1715 struct ceph_fs_client *fsc = session->s_mdsc->fsc; in remove_session_caps()
1716 struct super_block *sb = fsc->sb; in remove_session_caps()
1722 wake_up_all(&fsc->mdsc->cap_flushing_wq); in remove_session_caps()
1724 spin_lock(&session->s_cap_lock); in remove_session_caps()
1725 if (session->s_nr_caps > 0) { in remove_session_caps()
1736 while (!list_empty(&session->s_caps)) { in remove_session_caps()
1737 cap = list_entry(session->s_caps.next, in remove_session_caps()
1742 vino = cap->ci->i_vino; in remove_session_caps()
1743 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1749 spin_lock(&session->s_cap_lock); in remove_session_caps()
1756 BUG_ON(session->s_nr_caps > 0); in remove_session_caps()
1757 BUG_ON(!list_empty(&session->s_cap_flushing)); in remove_session_caps()
1758 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1759 dispose_cap_releases(session->s_mdsc, &dispose); in remove_session_caps()
1781 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1782 ci->i_wanted_max_size = 0; in wake_up_session_cb()
1783 ci->i_requested_max_size = 0; in wake_up_session_cb()
1784 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1786 if (cap->cap_gen < cap->session->s_cap_gen) { in wake_up_session_cb()
1787 /* mds did not re-issue stale cap */ in wake_up_session_cb()
1788 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1789 cap->issued = cap->implemented = CEPH_CAP_PIN; in wake_up_session_cb()
1790 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1794 wake_up_all(&ci->i_cap_wq); in wake_up_session_cb()
1800 dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); in wake_up_session_caps()
1817 if (time_after_eq(jiffies, session->s_cap_ttl) && in send_renew_caps()
1818 time_after_eq(session->s_cap_ttl, session->s_renew_requested)) in send_renew_caps()
1819 pr_info("mds%d caps stale\n", session->s_mds); in send_renew_caps()
1820 session->s_renew_requested = jiffies; in send_renew_caps()
1824 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1827 session->s_mds, ceph_mds_state_name(state)); in send_renew_caps()
1831 dout("send_renew_caps to mds%d (%s)\n", session->s_mds, in send_renew_caps()
1834 ++session->s_renew_seq); in send_renew_caps()
1836 return -ENOMEM; in send_renew_caps()
1837 ceph_con_send(&session->s_con, msg); in send_renew_caps()
1847 session->s_mds, ceph_session_state_name(session->s_state), seq); in send_flushmsg_ack()
1850 return -ENOMEM; in send_flushmsg_ack()
1851 ceph_con_send(&session->s_con, msg); in send_flushmsg_ack()
1857 * Note new cap ttl, and any transition from stale -> not stale (fresh?).
1859 * Called under session->s_mutex
1867 spin_lock(&session->s_cap_lock); in renewed_caps()
1868 was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl); in renewed_caps()
1870 session->s_cap_ttl = session->s_renew_requested + in renewed_caps()
1871 mdsc->mdsmap->m_session_timeout*HZ; in renewed_caps()
1874 if (time_before(jiffies, session->s_cap_ttl)) { in renewed_caps()
1875 pr_info("mds%d caps renewed\n", session->s_mds); in renewed_caps()
1878 pr_info("mds%d caps still stale\n", session->s_mds); in renewed_caps()
1882 session->s_mds, session->s_cap_ttl, was_stale ? "stale" : "fresh", in renewed_caps()
1883 time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh"); in renewed_caps()
1884 spin_unlock(&session->s_cap_lock); in renewed_caps()
1898 session->s_mds, ceph_session_state_name(session->s_state), in request_close_session()
1899 session->s_seq); in request_close_session()
1900 msg = create_session_msg(CEPH_SESSION_REQUEST_CLOSE, session->s_seq); in request_close_session()
1902 return -ENOMEM; in request_close_session()
1903 ceph_con_send(&session->s_con, msg); in request_close_session()
1913 if (session->s_state >= CEPH_MDS_SESSION_CLOSING) in __close_session()
1915 session->s_state = CEPH_MDS_SESSION_CLOSING; in __close_session()
1927 spin_lock(&dentry->d_lock); in drop_negative_children()
1928 list_for_each_entry(child, &dentry->d_subdirs, d_child) { in drop_negative_children()
1934 spin_unlock(&dentry->d_lock); in drop_negative_children()
1959 return -1; in trim_caps_cb()
1961 spin_lock(&ci->i_ceph_lock); in trim_caps_cb()
1962 mine = cap->issued | cap->implemented; in trim_caps_cb()
1970 if (cap == ci->i_auth_cap) { in trim_caps_cb()
1971 if (ci->i_dirty_caps || ci->i_flushing_caps || in trim_caps_cb()
1972 !list_empty(&ci->i_cap_snaps)) in trim_caps_cb()
1976 /* Note: it's possible that i_filelock_ref becomes non-zero in trim_caps_cb()
1978 * of lock mds request will re-add auth caps. */ in trim_caps_cb()
1979 if (atomic_read(&ci->i_filelock_ref) > 0) in trim_caps_cb()
1984 if (S_ISREG(inode->i_mode) && in trim_caps_cb()
1996 (*remaining)--; in trim_caps_cb()
2000 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2006 count = atomic_read(&inode->i_count); in trim_caps_cb()
2008 (*remaining)--; in trim_caps_cb()
2018 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2029 int trim_caps = session->s_nr_caps - max_caps; in ceph_trim_caps()
2032 session->s_mds, session->s_nr_caps, max_caps, trim_caps); in ceph_trim_caps()
2038 session->s_mds, session->s_nr_caps, max_caps, in ceph_trim_caps()
2039 trim_caps - remaining); in ceph_trim_caps()
2051 spin_lock(&mdsc->cap_dirty_lock); in check_caps_flush()
2052 if (!list_empty(&mdsc->cap_flush_list)) { in check_caps_flush()
2054 list_first_entry(&mdsc->cap_flush_list, in check_caps_flush()
2056 if (cf->tid <= want_flush_tid) { in check_caps_flush()
2058 "%llu <= %llu\n", cf->tid, want_flush_tid); in check_caps_flush()
2062 spin_unlock(&mdsc->cap_dirty_lock); in check_caps_flush()
2076 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
2091 struct ceph_osd_client *osdc = &mdsc->fsc->client->osdc; in ceph_send_cap_releases()
2097 down_read(&osdc->lock); in ceph_send_cap_releases()
2098 barrier = cpu_to_le32(osdc->epoch_barrier); in ceph_send_cap_releases()
2099 up_read(&osdc->lock); in ceph_send_cap_releases()
2101 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2103 list_splice_init(&session->s_cap_releases, &tmp_list); in ceph_send_cap_releases()
2104 num_cap_releases = session->s_num_cap_releases; in ceph_send_cap_releases()
2105 session->s_num_cap_releases = 0; in ceph_send_cap_releases()
2106 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2114 head = msg->front.iov_base; in ceph_send_cap_releases()
2115 head->num = cpu_to_le32(0); in ceph_send_cap_releases()
2116 msg->front.iov_len = sizeof(*head); in ceph_send_cap_releases()
2118 msg->hdr.version = cpu_to_le16(2); in ceph_send_cap_releases()
2119 msg->hdr.compat_version = cpu_to_le16(1); in ceph_send_cap_releases()
2124 list_del(&cap->session_caps); in ceph_send_cap_releases()
2125 num_cap_releases--; in ceph_send_cap_releases()
2127 head = msg->front.iov_base; in ceph_send_cap_releases()
2128 put_unaligned_le32(get_unaligned_le32(&head->num) + 1, in ceph_send_cap_releases()
2129 &head->num); in ceph_send_cap_releases()
2130 item = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2131 item->ino = cpu_to_le64(cap->cap_ino); in ceph_send_cap_releases()
2132 item->cap_id = cpu_to_le64(cap->cap_id); in ceph_send_cap_releases()
2133 item->migrate_seq = cpu_to_le32(cap->mseq); in ceph_send_cap_releases()
2134 item->seq = cpu_to_le32(cap->issue_seq); in ceph_send_cap_releases()
2135 msg->front.iov_len += sizeof(*item); in ceph_send_cap_releases()
2139 if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { in ceph_send_cap_releases()
2141 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2143 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2145 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2146 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2147 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2154 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2155 if (!list_empty(&session->s_cap_releases)) in ceph_send_cap_releases()
2157 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2161 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2163 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2165 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2166 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2167 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2172 session->s_mds); in ceph_send_cap_releases()
2173 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2174 list_splice(&tmp_list, &session->s_cap_releases); in ceph_send_cap_releases()
2175 session->s_num_cap_releases += num_cap_releases; in ceph_send_cap_releases()
2176 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2184 mutex_lock(&session->s_mutex); in ceph_cap_release_work()
2185 if (session->s_state == CEPH_MDS_SESSION_OPEN || in ceph_cap_release_work()
2186 session->s_state == CEPH_MDS_SESSION_HUNG) in ceph_cap_release_work()
2187 ceph_send_cap_releases(session->s_mdsc, session); in ceph_cap_release_work()
2188 mutex_unlock(&session->s_mutex); in ceph_cap_release_work()
2195 if (mdsc->stopping) in ceph_flush_cap_releases()
2199 if (queue_work(mdsc->fsc->cap_wq, in ceph_flush_cap_releases()
2200 &session->s_cap_release_work)) { in ceph_flush_cap_releases()
2209 * caller holds session->s_cap_lock
2214 list_add_tail(&cap->session_caps, &session->s_cap_releases); in __ceph_queue_cap_release()
2215 session->s_num_cap_releases++; in __ceph_queue_cap_release()
2217 if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE)) in __ceph_queue_cap_release()
2218 ceph_flush_cap_releases(session->s_mdsc, session); in __ceph_queue_cap_release()
2226 if (ret == -EAGAIN) in ceph_cap_reclaim_work()
2232 if (mdsc->stopping) in ceph_queue_cap_reclaim_work()
2235 if (queue_work(mdsc->fsc->cap_wq, &mdsc->cap_reclaim_work)) { in ceph_queue_cap_reclaim_work()
2247 val = atomic_add_return(nr, &mdsc->cap_reclaim_pending); in ceph_reclaim_caps_nr()
2249 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_reclaim_caps_nr()
2262 struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; in ceph_alloc_readdir_reply_buffer()
2263 struct ceph_mount_options *opt = req->r_mdsc->fsc->mount_options; in ceph_alloc_readdir_reply_buffer()
2268 spin_lock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2269 num_entries = ci->i_files + ci->i_subdirs; in ceph_alloc_readdir_reply_buffer()
2270 spin_unlock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2272 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2276 rinfo->dir_entries = (void*)__get_free_pages(GFP_KERNEL | in ceph_alloc_readdir_reply_buffer()
2279 if (rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2281 order--; in ceph_alloc_readdir_reply_buffer()
2283 if (!rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2284 return -ENOMEM; in ceph_alloc_readdir_reply_buffer()
2287 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2289 rinfo->dir_buf_size = PAGE_SIZE << order; in ceph_alloc_readdir_reply_buffer()
2290 req->r_num_caps = num_entries + 1; in ceph_alloc_readdir_reply_buffer()
2291 req->r_args.readdir.max_entries = cpu_to_le32(num_entries); in ceph_alloc_readdir_reply_buffer()
2292 req->r_args.readdir.max_bytes = cpu_to_le32(opt->max_readdir_bytes); in ceph_alloc_readdir_reply_buffer()
2306 return ERR_PTR(-ENOMEM); in ceph_mdsc_create_request()
2308 mutex_init(&req->r_fill_mutex); in ceph_mdsc_create_request()
2309 req->r_mdsc = mdsc; in ceph_mdsc_create_request()
2310 req->r_started = jiffies; in ceph_mdsc_create_request()
2311 req->r_start_latency = ktime_get(); in ceph_mdsc_create_request()
2312 req->r_resend_mds = -1; in ceph_mdsc_create_request()
2313 INIT_LIST_HEAD(&req->r_unsafe_dir_item); in ceph_mdsc_create_request()
2314 INIT_LIST_HEAD(&req->r_unsafe_target_item); in ceph_mdsc_create_request()
2315 req->r_fmode = -1; in ceph_mdsc_create_request()
2316 kref_init(&req->r_kref); in ceph_mdsc_create_request()
2317 RB_CLEAR_NODE(&req->r_node); in ceph_mdsc_create_request()
2318 INIT_LIST_HEAD(&req->r_wait); in ceph_mdsc_create_request()
2319 init_completion(&req->r_completion); in ceph_mdsc_create_request()
2320 init_completion(&req->r_safe_completion); in ceph_mdsc_create_request()
2321 INIT_LIST_HEAD(&req->r_unsafe_item); in ceph_mdsc_create_request()
2323 ktime_get_coarse_real_ts64(&req->r_stamp); in ceph_mdsc_create_request()
2325 req->r_op = op; in ceph_mdsc_create_request()
2326 req->r_direct_mode = mode; in ceph_mdsc_create_request()
2333 * called under mdsc->mutex.
2337 if (RB_EMPTY_ROOT(&mdsc->request_tree)) in __get_oldest_req()
2339 return rb_entry(rb_first(&mdsc->request_tree), in __get_oldest_req()
2345 return mdsc->oldest_tid; in __get_oldest_tid()
2352 * If @stop_on_nosnap, generate path relative to the first non-snapped
2356 * foo/.snap/bar -> foo//bar
2368 return ERR_PTR(-EINVAL); in ceph_mdsc_build_path()
2372 return ERR_PTR(-ENOMEM); in ceph_mdsc_build_path()
2374 pos = PATH_MAX - 1; in ceph_mdsc_build_path()
2383 spin_lock(&temp->d_lock); in ceph_mdsc_build_path()
2390 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2394 pos -= temp->d_name.len; in ceph_mdsc_build_path()
2396 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2399 memcpy(path + pos, temp->d_name.name, temp->d_name.len); in ceph_mdsc_build_path()
2401 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2402 temp = READ_ONCE(temp->d_parent); in ceph_mdsc_build_path()
2409 if (--pos < 0) in ceph_mdsc_build_path()
2422 * A rename didn't occur, but somehow we didn't end up where in ceph_mdsc_build_path()
2425 pr_warn("build_path did not end path lookup where " in ceph_mdsc_build_path()
2431 *plen = PATH_MAX - 1 - pos; in ceph_mdsc_build_path()
2445 dir = d_inode_rcu(dentry->d_parent); in build_dentry_path()
2449 *ppath = dentry->d_name.name; in build_dentry_path()
2450 *ppathlen = dentry->d_name.len; in build_dentry_path()
2515 * called under mdsc->mutex
2530 void *p, *end; in create_request_message() local
2533 ret = set_request_path_attr(req->r_inode, req->r_dentry, in create_request_message()
2534 req->r_parent, req->r_path1, req->r_ino1.ino, in create_request_message()
2537 &req->r_req_flags)); in create_request_message()
2544 ret = set_request_path_attr(NULL, req->r_old_dentry, in create_request_message()
2545 req->r_old_dentry_dir, in create_request_message()
2546 req->r_path2, req->r_ino2.ino, in create_request_message()
2559 (!!req->r_inode_drop + !!req->r_dentry_drop + in create_request_message()
2560 !!req->r_old_inode_drop + !!req->r_old_dentry_drop); in create_request_message()
2561 if (req->r_dentry_drop) in create_request_message()
2563 if (req->r_old_dentry_drop) in create_request_message()
2568 msg = ERR_PTR(-ENOMEM); in create_request_message()
2572 msg->hdr.version = cpu_to_le16(2); in create_request_message()
2573 msg->hdr.tid = cpu_to_le64(req->r_tid); in create_request_message()
2575 head = msg->front.iov_base; in create_request_message()
2576 p = msg->front.iov_base + sizeof(*head); in create_request_message()
2577 end = msg->front.iov_base + msg->front.iov_len; in create_request_message()
2579 head->mdsmap_epoch = cpu_to_le32(mdsc->mdsmap->m_epoch); in create_request_message()
2580 head->op = cpu_to_le32(req->r_op); in create_request_message()
2581 head->caller_uid = cpu_to_le32(from_kuid(&init_user_ns, req->r_uid)); in create_request_message()
2582 head->caller_gid = cpu_to_le32(from_kgid(&init_user_ns, req->r_gid)); in create_request_message()
2583 head->ino = cpu_to_le64(req->r_deleg_ino); in create_request_message()
2584 head->args = req->r_args; in create_request_message()
2586 ceph_encode_filepath(&p, end, ino1, path1); in create_request_message()
2587 ceph_encode_filepath(&p, end, ino2, path2); in create_request_message()
2590 req->r_request_release_offset = p - msg->front.iov_base; in create_request_message()
2594 if (req->r_inode_drop) in create_request_message()
2596 req->r_inode ? req->r_inode : d_inode(req->r_dentry), in create_request_message()
2597 mds, req->r_inode_drop, req->r_inode_unless, in create_request_message()
2598 req->r_op == CEPH_MDS_OP_READDIR); in create_request_message()
2599 if (req->r_dentry_drop) in create_request_message()
2600 releases += ceph_encode_dentry_release(&p, req->r_dentry, in create_request_message()
2601 req->r_parent, mds, req->r_dentry_drop, in create_request_message()
2602 req->r_dentry_unless); in create_request_message()
2603 if (req->r_old_dentry_drop) in create_request_message()
2604 releases += ceph_encode_dentry_release(&p, req->r_old_dentry, in create_request_message()
2605 req->r_old_dentry_dir, mds, in create_request_message()
2606 req->r_old_dentry_drop, in create_request_message()
2607 req->r_old_dentry_unless); in create_request_message()
2608 if (req->r_old_inode_drop) in create_request_message()
2610 d_inode(req->r_old_dentry), in create_request_message()
2611 mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); in create_request_message()
2615 p = msg->front.iov_base + req->r_request_release_offset; in create_request_message()
2618 head->num_releases = cpu_to_le16(releases); in create_request_message()
2623 ceph_encode_timespec64(&ts, &req->r_stamp); in create_request_message()
2627 if (WARN_ON_ONCE(p > end)) { in create_request_message()
2629 msg = ERR_PTR(-ERANGE); in create_request_message()
2633 msg->front.iov_len = p - msg->front.iov_base; in create_request_message()
2634 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_request_message()
2636 if (req->r_pagelist) { in create_request_message()
2637 struct ceph_pagelist *pagelist = req->r_pagelist; in create_request_message()
2639 msg->hdr.data_len = cpu_to_le32(pagelist->length); in create_request_message()
2641 msg->hdr.data_len = 0; in create_request_message()
2644 msg->hdr.data_off = cpu_to_le16(0); in create_request_message()
2657 * called under mdsc->mutex if error, under no mutex if
2663 req->r_end_latency = ktime_get(); in complete_request()
2665 if (req->r_callback) in complete_request()
2666 req->r_callback(mdsc, req); in complete_request()
2667 complete_all(&req->r_completion); in complete_request()
2671 * called under mdsc->mutex
2681 req->r_attempts++; in __prepare_send_request()
2682 if (req->r_inode) { in __prepare_send_request()
2684 ceph_get_cap_for_mds(ceph_inode(req->r_inode), mds); in __prepare_send_request()
2687 req->r_sent_on_mseq = cap->mseq; in __prepare_send_request()
2689 req->r_sent_on_mseq = -1; in __prepare_send_request()
2692 req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); in __prepare_send_request()
2694 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __prepare_send_request()
2702 msg = req->r_request; in __prepare_send_request()
2703 rhead = msg->front.iov_base; in __prepare_send_request()
2705 flags = le32_to_cpu(rhead->flags); in __prepare_send_request()
2707 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2709 if (req->r_target_inode) in __prepare_send_request()
2710 rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); in __prepare_send_request()
2712 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2715 rhead->num_releases = 0; in __prepare_send_request()
2718 p = msg->front.iov_base + req->r_request_release_offset; in __prepare_send_request()
2721 ceph_encode_timespec64(&ts, &req->r_stamp); in __prepare_send_request()
2725 msg->front.iov_len = p - msg->front.iov_base; in __prepare_send_request()
2726 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in __prepare_send_request()
2730 if (req->r_request) { in __prepare_send_request()
2731 ceph_msg_put(req->r_request); in __prepare_send_request()
2732 req->r_request = NULL; in __prepare_send_request()
2736 req->r_err = PTR_ERR(msg); in __prepare_send_request()
2739 req->r_request = msg; in __prepare_send_request()
2741 rhead = msg->front.iov_base; in __prepare_send_request()
2742 rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc)); in __prepare_send_request()
2743 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in __prepare_send_request()
2745 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) in __prepare_send_request()
2747 if (req->r_parent) in __prepare_send_request()
2749 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2750 rhead->num_fwd = req->r_num_fwd; in __prepare_send_request()
2751 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2753 dout(" r_parent = %p\n", req->r_parent); in __prepare_send_request()
2758 * called under mdsc->mutex
2767 err = __prepare_send_request(mdsc, req, session->s_mds, in __send_request()
2770 ceph_msg_get(req->r_request); in __send_request()
2771 ceph_con_send(&session->s_con, req->r_request); in __send_request()
2784 int mds = -1; in __do_request()
2788 if (req->r_err || test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in __do_request()
2789 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) in __do_request()
2794 if (req->r_timeout && in __do_request()
2795 time_after_eq(jiffies, req->r_started + req->r_timeout)) { in __do_request()
2797 err = -ETIMEDOUT; in __do_request()
2800 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in __do_request()
2802 err = -EIO; in __do_request()
2805 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_MOUNTING) { in __do_request()
2806 if (mdsc->mdsmap_err) { in __do_request()
2807 err = mdsc->mdsmap_err; in __do_request()
2811 if (mdsc->mdsmap->m_epoch == 0) { in __do_request()
2813 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2816 if (!(mdsc->fsc->mount_options->flags & in __do_request()
2818 !ceph_mdsmap_is_cluster_available(mdsc->mdsmap)) { in __do_request()
2819 err = -EHOSTUNREACH; in __do_request()
2828 ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { in __do_request()
2829 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2830 err = -EJUKEBOX; in __do_request()
2834 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2847 req->r_session = ceph_get_mds_session(session); in __do_request()
2850 ceph_session_state_name(session->s_state)); in __do_request()
2851 if (session->s_state != CEPH_MDS_SESSION_OPEN && in __do_request()
2852 session->s_state != CEPH_MDS_SESSION_HUNG) { in __do_request()
2853 if (session->s_state == CEPH_MDS_SESSION_REJECTED) { in __do_request()
2854 err = -EACCES; in __do_request()
2859 * inodes are bound to the session. Just return -EJUKEBOX and in __do_request()
2862 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2863 err = -EJUKEBOX; in __do_request()
2866 if (session->s_state == CEPH_MDS_SESSION_NEW || in __do_request()
2867 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __do_request()
2873 req->r_resend_mds = mds; in __do_request()
2875 list_add(&req->r_wait, &session->s_waiting); in __do_request()
2880 req->r_resend_mds = -1; /* forget any previous mds hint */ in __do_request()
2882 if (req->r_request_started == 0) /* note request start time */ in __do_request()
2883 req->r_request_started = jiffies; in __do_request()
2892 req->r_err = err; in __do_request()
2900 * called under mdsc->mutex
2913 list_del_init(&req->r_wait); in __wake_requests()
2914 dout(" wake request %p tid %llu\n", req, req->r_tid); in __wake_requests()
2926 struct rb_node *p = rb_first(&mdsc->request_tree); in kick_requests()
2932 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in kick_requests()
2934 if (req->r_attempts > 0) in kick_requests()
2936 if (req->r_session && in kick_requests()
2937 req->r_session->s_mds == mds) { in kick_requests()
2938 dout(" kicking tid %llu\n", req->r_tid); in kick_requests()
2939 list_del_init(&req->r_wait); in kick_requests()
2951 if (req->r_inode) in ceph_mdsc_submit_request()
2952 ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_submit_request()
2953 if (req->r_parent) { in ceph_mdsc_submit_request()
2954 struct ceph_inode_info *ci = ceph_inode(req->r_parent); in ceph_mdsc_submit_request()
2955 int fmode = (req->r_op & CEPH_MDS_OP_WRITE) ? in ceph_mdsc_submit_request()
2957 spin_lock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2960 spin_unlock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2961 ihold(req->r_parent); in ceph_mdsc_submit_request()
2963 if (req->r_old_dentry_dir) in ceph_mdsc_submit_request()
2964 ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_submit_request()
2967 if (req->r_inode) { in ceph_mdsc_submit_request()
2968 err = ceph_wait_on_async_create(req->r_inode); in ceph_mdsc_submit_request()
2976 if (!err && req->r_old_inode) { in ceph_mdsc_submit_request()
2977 err = ceph_wait_on_async_create(req->r_old_inode); in ceph_mdsc_submit_request()
2986 mutex_lock(&mdsc->mutex); in ceph_mdsc_submit_request()
2989 err = req->r_err; in ceph_mdsc_submit_request()
2990 mutex_unlock(&mdsc->mutex); in ceph_mdsc_submit_request()
3001 if (!req->r_timeout && req->r_wait_for_completion) { in ceph_mdsc_wait_request()
3002 err = req->r_wait_for_completion(mdsc, req); in ceph_mdsc_wait_request()
3005 &req->r_completion, in ceph_mdsc_wait_request()
3006 ceph_timeout_jiffies(req->r_timeout)); in ceph_mdsc_wait_request()
3010 err = -ETIMEDOUT; /* timed out */ in ceph_mdsc_wait_request()
3015 mutex_lock(&mdsc->mutex); in ceph_mdsc_wait_request()
3018 if (test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in ceph_mdsc_wait_request()
3019 err = le32_to_cpu(req->r_reply_info.head->result); in ceph_mdsc_wait_request()
3021 dout("aborted request %lld with %d\n", req->r_tid, err); in ceph_mdsc_wait_request()
3028 mutex_lock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3029 req->r_err = err; in ceph_mdsc_wait_request()
3030 set_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags); in ceph_mdsc_wait_request()
3031 mutex_unlock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3033 if (req->r_parent && in ceph_mdsc_wait_request()
3034 (req->r_op & CEPH_MDS_OP_WRITE)) in ceph_mdsc_wait_request()
3037 err = req->r_err; in ceph_mdsc_wait_request()
3040 mutex_unlock(&mdsc->mutex); in ceph_mdsc_wait_request()
3070 struct inode *dir = req->r_parent; in ceph_invalidate_dir_request()
3071 struct inode *old_dir = req->r_old_dentry_dir; in ceph_invalidate_dir_request()
3078 if (req->r_dentry) in ceph_invalidate_dir_request()
3079 ceph_invalidate_dentry_lease(req->r_dentry); in ceph_invalidate_dir_request()
3080 if (req->r_old_dentry) in ceph_invalidate_dir_request()
3081 ceph_invalidate_dentry_lease(req->r_old_dentry); in ceph_invalidate_dir_request()
3093 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply()
3095 struct ceph_mds_reply_head *head = msg->front.iov_base; in handle_reply()
3100 int mds = session->s_mds; in handle_reply()
3102 if (msg->front.iov_len < sizeof(*head)) { in handle_reply()
3109 tid = le64_to_cpu(msg->hdr.tid); in handle_reply()
3110 mutex_lock(&mdsc->mutex); in handle_reply()
3114 mutex_unlock(&mdsc->mutex); in handle_reply()
3120 if (req->r_session != session) { in handle_reply()
3122 " not mds%d\n", tid, session->s_mds, in handle_reply()
3123 req->r_session ? req->r_session->s_mds : -1); in handle_reply()
3124 mutex_unlock(&mdsc->mutex); in handle_reply()
3129 if ((test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags) && !head->safe) || in handle_reply()
3130 (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags) && head->safe)) { in handle_reply()
3132 head->safe ? "safe" : "unsafe", tid, mds); in handle_reply()
3133 mutex_unlock(&mdsc->mutex); in handle_reply()
3136 if (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags)) { in handle_reply()
3139 mutex_unlock(&mdsc->mutex); in handle_reply()
3143 result = le32_to_cpu(head->result); in handle_reply()
3152 if (result == -ESTALE) { in handle_reply()
3153 dout("got ESTALE on request %llu\n", req->r_tid); in handle_reply()
3154 req->r_resend_mds = -1; in handle_reply()
3155 if (req->r_direct_mode != USE_AUTH_MDS) { in handle_reply()
3157 req->r_direct_mode = USE_AUTH_MDS; in handle_reply()
3159 mutex_unlock(&mdsc->mutex); in handle_reply()
3163 if (mds >= 0 && mds != req->r_session->s_mds) { in handle_reply()
3166 mutex_unlock(&mdsc->mutex); in handle_reply()
3170 dout("have to return ESTALE on request %llu\n", req->r_tid); in handle_reply()
3174 if (head->safe) { in handle_reply()
3175 set_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags); in handle_reply()
3179 if (mdsc->stopping && !__get_oldest_req(mdsc)) in handle_reply()
3180 complete_all(&mdsc->safe_umount_waiters); in handle_reply()
3182 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3192 mutex_unlock(&mdsc->mutex); in handle_reply()
3196 set_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags); in handle_reply()
3197 list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); in handle_reply()
3201 rinfo = &req->r_reply_info; in handle_reply()
3202 if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features)) in handle_reply()
3203 err = parse_reply_info(session, msg, rinfo, (u64)-1); in handle_reply()
3205 err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features); in handle_reply()
3206 mutex_unlock(&mdsc->mutex); in handle_reply()
3208 mutex_lock(&session->s_mutex); in handle_reply()
3217 if (rinfo->snapblob_len) { in handle_reply()
3218 down_write(&mdsc->snap_rwsem); in handle_reply()
3219 ceph_update_snap_trace(mdsc, rinfo->snapblob, in handle_reply()
3220 rinfo->snapblob + rinfo->snapblob_len, in handle_reply()
3221 le32_to_cpu(head->op) == CEPH_MDS_OP_RMSNAP, in handle_reply()
3223 downgrade_write(&mdsc->snap_rwsem); in handle_reply()
3225 down_read(&mdsc->snap_rwsem); in handle_reply()
3229 mutex_lock(&req->r_fill_mutex); in handle_reply()
3230 current->journal_info = req; in handle_reply()
3231 err = ceph_fill_trace(mdsc->fsc->sb, req); in handle_reply()
3233 if (result == 0 && (req->r_op == CEPH_MDS_OP_READDIR || in handle_reply()
3234 req->r_op == CEPH_MDS_OP_LSSNAP)) in handle_reply()
3235 ceph_readdir_prepopulate(req, req->r_session); in handle_reply()
3237 current->journal_info = NULL; in handle_reply()
3238 mutex_unlock(&req->r_fill_mutex); in handle_reply()
3240 up_read(&mdsc->snap_rwsem); in handle_reply()
3245 if (req->r_target_inode && in handle_reply()
3246 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3248 ceph_inode(req->r_target_inode); in handle_reply()
3249 spin_lock(&ci->i_unsafe_lock); in handle_reply()
3250 list_add_tail(&req->r_unsafe_target_item, in handle_reply()
3251 &ci->i_unsafe_iops); in handle_reply()
3252 spin_unlock(&ci->i_unsafe_lock); in handle_reply()
3255 ceph_unreserve_caps(mdsc, &req->r_caps_reservation); in handle_reply()
3258 mutex_lock(&mdsc->mutex); in handle_reply()
3259 if (!test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_reply()
3261 req->r_err = err; in handle_reply()
3263 req->r_reply = ceph_msg_get(msg); in handle_reply()
3264 set_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags); in handle_reply()
3269 mutex_unlock(&mdsc->mutex); in handle_reply()
3271 mutex_unlock(&session->s_mutex); in handle_reply()
3276 ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency, in handle_reply()
3277 req->r_end_latency, err); in handle_reply()
3293 u64 tid = le64_to_cpu(msg->hdr.tid); in handle_forward()
3296 int err = -EINVAL; in handle_forward()
3297 void *p = msg->front.iov_base; in handle_forward()
3298 void *end = p + msg->front.iov_len; in handle_forward() local
3300 ceph_decode_need(&p, end, 2*sizeof(u32), bad); in handle_forward()
3304 mutex_lock(&mdsc->mutex); in handle_forward()
3307 dout("forward tid %llu to mds%d - req dne\n", tid, next_mds); in handle_forward()
3311 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_forward()
3314 } else if (fwd_seq <= req->r_num_fwd) { in handle_forward()
3315 dout("forward tid %llu to mds%d - old seq %d <= %d\n", in handle_forward()
3316 tid, next_mds, req->r_num_fwd, fwd_seq); in handle_forward()
3320 BUG_ON(req->r_err); in handle_forward()
3321 BUG_ON(test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)); in handle_forward()
3322 req->r_attempts = 0; in handle_forward()
3323 req->r_num_fwd = fwd_seq; in handle_forward()
3324 req->r_resend_mds = next_mds; in handle_forward()
3330 mutex_unlock(&mdsc->mutex); in handle_forward()
3337 static int __decode_session_metadata(void **p, void *end, in __decode_session_metadata() argument
3343 ceph_decode_32_safe(p, end, n, bad); in __decode_session_metadata()
3344 while (n-- > 0) { in __decode_session_metadata()
3346 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3347 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3350 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3351 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3362 return -1; in __decode_session_metadata()
3371 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session()
3372 int mds = session->s_mds; in handle_session()
3373 int msg_version = le16_to_cpu(msg->hdr.version); in handle_session()
3374 void *p = msg->front.iov_base; in handle_session()
3375 void *end = p + msg->front.iov_len; in handle_session() local
3383 ceph_decode_need(&p, end, sizeof(*h), bad); in handle_session()
3387 op = le32_to_cpu(h->op); in handle_session()
3388 seq = le64_to_cpu(h->seq); in handle_session()
3393 if (__decode_session_metadata(&p, end, &blocklisted) < 0) in handle_session()
3396 ceph_decode_32_safe(&p, end, len, bad); in handle_session()
3398 ceph_decode_64_safe(&p, end, features, bad); in handle_session()
3399 p += len - sizeof(features); in handle_session()
3403 mutex_lock(&mdsc->mutex); in handle_session()
3409 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
3410 mutex_unlock(&mdsc->mutex); in handle_session()
3412 mutex_lock(&session->s_mutex); in handle_session()
3416 ceph_session_state_name(session->s_state), seq); in handle_session()
3418 if (session->s_state == CEPH_MDS_SESSION_HUNG) { in handle_session()
3419 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3420 pr_info("mds%d came back\n", session->s_mds); in handle_session()
3425 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3426 pr_info("mds%d reconnect success\n", session->s_mds); in handle_session()
3427 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3428 session->s_features = features; in handle_session()
3430 if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features)) in handle_session()
3431 metric_schedule_delayed(&mdsc->metric); in handle_session()
3433 if (mdsc->stopping) in handle_session()
3438 if (session->s_renew_seq == seq) in handle_session()
3443 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3444 pr_info("mds%d reconnect denied\n", session->s_mds); in handle_session()
3445 session->s_state = CEPH_MDS_SESSION_CLOSED; in handle_session()
3449 wake_up_all(&mdsc->session_close_wq); in handle_session()
3454 session->s_mds); in handle_session()
3455 spin_lock(&session->s_gen_ttl_lock); in handle_session()
3456 session->s_cap_gen++; in handle_session()
3457 session->s_cap_ttl = jiffies - 1; in handle_session()
3458 spin_unlock(&session->s_gen_ttl_lock); in handle_session()
3463 ceph_trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
3472 spin_lock(&session->s_cap_lock); in handle_session()
3473 session->s_readonly = true; in handle_session()
3474 spin_unlock(&session->s_cap_lock); in handle_session()
3479 WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); in handle_session()
3480 pr_info("mds%d rejected session\n", session->s_mds); in handle_session()
3481 session->s_state = CEPH_MDS_SESSION_REJECTED; in handle_session()
3485 mdsc->fsc->blocklisted = true; in handle_session()
3494 mutex_unlock(&session->s_mutex); in handle_session()
3496 mutex_lock(&mdsc->mutex); in handle_session()
3497 __wake_requests(mdsc, &session->s_waiting); in handle_session()
3500 mutex_unlock(&mdsc->mutex); in handle_session()
3508 (int)msg->front.iov_len); in handle_session()
3517 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps()
3520 ceph_put_cap_refs(ceph_inode(req->r_parent), dcaps); in ceph_mdsc_release_dir_caps()
3528 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps_no_check()
3531 ceph_put_cap_refs_no_check_caps(ceph_inode(req->r_parent), in ceph_mdsc_release_dir_caps_no_check()
3537 * called under session->mutex.
3545 dout("replay_unsafe_requests mds%d\n", session->s_mds); in replay_unsafe_requests()
3547 mutex_lock(&mdsc->mutex); in replay_unsafe_requests()
3548 list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) in replay_unsafe_requests()
3552 * also re-send old requests when MDS enters reconnect stage. So that MDS in replay_unsafe_requests()
3555 p = rb_first(&mdsc->request_tree); in replay_unsafe_requests()
3559 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in replay_unsafe_requests()
3561 if (req->r_attempts == 0) in replay_unsafe_requests()
3563 if (!req->r_session) in replay_unsafe_requests()
3565 if (req->r_session->s_mds != session->s_mds) in replay_unsafe_requests()
3572 mutex_unlock(&mdsc->mutex); in replay_unsafe_requests()
3581 int err = -ENOMEM; in send_reconnect_partial()
3583 if (!recon_state->allow_multi) in send_reconnect_partial()
3584 return -ENOSPC; in send_reconnect_partial()
3587 BUG_ON(!recon_state->nr_caps == !recon_state->nr_realms); in send_reconnect_partial()
3589 /* pre-allocate new pagelist */ in send_reconnect_partial()
3592 return -ENOMEM; in send_reconnect_partial()
3603 if (recon_state->nr_caps) { in send_reconnect_partial()
3605 err = ceph_pagelist_encode_32(recon_state->pagelist, 0); in send_reconnect_partial()
3615 err = ceph_pagelist_encode_8(recon_state->pagelist, 1); in send_reconnect_partial()
3619 page = list_first_entry(&recon_state->pagelist->head, struct page, lru); in send_reconnect_partial()
3621 if (recon_state->nr_caps) { in send_reconnect_partial()
3623 *addr = cpu_to_le32(recon_state->nr_caps); in send_reconnect_partial()
3626 *(addr + 1) = cpu_to_le32(recon_state->nr_realms); in send_reconnect_partial()
3630 reply->hdr.version = cpu_to_le16(5); in send_reconnect_partial()
3631 reply->hdr.compat_version = cpu_to_le16(4); in send_reconnect_partial()
3633 reply->hdr.data_len = cpu_to_le32(recon_state->pagelist->length); in send_reconnect_partial()
3634 ceph_msg_data_add_pagelist(reply, recon_state->pagelist); in send_reconnect_partial()
3636 ceph_con_send(&recon_state->session->s_con, reply); in send_reconnect_partial()
3637 ceph_pagelist_release(recon_state->pagelist); in send_reconnect_partial()
3639 recon_state->pagelist = _pagelist; in send_reconnect_partial()
3640 recon_state->nr_caps = 0; in send_reconnect_partial()
3641 recon_state->nr_realms = 0; in send_reconnect_partial()
3642 recon_state->msg_version = 5; in send_reconnect_partial()
3655 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3658 spin_lock(&inode->i_lock); in d_find_primary()
3659 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3662 if (S_ISDIR(inode->i_mode)) { in d_find_primary()
3663 alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias); in d_find_primary()
3669 hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { in d_find_primary()
3670 spin_lock(&alias->d_lock); in d_find_primary()
3672 (ceph_dentry(alias)->flags & CEPH_DENTRY_PRIMARY_LINK)) { in d_find_primary()
3675 spin_unlock(&alias->d_lock); in d_find_primary()
3680 spin_unlock(&inode->i_lock); in d_find_primary()
3694 struct ceph_inode_info *ci = cap->ci; in reconnect_caps_cb()
3696 struct ceph_pagelist *pagelist = recon_state->pagelist; in reconnect_caps_cb()
3704 inode, ceph_vinop(inode), cap, cap->cap_id, in reconnect_caps_cb()
3705 ceph_cap_string(cap->issued)); in reconnect_caps_cb()
3711 recon_state->msg_version >= 2); in reconnect_caps_cb()
3722 spin_lock(&ci->i_ceph_lock); in reconnect_caps_cb()
3723 cap->seq = 0; /* reset cap seq */ in reconnect_caps_cb()
3724 cap->issue_seq = 0; /* and issue_seq */ in reconnect_caps_cb()
3725 cap->mseq = 0; /* and migrate_seq */ in reconnect_caps_cb()
3726 cap->cap_gen = cap->session->s_cap_gen; in reconnect_caps_cb()
3729 if (S_ISDIR(inode->i_mode)) { in reconnect_caps_cb()
3730 if (cap->issued & CEPH_CAP_DIR_CREATE) { in reconnect_caps_cb()
3731 ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); in reconnect_caps_cb()
3732 memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout)); in reconnect_caps_cb()
3734 cap->issued &= ~CEPH_CAP_ANY_DIR_OPS; in reconnect_caps_cb()
3737 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3738 rec.v2.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3740 rec.v2.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3741 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3744 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1); in reconnect_caps_cb()
3746 rec.v1.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3748 rec.v1.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3749 rec.v1.size = cpu_to_le64(inode->i_size); in reconnect_caps_cb()
3750 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime); in reconnect_caps_cb()
3751 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime); in reconnect_caps_cb()
3752 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3756 if (list_empty(&ci->i_cap_snaps)) { in reconnect_caps_cb()
3757 snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0; in reconnect_caps_cb()
3760 list_first_entry(&ci->i_cap_snaps, in reconnect_caps_cb()
3762 snap_follows = capsnap->follows; in reconnect_caps_cb()
3764 spin_unlock(&ci->i_ceph_lock); in reconnect_caps_cb()
3766 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3784 err = -ENOMEM; in reconnect_caps_cb()
3793 if (err == -ENOSPC) in reconnect_caps_cb()
3802 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3822 if (pagelist->length + total_len > RECONNECT_MAX_SIZE) { in reconnect_caps_cb()
3826 pagelist = recon_state->pagelist; in reconnect_caps_cb()
3834 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3862 recon_state->nr_caps++; in reconnect_caps_cb()
3870 struct ceph_pagelist *pagelist = recon_state->pagelist; in encode_snap_realms()
3873 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3874 err = ceph_pagelist_encode_32(pagelist, mdsc->num_snap_realms); in encode_snap_realms()
3884 for (p = rb_first(&mdsc->snap_realms); p; p = rb_next(p)) { in encode_snap_realms()
3889 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3893 if (pagelist->length + need > RECONNECT_MAX_SIZE) { in encode_snap_realms()
3897 pagelist = recon_state->pagelist; in encode_snap_realms()
3910 realm->ino, realm->seq, realm->parent_ino); in encode_snap_realms()
3911 sr_rec.ino = cpu_to_le64(realm->ino); in encode_snap_realms()
3912 sr_rec.seq = cpu_to_le64(realm->seq); in encode_snap_realms()
3913 sr_rec.parent = cpu_to_le64(realm->parent_ino); in encode_snap_realms()
3919 recon_state->nr_realms++; in encode_snap_realms()
3940 int mds = session->s_mds; in send_mds_reconnect()
3941 int err = -ENOMEM; in send_mds_reconnect()
3957 xa_destroy(&session->s_delegated_inos); in send_mds_reconnect()
3959 mutex_lock(&session->s_mutex); in send_mds_reconnect()
3960 session->s_state = CEPH_MDS_SESSION_RECONNECTING; in send_mds_reconnect()
3961 session->s_seq = 0; in send_mds_reconnect()
3964 ceph_session_state_name(session->s_state)); in send_mds_reconnect()
3966 spin_lock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3967 session->s_cap_gen++; in send_mds_reconnect()
3968 spin_unlock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3970 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
3972 session->s_readonly = 0; in send_mds_reconnect()
3978 session->s_cap_reconnect = 1; in send_mds_reconnect()
3981 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
3985 if (mdsc->fsc->sb->s_root) in send_mds_reconnect()
3986 shrink_dcache_parent(mdsc->fsc->sb->s_root); in send_mds_reconnect()
3988 ceph_con_close(&session->s_con); in send_mds_reconnect()
3989 ceph_con_open(&session->s_con, in send_mds_reconnect()
3991 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in send_mds_reconnect()
3998 down_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4005 if (test_bit(CEPHFS_FEATURE_MULTI_RECONNECT, &session->s_features)) { in send_mds_reconnect()
4008 } else if (session->s_con.peer_features & CEPH_FEATURE_MDSENC) { in send_mds_reconnect()
4016 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
4017 session->s_cap_reconnect = 0; in send_mds_reconnect()
4018 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4024 if (mdsc->num_snap_realms) { in send_mds_reconnect()
4026 recon_state.pagelist->length + in send_mds_reconnect()
4027 mdsc->num_snap_realms * in send_mds_reconnect()
4033 total_len += mdsc->num_snap_realms * in send_mds_reconnect()
4038 err = -ENOSPC; in send_mds_reconnect()
4062 list_first_entry(&recon_state.pagelist->head, in send_mds_reconnect()
4066 WARN_ON(recon_state.nr_realms != mdsc->num_snap_realms); in send_mds_reconnect()
4074 reply->hdr.version = cpu_to_le16(recon_state.msg_version); in send_mds_reconnect()
4076 reply->hdr.compat_version = cpu_to_le16(4); in send_mds_reconnect()
4078 reply->hdr.data_len = cpu_to_le32(recon_state.pagelist->length); in send_mds_reconnect()
4081 ceph_con_send(&session->s_con, reply); in send_mds_reconnect()
4083 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4085 mutex_lock(&mdsc->mutex); in send_mds_reconnect()
4086 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
4087 mutex_unlock(&mdsc->mutex); in send_mds_reconnect()
4089 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4095 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4096 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4109 * called under mdsc->mutex.
4120 newmap->m_epoch, oldmap->m_epoch); in check_new_map()
4122 for (i = 0; i < oldmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4123 if (!mdsc->sessions[i]) in check_new_map()
4125 s = mdsc->sessions[i]; in check_new_map()
4129 dout("check_new_map mds%d state %s%s -> %s%s (session %s)\n", in check_new_map()
4134 ceph_session_state_name(s->s_state)); in check_new_map()
4136 if (i >= newmap->possible_max_rank) { in check_new_map()
4140 __wake_requests(mdsc, &s->s_waiting); in check_new_map()
4141 mutex_unlock(&mdsc->mutex); in check_new_map()
4143 mutex_lock(&s->s_mutex); in check_new_map()
4146 mutex_unlock(&s->s_mutex); in check_new_map()
4150 mutex_lock(&mdsc->mutex); in check_new_map()
4159 mutex_unlock(&mdsc->mutex); in check_new_map()
4160 mutex_lock(&s->s_mutex); in check_new_map()
4161 mutex_lock(&mdsc->mutex); in check_new_map()
4162 ceph_con_close(&s->s_con); in check_new_map()
4163 mutex_unlock(&s->s_mutex); in check_new_map()
4164 s->s_state = CEPH_MDS_SESSION_RESTARTING; in check_new_map()
4172 if (s->s_state == CEPH_MDS_SESSION_RESTARTING && in check_new_map()
4174 mutex_unlock(&mdsc->mutex); in check_new_map()
4176 mutex_lock(&mdsc->mutex); in check_new_map()
4186 pr_info("mds%d recovery completed\n", s->s_mds); in check_new_map()
4188 mutex_unlock(&mdsc->mutex); in check_new_map()
4189 mutex_lock(&s->s_mutex); in check_new_map()
4190 mutex_lock(&mdsc->mutex); in check_new_map()
4192 mutex_unlock(&s->s_mutex); in check_new_map()
4197 for (i = 0; i < newmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4198 s = mdsc->sessions[i]; in check_new_map()
4203 if (s->s_state == CEPH_MDS_SESSION_OPEN || in check_new_map()
4204 s->s_state == CEPH_MDS_SESSION_HUNG || in check_new_map()
4205 s->s_state == CEPH_MDS_SESSION_CLOSING) { in check_new_map()
4220 * caller must hold session s_mutex, dentry->d_lock
4226 ceph_put_mds_session(di->lease_session); in __ceph_mdsc_drop_dentry_lease()
4227 di->lease_session = NULL; in __ceph_mdsc_drop_dentry_lease()
4234 struct super_block *sb = mdsc->fsc->sb; in handle_lease()
4238 int mds = session->s_mds; in handle_lease()
4239 struct ceph_mds_lease *h = msg->front.iov_base; in handle_lease()
4248 if (msg->front.iov_len < sizeof(*h) + sizeof(u32)) in handle_lease()
4250 vino.ino = le64_to_cpu(h->ino); in handle_lease()
4252 seq = le32_to_cpu(h->seq); in handle_lease()
4254 if (msg->front.iov_len < sizeof(*h) + sizeof(u32) + dname.len) in handle_lease()
4261 ceph_lease_op_name(h->action), vino.ino, inode, in handle_lease()
4264 mutex_lock(&session->s_mutex); in handle_lease()
4285 spin_lock(&dentry->d_lock); in handle_lease()
4287 switch (h->action) { in handle_lease()
4289 if (di->lease_session == session) { in handle_lease()
4290 if (ceph_seq_cmp(di->lease_seq, seq) > 0) in handle_lease()
4291 h->seq = cpu_to_le32(di->lease_seq); in handle_lease()
4298 if (di->lease_session == session && in handle_lease()
4299 di->lease_gen == session->s_cap_gen && in handle_lease()
4300 di->lease_renew_from && in handle_lease()
4301 di->lease_renew_after == 0) { in handle_lease()
4303 msecs_to_jiffies(le32_to_cpu(h->duration_ms)); in handle_lease()
4305 di->lease_seq = seq; in handle_lease()
4306 di->time = di->lease_renew_from + duration; in handle_lease()
4307 di->lease_renew_after = di->lease_renew_from + in handle_lease()
4309 di->lease_renew_from = 0; in handle_lease()
4313 spin_unlock(&dentry->d_lock); in handle_lease()
4321 h->action = CEPH_MDS_LEASE_REVOKE_ACK; in handle_lease()
4323 ceph_con_send(&session->s_con, msg); in handle_lease()
4326 mutex_unlock(&session->s_mutex); in handle_lease()
4346 dentry, ceph_lease_op_name(action), session->s_mds); in ceph_mdsc_lease_send_msg()
4351 lease = msg->front.iov_base; in ceph_mdsc_lease_send_msg()
4352 lease->action = action; in ceph_mdsc_lease_send_msg()
4353 lease->seq = cpu_to_le32(seq); in ceph_mdsc_lease_send_msg()
4355 spin_lock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4356 dir = d_inode(dentry->d_parent); in ceph_mdsc_lease_send_msg()
4357 lease->ino = cpu_to_le64(ceph_ino(dir)); in ceph_mdsc_lease_send_msg()
4358 lease->first = lease->last = cpu_to_le64(ceph_snap(dir)); in ceph_mdsc_lease_send_msg()
4360 put_unaligned_le32(dentry->d_name.len, lease + 1); in ceph_mdsc_lease_send_msg()
4362 dentry->d_name.name, dentry->d_name.len); in ceph_mdsc_lease_send_msg()
4363 spin_unlock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4369 msg->more_to_follow = (action == CEPH_MDS_LEASE_RELEASE); in ceph_mdsc_lease_send_msg()
4371 ceph_con_send(&session->s_con, msg); in ceph_mdsc_lease_send_msg()
4381 mutex_lock(&mdsc->mutex); in lock_unlock_sessions()
4382 for (i = 0; i < mdsc->max_sessions; i++) { in lock_unlock_sessions()
4386 mutex_unlock(&mdsc->mutex); in lock_unlock_sessions()
4387 mutex_lock(&s->s_mutex); in lock_unlock_sessions()
4388 mutex_unlock(&s->s_mutex); in lock_unlock_sessions()
4390 mutex_lock(&mdsc->mutex); in lock_unlock_sessions()
4392 mutex_unlock(&mdsc->mutex); in lock_unlock_sessions()
4397 struct ceph_fs_client *fsc = mdsc->fsc; in maybe_recover_session()
4402 if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED) in maybe_recover_session()
4405 if (!READ_ONCE(fsc->blocklisted)) in maybe_recover_session()
4408 if (fsc->last_auto_reconnect && in maybe_recover_session()
4409 time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30)) in maybe_recover_session()
4413 fsc->last_auto_reconnect = jiffies; in maybe_recover_session()
4414 ceph_force_reconnect(fsc->sb); in maybe_recover_session()
4419 switch (s->s_state) { in check_session_state()
4421 if (s->s_ttl && time_after(jiffies, s->s_ttl)) { in check_session_state()
4422 s->s_state = CEPH_MDS_SESSION_HUNG; in check_session_state()
4423 pr_info("mds%d hung\n", s->s_mds); in check_session_state()
4428 WARN_ON_ONCE(s->s_ttl); in check_session_state()
4446 lockdep_assert_held(&s->s_mutex); in inc_session_sequence()
4448 s->s_seq++; in inc_session_sequence()
4450 if (s->s_state == CEPH_MDS_SESSION_CLOSING) { in inc_session_sequence()
4453 dout("resending session close request for mds%d\n", s->s_mds); in inc_session_sequence()
4457 s->s_mds, ret); in inc_session_sequence()
4462 * delayed work -- periodically trim expired leases, renew caps with mds. If
4473 schedule_delayed_work(&mdsc->delayed_work, in schedule_delayed()
4488 if (mdsc->stopping) in delayed_work()
4491 mutex_lock(&mdsc->mutex); in delayed_work()
4492 renew_interval = mdsc->mdsmap->m_session_timeout >> 2; in delayed_work()
4494 mdsc->last_renew_caps); in delayed_work()
4496 mdsc->last_renew_caps = jiffies; in delayed_work()
4498 for (i = 0; i < mdsc->max_sessions; i++) { in delayed_work()
4507 mutex_unlock(&mdsc->mutex); in delayed_work()
4509 mutex_lock(&s->s_mutex); in delayed_work()
4513 ceph_con_keepalive(&s->s_con); in delayed_work()
4514 if (s->s_state == CEPH_MDS_SESSION_OPEN || in delayed_work()
4515 s->s_state == CEPH_MDS_SESSION_HUNG) in delayed_work()
4517 mutex_unlock(&s->s_mutex); in delayed_work()
4520 mutex_lock(&mdsc->mutex); in delayed_work()
4522 mutex_unlock(&mdsc->mutex); in delayed_work()
4543 return -ENOMEM; in ceph_mdsc_init()
4544 mdsc->fsc = fsc; in ceph_mdsc_init()
4545 mutex_init(&mdsc->mutex); in ceph_mdsc_init()
4546 mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); in ceph_mdsc_init()
4547 if (!mdsc->mdsmap) { in ceph_mdsc_init()
4548 err = -ENOMEM; in ceph_mdsc_init()
4552 init_completion(&mdsc->safe_umount_waiters); in ceph_mdsc_init()
4553 init_waitqueue_head(&mdsc->session_close_wq); in ceph_mdsc_init()
4554 INIT_LIST_HEAD(&mdsc->waiting_for_map); in ceph_mdsc_init()
4555 mdsc->sessions = NULL; in ceph_mdsc_init()
4556 atomic_set(&mdsc->num_sessions, 0); in ceph_mdsc_init()
4557 mdsc->max_sessions = 0; in ceph_mdsc_init()
4558 mdsc->stopping = 0; in ceph_mdsc_init()
4559 atomic64_set(&mdsc->quotarealms_count, 0); in ceph_mdsc_init()
4560 mdsc->quotarealms_inodes = RB_ROOT; in ceph_mdsc_init()
4561 mutex_init(&mdsc->quotarealms_inodes_mutex); in ceph_mdsc_init()
4562 mdsc->last_snap_seq = 0; in ceph_mdsc_init()
4563 init_rwsem(&mdsc->snap_rwsem); in ceph_mdsc_init()
4564 mdsc->snap_realms = RB_ROOT; in ceph_mdsc_init()
4565 INIT_LIST_HEAD(&mdsc->snap_empty); in ceph_mdsc_init()
4566 mdsc->num_snap_realms = 0; in ceph_mdsc_init()
4567 spin_lock_init(&mdsc->snap_empty_lock); in ceph_mdsc_init()
4568 mdsc->last_tid = 0; in ceph_mdsc_init()
4569 mdsc->oldest_tid = 0; in ceph_mdsc_init()
4570 mdsc->request_tree = RB_ROOT; in ceph_mdsc_init()
4571 INIT_DELAYED_WORK(&mdsc->delayed_work, delayed_work); in ceph_mdsc_init()
4572 mdsc->last_renew_caps = jiffies; in ceph_mdsc_init()
4573 INIT_LIST_HEAD(&mdsc->cap_delay_list); in ceph_mdsc_init()
4574 INIT_LIST_HEAD(&mdsc->cap_wait_list); in ceph_mdsc_init()
4575 spin_lock_init(&mdsc->cap_delay_lock); in ceph_mdsc_init()
4576 INIT_LIST_HEAD(&mdsc->snap_flush_list); in ceph_mdsc_init()
4577 spin_lock_init(&mdsc->snap_flush_lock); in ceph_mdsc_init()
4578 mdsc->last_cap_flush_tid = 1; in ceph_mdsc_init()
4579 INIT_LIST_HEAD(&mdsc->cap_flush_list); in ceph_mdsc_init()
4580 INIT_LIST_HEAD(&mdsc->cap_dirty_migrating); in ceph_mdsc_init()
4581 mdsc->num_cap_flushing = 0; in ceph_mdsc_init()
4582 spin_lock_init(&mdsc->cap_dirty_lock); in ceph_mdsc_init()
4583 init_waitqueue_head(&mdsc->cap_flushing_wq); in ceph_mdsc_init()
4584 INIT_WORK(&mdsc->cap_reclaim_work, ceph_cap_reclaim_work); in ceph_mdsc_init()
4585 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_mdsc_init()
4586 err = ceph_metric_init(&mdsc->metric); in ceph_mdsc_init()
4590 spin_lock_init(&mdsc->dentry_list_lock); in ceph_mdsc_init()
4591 INIT_LIST_HEAD(&mdsc->dentry_leases); in ceph_mdsc_init()
4592 INIT_LIST_HEAD(&mdsc->dentry_dir_leases); in ceph_mdsc_init()
4595 ceph_adjust_caps_max_min(mdsc, fsc->mount_options); in ceph_mdsc_init()
4597 spin_lock_init(&mdsc->snapid_map_lock); in ceph_mdsc_init()
4598 mdsc->snapid_map_tree = RB_ROOT; in ceph_mdsc_init()
4599 INIT_LIST_HEAD(&mdsc->snapid_map_lru); in ceph_mdsc_init()
4601 init_rwsem(&mdsc->pool_perm_rwsem); in ceph_mdsc_init()
4602 mdsc->pool_perm_tree = RB_ROOT; in ceph_mdsc_init()
4604 strscpy(mdsc->nodename, utsname()->nodename, in ceph_mdsc_init()
4605 sizeof(mdsc->nodename)); in ceph_mdsc_init()
4607 fsc->mdsc = mdsc; in ceph_mdsc_init()
4611 kfree(mdsc->mdsmap); in ceph_mdsc_init()
4623 struct ceph_options *opts = mdsc->fsc->client->options; in wait_requests()
4626 mutex_lock(&mdsc->mutex); in wait_requests()
4628 mutex_unlock(&mdsc->mutex); in wait_requests()
4631 wait_for_completion_timeout(&mdsc->safe_umount_waiters, in wait_requests()
4632 ceph_timeout_jiffies(opts->mount_timeout)); in wait_requests()
4635 mutex_lock(&mdsc->mutex); in wait_requests()
4638 req->r_tid); in wait_requests()
4639 list_del_init(&req->r_wait); in wait_requests()
4643 mutex_unlock(&mdsc->mutex); in wait_requests()
4654 mdsc->stopping = 1; in ceph_mdsc_pre_umount()
4677 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4681 while (req && req->r_tid <= want_tid) { in wait_unsafe_requests()
4683 n = rb_next(&req->r_node); in wait_unsafe_requests()
4688 if (req->r_op != CEPH_MDS_OP_SETFILELOCK && in wait_unsafe_requests()
4689 (req->r_op & CEPH_MDS_OP_WRITE)) { in wait_unsafe_requests()
4694 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4696 req->r_tid, want_tid); in wait_unsafe_requests()
4697 wait_for_completion(&req->r_safe_completion); in wait_unsafe_requests()
4698 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4702 if (RB_EMPTY_NODE(&nextreq->r_node)) { in wait_unsafe_requests()
4711 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4719 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in ceph_mdsc_sync()
4723 mutex_lock(&mdsc->mutex); in ceph_mdsc_sync()
4724 want_tid = mdsc->last_tid; in ceph_mdsc_sync()
4725 mutex_unlock(&mdsc->mutex); in ceph_mdsc_sync()
4728 spin_lock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4729 want_flush = mdsc->last_cap_flush_tid; in ceph_mdsc_sync()
4730 if (!list_empty(&mdsc->cap_flush_list)) { in ceph_mdsc_sync()
4732 list_last_entry(&mdsc->cap_flush_list, in ceph_mdsc_sync()
4734 cf->wake = true; in ceph_mdsc_sync()
4736 spin_unlock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4750 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in done_closing_sessions()
4752 return atomic_read(&mdsc->num_sessions) <= skipped; in done_closing_sessions()
4760 struct ceph_options *opts = mdsc->fsc->client->options; in ceph_mdsc_close_sessions()
4768 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4769 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4773 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4774 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4777 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4779 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4781 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4784 wait_event_timeout(mdsc->session_close_wq, in ceph_mdsc_close_sessions()
4786 ceph_timeout_jiffies(opts->mount_timeout)); in ceph_mdsc_close_sessions()
4789 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4790 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4791 if (mdsc->sessions[i]) { in ceph_mdsc_close_sessions()
4792 session = ceph_get_mds_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
4794 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4795 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4797 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4799 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4802 WARN_ON(!list_empty(&mdsc->cap_delay_list)); in ceph_mdsc_close_sessions()
4803 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4808 cancel_work_sync(&mdsc->cap_reclaim_work); in ceph_mdsc_close_sessions()
4809 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_close_sessions()
4821 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4822 for (mds = 0; mds < mdsc->max_sessions; mds++) { in ceph_mdsc_force_umount()
4827 if (session->s_state == CEPH_MDS_SESSION_REJECTED) in ceph_mdsc_force_umount()
4829 __wake_requests(mdsc, &session->s_waiting); in ceph_mdsc_force_umount()
4830 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4832 mutex_lock(&session->s_mutex); in ceph_mdsc_force_umount()
4834 if (session->s_state == CEPH_MDS_SESSION_CLOSING) { in ceph_mdsc_force_umount()
4838 mutex_unlock(&session->s_mutex); in ceph_mdsc_force_umount()
4841 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4844 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_force_umount()
4845 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4857 * delayed work will re-arm itself again after that. in ceph_mdsc_stop()
4859 flush_delayed_work(&mdsc->delayed_work); in ceph_mdsc_stop()
4861 if (mdsc->mdsmap) in ceph_mdsc_stop()
4862 ceph_mdsmap_destroy(mdsc->mdsmap); in ceph_mdsc_stop()
4863 kfree(mdsc->sessions); in ceph_mdsc_stop()
4870 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_mdsc_destroy()
4881 ceph_metric_destroy(&mdsc->metric); in ceph_mdsc_destroy()
4883 fsc->mdsc = NULL; in ceph_mdsc_destroy()
4890 struct ceph_fs_client *fsc = mdsc->fsc; in ceph_mdsc_handle_fsmap()
4891 const char *mds_namespace = fsc->mount_options->mds_namespace; in ceph_mdsc_handle_fsmap()
4892 void *p = msg->front.iov_base; in ceph_mdsc_handle_fsmap()
4893 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_fsmap() local
4897 u32 mount_fscid = (u32)-1; in ceph_mdsc_handle_fsmap()
4899 int err = -EINVAL; in ceph_mdsc_handle_fsmap()
4901 ceph_decode_need(&p, end, sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4906 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4911 ceph_decode_need(&p, end, sizeof(u32) * 3, bad); in ceph_mdsc_handle_fsmap()
4915 while (num_fs-- > 0) { in ceph_mdsc_handle_fsmap()
4921 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4925 ceph_decode_need(&p, end, info_len, bad); in ceph_mdsc_handle_fsmap()
4943 ceph_monc_got_map(&fsc->client->monc, CEPH_SUB_FSMAP, epoch); in ceph_mdsc_handle_fsmap()
4944 if (mount_fscid != (u32)-1) { in ceph_mdsc_handle_fsmap()
4945 fsc->client->monc.fs_cluster_id = mount_fscid; in ceph_mdsc_handle_fsmap()
4946 ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_fsmap()
4948 ceph_monc_renew_subs(&fsc->client->monc); in ceph_mdsc_handle_fsmap()
4950 err = -ENOENT; in ceph_mdsc_handle_fsmap()
4958 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
4959 mdsc->mdsmap_err = err; in ceph_mdsc_handle_fsmap()
4960 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_fsmap()
4961 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
4971 void *p = msg->front.iov_base; in ceph_mdsc_handle_mdsmap()
4972 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_mdsmap() local
4975 int err = -EINVAL; in ceph_mdsc_handle_mdsmap()
4977 ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad); in ceph_mdsc_handle_mdsmap()
4979 if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0) in ceph_mdsc_handle_mdsmap()
4986 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4987 if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) { in ceph_mdsc_handle_mdsmap()
4989 epoch, mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
4990 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
4994 newmap = ceph_mdsmap_decode(&p, end); in ceph_mdsc_handle_mdsmap()
5001 if (mdsc->mdsmap) { in ceph_mdsc_handle_mdsmap()
5002 oldmap = mdsc->mdsmap; in ceph_mdsc_handle_mdsmap()
5003 mdsc->mdsmap = newmap; in ceph_mdsc_handle_mdsmap()
5007 mdsc->mdsmap = newmap; /* first mds map */ in ceph_mdsc_handle_mdsmap()
5009 mdsc->fsc->max_file_size = min((loff_t)mdsc->mdsmap->m_max_file_size, in ceph_mdsc_handle_mdsmap()
5012 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_mdsmap()
5013 ceph_monc_got_map(&mdsc->fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_mdsmap()
5014 mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
5016 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5021 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5029 struct ceph_mds_session *s = con->private; in con_get()
5038 struct ceph_mds_session *s = con->private; in con_put()
5049 struct ceph_mds_session *s = con->private; in peer_reset()
5050 struct ceph_mds_client *mdsc = s->s_mdsc; in peer_reset()
5052 pr_warn("mds%d closed our session\n", s->s_mds); in peer_reset()
5058 struct ceph_mds_session *s = con->private; in dispatch()
5059 struct ceph_mds_client *mdsc = s->s_mdsc; in dispatch()
5060 int type = le16_to_cpu(msg->hdr.type); in dispatch()
5062 mutex_lock(&mdsc->mutex); in dispatch()
5064 mutex_unlock(&mdsc->mutex); in dispatch()
5067 mutex_unlock(&mdsc->mutex); in dispatch()
5117 struct ceph_mds_session *s = con->private; in get_authorizer()
5118 struct ceph_mds_client *mdsc = s->s_mdsc; in get_authorizer()
5119 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in get_authorizer()
5120 struct ceph_auth_handshake *auth = &s->s_auth; in get_authorizer()
5122 if (force_new && auth->authorizer) { in get_authorizer()
5123 ceph_auth_destroy_authorizer(auth->authorizer); in get_authorizer()
5124 auth->authorizer = NULL; in get_authorizer()
5126 if (!auth->authorizer) { in get_authorizer()
5137 *proto = ac->protocol; in get_authorizer()
5145 struct ceph_mds_session *s = con->private; in add_authorizer_challenge()
5146 struct ceph_mds_client *mdsc = s->s_mdsc; in add_authorizer_challenge()
5147 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in add_authorizer_challenge()
5149 return ceph_auth_add_authorizer_challenge(ac, s->s_auth.authorizer, in add_authorizer_challenge()
5155 struct ceph_mds_session *s = con->private; in verify_authorizer_reply()
5156 struct ceph_mds_client *mdsc = s->s_mdsc; in verify_authorizer_reply()
5157 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in verify_authorizer_reply()
5159 return ceph_auth_verify_authorizer_reply(ac, s->s_auth.authorizer); in verify_authorizer_reply()
5164 struct ceph_mds_session *s = con->private; in invalidate_authorizer()
5165 struct ceph_mds_client *mdsc = s->s_mdsc; in invalidate_authorizer()
5166 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in invalidate_authorizer()
5170 return ceph_monc_validate_auth(&mdsc->fsc->client->monc); in invalidate_authorizer()
5177 int type = (int) le16_to_cpu(hdr->type); in mds_alloc_msg()
5178 int front_len = (int) le32_to_cpu(hdr->front_len); in mds_alloc_msg()
5180 if (con->in_msg) in mds_alloc_msg()
5181 return con->in_msg; in mds_alloc_msg()
5196 struct ceph_mds_session *s = msg->con->private; in mds_sign_message()
5197 struct ceph_auth_handshake *auth = &s->s_auth; in mds_sign_message()
5204 struct ceph_mds_session *s = msg->con->private; in mds_check_message_signature()
5205 struct ceph_auth_handshake *auth = &s->s_auth; in mds_check_message_signature()