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 mutex_lock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
819 for (mds = 0; mds < mdsc->max_sessions; ++mds) { in ceph_mdsc_iterate_sessions()
831 mutex_unlock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
834 mutex_lock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
836 mutex_unlock(&mdsc->mutex); in ceph_mdsc_iterate_sessions()
845 destroy_reply_info(&req->r_reply_info); in ceph_mdsc_release_request()
846 if (req->r_request) in ceph_mdsc_release_request()
847 ceph_msg_put(req->r_request); in ceph_mdsc_release_request()
848 if (req->r_reply) in ceph_mdsc_release_request()
849 ceph_msg_put(req->r_reply); in ceph_mdsc_release_request()
850 if (req->r_inode) { in ceph_mdsc_release_request()
851 ceph_put_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_release_request()
853 ceph_async_iput(req->r_inode); in ceph_mdsc_release_request()
855 if (req->r_parent) { in ceph_mdsc_release_request()
856 ceph_put_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); in ceph_mdsc_release_request()
857 ceph_async_iput(req->r_parent); in ceph_mdsc_release_request()
859 ceph_async_iput(req->r_target_inode); in ceph_mdsc_release_request()
860 if (req->r_dentry) in ceph_mdsc_release_request()
861 dput(req->r_dentry); in ceph_mdsc_release_request()
862 if (req->r_old_dentry) in ceph_mdsc_release_request()
863 dput(req->r_old_dentry); in ceph_mdsc_release_request()
864 if (req->r_old_dentry_dir) { in ceph_mdsc_release_request()
871 ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_release_request()
873 ceph_async_iput(req->r_old_dentry_dir); in ceph_mdsc_release_request()
875 kfree(req->r_path1); in ceph_mdsc_release_request()
876 kfree(req->r_path2); in ceph_mdsc_release_request()
877 if (req->r_pagelist) in ceph_mdsc_release_request()
878 ceph_pagelist_release(req->r_pagelist); in ceph_mdsc_release_request()
880 ceph_unreserve_caps(req->r_mdsc, &req->r_caps_reservation); in ceph_mdsc_release_request()
881 WARN_ON_ONCE(!list_empty(&req->r_wait)); in ceph_mdsc_release_request()
890 * called under mdsc->mutex. in DEFINE_RB_FUNCS()
897 req = lookup_request(&mdsc->request_tree, tid); in DEFINE_RB_FUNCS()
905 * Register an in-flight request, and assign a tid. Link to directory
908 * Called under mdsc->mutex.
916 req->r_tid = ++mdsc->last_tid; in __register_request()
917 if (req->r_num_caps) { in __register_request()
918 ret = ceph_reserve_caps(mdsc, &req->r_caps_reservation, in __register_request()
919 req->r_num_caps); in __register_request()
923 /* set req->r_err to fail early from __do_request */ in __register_request()
924 req->r_err = ret; in __register_request()
928 dout("__register_request %p tid %lld\n", req, req->r_tid); in __register_request()
930 insert_request(&mdsc->request_tree, req); in __register_request()
932 req->r_uid = current_fsuid(); in __register_request()
933 req->r_gid = current_fsgid(); in __register_request()
935 if (mdsc->oldest_tid == 0 && req->r_op != CEPH_MDS_OP_SETFILELOCK) in __register_request()
936 mdsc->oldest_tid = req->r_tid; in __register_request()
942 req->r_unsafe_dir = dir; in __register_request()
943 spin_lock(&ci->i_unsafe_lock); in __register_request()
944 list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); in __register_request()
945 spin_unlock(&ci->i_unsafe_lock); in __register_request()
952 dout("__unregister_request %p tid %lld\n", req, req->r_tid); in __unregister_request()
955 list_del_init(&req->r_unsafe_item); in __unregister_request()
957 if (req->r_tid == mdsc->oldest_tid) { in __unregister_request()
958 struct rb_node *p = rb_next(&req->r_node); in __unregister_request()
959 mdsc->oldest_tid = 0; in __unregister_request()
963 if (next_req->r_op != CEPH_MDS_OP_SETFILELOCK) { in __unregister_request()
964 mdsc->oldest_tid = next_req->r_tid; in __unregister_request()
971 erase_request(&mdsc->request_tree, req); in __unregister_request()
973 if (req->r_unsafe_dir) { in __unregister_request()
974 struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); in __unregister_request()
975 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
976 list_del_init(&req->r_unsafe_dir_item); in __unregister_request()
977 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
979 if (req->r_target_inode && in __unregister_request()
980 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __unregister_request()
981 struct ceph_inode_info *ci = ceph_inode(req->r_target_inode); in __unregister_request()
982 spin_lock(&ci->i_unsafe_lock); in __unregister_request()
983 list_del_init(&req->r_unsafe_target_item); in __unregister_request()
984 spin_unlock(&ci->i_unsafe_lock); in __unregister_request()
987 if (req->r_unsafe_dir) { in __unregister_request()
989 ceph_async_iput(req->r_unsafe_dir); in __unregister_request()
990 req->r_unsafe_dir = NULL; in __unregister_request()
993 complete_all(&req->r_safe_completion); in __unregister_request()
1000 * non-snapshot inode. We do this using the rcu_read_lock (which must be held
1013 dentry = dentry->d_parent; in get_nonsnap_parent()
1026 * Called under mdsc->mutex.
1035 int mode = req->r_direct_mode; in __choose_mds()
1036 int mds = -1; in __choose_mds()
1037 u32 hash = req->r_direct_hash; in __choose_mds()
1038 bool is_hash = test_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags); in __choose_mds()
1047 if (req->r_resend_mds >= 0 && in __choose_mds()
1048 (__have_session(mdsc, req->r_resend_mds) || in __choose_mds()
1049 ceph_mdsmap_get_state(mdsc->mdsmap, req->r_resend_mds) > 0)) { in __choose_mds()
1051 req->r_resend_mds); in __choose_mds()
1052 return req->r_resend_mds; in __choose_mds()
1059 if (req->r_inode) { in __choose_mds()
1060 if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) { in __choose_mds()
1061 inode = req->r_inode; in __choose_mds()
1064 /* req->r_dentry is non-null for LSSNAP request */ in __choose_mds()
1066 inode = get_nonsnap_parent(req->r_dentry); in __choose_mds()
1070 } else if (req->r_dentry) { in __choose_mds()
1076 parent = READ_ONCE(req->r_dentry->d_parent); in __choose_mds()
1077 dir = req->r_parent ? : d_inode_rcu(parent); in __choose_mds()
1079 if (!dir || dir->i_sb != mdsc->fsc->sb) { in __choose_mds()
1081 inode = d_inode(req->r_dentry); in __choose_mds()
1091 inode = d_inode(req->r_dentry); in __choose_mds()
1095 hash = ceph_dentry_hash(dir, req->r_dentry); in __choose_mds()
1110 if (is_hash && S_ISDIR(inode->i_mode)) { in __choose_mds()
1126 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1128 !ceph_mdsmap_is_laggy(mdsc->mdsmap, mds)) in __choose_mds()
1141 if (ceph_mdsmap_get_state(mdsc->mdsmap, mds) >= in __choose_mds()
1143 if (!ceph_mdsmap_is_laggy(mdsc->mdsmap, in __choose_mds()
1152 spin_lock(&ci->i_ceph_lock); in __choose_mds()
1155 cap = ci->i_auth_cap; in __choose_mds()
1156 if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) in __choose_mds()
1157 cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); in __choose_mds()
1159 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1163 mds = cap->session->s_mds; in __choose_mds()
1166 cap == ci->i_auth_cap ? "auth " : "", cap); in __choose_mds()
1167 spin_unlock(&ci->i_ceph_lock); in __choose_mds()
1169 /* avoid calling iput_final() while holding mdsc->mutex or in __choose_mds()
1178 mds = ceph_mdsmap_get_random_mds(mdsc->mdsmap); in __choose_mds()
1199 h = msg->front.iov_base; in ceph_create_session_msg()
1200 h->op = cpu_to_le32(op); in ceph_create_session_msg()
1201 h->seq = cpu_to_le64(seq); in ceph_create_session_msg()
1207 #define FEATURE_BYTES(c) (DIV_ROUND_UP((size_t)feature_bits[c - 1] + 1, 64) * 8)
1208 static int encode_supported_features(void **p, void *end) in encode_supported_features() argument
1217 if (WARN_ON_ONCE(*p + 4 + size > end)) in encode_supported_features()
1218 return -ERANGE; in encode_supported_features()
1228 if (WARN_ON_ONCE(*p + 4 > end)) in encode_supported_features()
1229 return -ERANGE; in encode_supported_features()
1238 #define METRIC_BYTES(cnt) (DIV_ROUND_UP((size_t)metric_bits[cnt - 1] + 1, 64) * 8)
1239 static int encode_metric_spec(void **p, void *end) in encode_metric_spec() argument
1244 if (WARN_ON_ONCE(*p + 2 > end)) in encode_metric_spec()
1245 return -ERANGE; in encode_metric_spec()
1254 if (WARN_ON_ONCE(*p + 4 + 4 + size > end)) in encode_metric_spec()
1255 return -ERANGE; in encode_metric_spec()
1267 if (WARN_ON_ONCE(*p + 4 + 4 > end)) in encode_metric_spec()
1268 return -ERANGE; in encode_metric_spec()
1287 int i = -1; in create_session_open_msg()
1290 struct ceph_options *opt = mdsc->fsc->client->options; in create_session_open_msg()
1291 struct ceph_mount_options *fsopt = mdsc->fsc->mount_options; in create_session_open_msg()
1293 void *p, *end; in create_session_open_msg() local
1297 {"hostname", mdsc->nodename}, in create_session_open_msg()
1298 {"kernel_version", init_utsname()->release}, in create_session_open_msg()
1299 {"entity_id", opt->name ? : ""}, in create_session_open_msg()
1300 {"root", fsopt->server_path ? : "/"}, in create_session_open_msg()
1331 return ERR_PTR(-ENOMEM); in create_session_open_msg()
1333 p = msg->front.iov_base; in create_session_open_msg()
1334 end = p + msg->front.iov_len; in create_session_open_msg()
1337 h->op = cpu_to_le32(CEPH_SESSION_REQUEST_OPEN); in create_session_open_msg()
1338 h->seq = cpu_to_le64(seq); in create_session_open_msg()
1346 msg->hdr.version = cpu_to_le16(4); in create_session_open_msg()
1347 msg->hdr.compat_version = cpu_to_le16(1); in create_session_open_msg()
1355 /* Two length-prefixed strings for each entry in the map */ in create_session_open_msg()
1368 ret = encode_supported_features(&p, end); in create_session_open_msg()
1375 ret = encode_metric_spec(&p, end); in create_session_open_msg()
1382 msg->front.iov_len = p - msg->front.iov_base; in create_session_open_msg()
1383 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_session_open_msg()
1391 * called under mdsc->mutex
1398 int mds = session->s_mds; in __open_session()
1401 mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds); in __open_session()
1404 session->s_state = CEPH_MDS_SESSION_OPENING; in __open_session()
1405 session->s_renew_requested = jiffies; in __open_session()
1408 msg = create_session_open_msg(mdsc, session->s_seq); in __open_session()
1411 ceph_con_send(&session->s_con, msg); in __open_session()
1418 * called under mdsc->mutex
1432 if (session->s_state == CEPH_MDS_SESSION_NEW || in __open_export_target_session()
1433 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __open_export_target_session()
1449 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1451 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_session()
1461 int i, mds = session->s_mds; in __open_export_target_sessions()
1463 if (mds >= mdsc->mdsmap->possible_max_rank) in __open_export_target_sessions()
1466 mi = &mdsc->mdsmap->m_info[mds]; in __open_export_target_sessions()
1468 session->s_mds, mi->num_export_targets); in __open_export_target_sessions()
1470 for (i = 0; i < mi->num_export_targets; i++) { in __open_export_target_sessions()
1471 ts = __open_export_target_session(mdsc, mi->export_targets[i]); in __open_export_target_sessions()
1479 mutex_lock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1481 mutex_unlock(&mdsc->mutex); in ceph_mdsc_open_export_target_sessions()
1491 lockdep_assert_held(&session->s_cap_lock); in detach_cap_releases()
1493 list_splice_init(&session->s_cap_releases, target); in detach_cap_releases()
1494 session->s_num_cap_releases = 0; in detach_cap_releases()
1495 dout("dispose_cap_releases mds%d\n", session->s_mds); in detach_cap_releases()
1503 /* zero out the in-progress message */ in dispose_cap_releases()
1505 list_del(&cap->session_caps); in dispose_cap_releases()
1516 dout("cleanup_session_requests mds%d\n", session->s_mds); in cleanup_session_requests()
1517 mutex_lock(&mdsc->mutex); in cleanup_session_requests()
1518 while (!list_empty(&session->s_unsafe)) { in cleanup_session_requests()
1519 req = list_first_entry(&session->s_unsafe, in cleanup_session_requests()
1522 req->r_tid); in cleanup_session_requests()
1523 if (req->r_target_inode) in cleanup_session_requests()
1524 mapping_set_error(req->r_target_inode->i_mapping, -EIO); in cleanup_session_requests()
1525 if (req->r_unsafe_dir) in cleanup_session_requests()
1526 mapping_set_error(req->r_unsafe_dir->i_mapping, -EIO); in cleanup_session_requests()
1529 /* zero r_attempts, so kick_requests() will re-send requests */ in cleanup_session_requests()
1530 p = rb_first(&mdsc->request_tree); in cleanup_session_requests()
1534 if (req->r_session && in cleanup_session_requests()
1535 req->r_session->s_mds == session->s_mds) in cleanup_session_requests()
1536 req->r_attempts = 0; in cleanup_session_requests()
1538 mutex_unlock(&mdsc->mutex); in cleanup_session_requests()
1557 dout("iterate_session_caps %p mds%d\n", session, session->s_mds); in ceph_iterate_session_caps()
1558 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1559 p = session->s_caps.next; in ceph_iterate_session_caps()
1560 while (p != &session->s_caps) { in ceph_iterate_session_caps()
1562 inode = igrab(&cap->ci->vfs_inode); in ceph_iterate_session_caps()
1564 p = p->next; in ceph_iterate_session_caps()
1567 session->s_cap_iterator = cap; in ceph_iterate_session_caps()
1568 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1577 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1584 spin_lock(&session->s_cap_lock); in ceph_iterate_session_caps()
1585 p = p->next; in ceph_iterate_session_caps()
1586 if (!cap->ci) { in ceph_iterate_session_caps()
1589 BUG_ON(cap->session != session); in ceph_iterate_session_caps()
1590 cap->session = NULL; in ceph_iterate_session_caps()
1591 list_del_init(&cap->session_caps); in ceph_iterate_session_caps()
1592 session->s_nr_caps--; in ceph_iterate_session_caps()
1593 atomic64_dec(&session->s_mdsc->metric.total_caps); in ceph_iterate_session_caps()
1594 if (cap->queue_release) in ceph_iterate_session_caps()
1604 session->s_cap_iterator = NULL; in ceph_iterate_session_caps()
1605 spin_unlock(&session->s_cap_lock); in ceph_iterate_session_caps()
1609 ceph_put_cap(session->s_mdsc, old_cap); in ceph_iterate_session_caps()
1620 lockdep_assert_held(&ci->i_ceph_lock); in remove_capsnaps()
1624 while (!list_empty(&ci->i_cap_snaps)) { in remove_capsnaps()
1625 capsnap = list_first_entry(&ci->i_cap_snaps, in remove_capsnaps()
1628 ceph_put_snap_context(capsnap->context); in remove_capsnaps()
1632 wake_up_all(&ci->i_cap_wq); in remove_capsnaps()
1633 wake_up_all(&mdsc->cap_flushing_wq); in remove_capsnaps()
1641 struct ceph_mds_client *mdsc = fsc->mdsc; in remove_session_caps_cb()
1649 cap, ci, &ci->vfs_inode); in remove_session_caps_cb()
1650 spin_lock(&ci->i_ceph_lock); in remove_session_caps_cb()
1652 if (!ci->i_auth_cap) { in remove_session_caps_cb()
1655 if (READ_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in remove_session_caps_cb()
1656 if (inode->i_data.nrpages > 0) in remove_session_caps_cb()
1658 if (ci->i_wrbuffer_ref > 0) in remove_session_caps_cb()
1659 mapping_set_error(&inode->i_data, -EIO); in remove_session_caps_cb()
1662 while (!list_empty(&ci->i_cap_flush_list)) { in remove_session_caps_cb()
1663 cf = list_first_entry(&ci->i_cap_flush_list, in remove_session_caps_cb()
1665 list_move(&cf->i_list, &to_remove); in remove_session_caps_cb()
1668 spin_lock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1671 list_del_init(&cf->g_list); in remove_session_caps_cb()
1673 if (!list_empty(&ci->i_dirty_item)) { in remove_session_caps_cb()
1676 ceph_cap_string(ci->i_dirty_caps), in remove_session_caps_cb()
1678 ci->i_dirty_caps = 0; in remove_session_caps_cb()
1679 list_del_init(&ci->i_dirty_item); in remove_session_caps_cb()
1682 if (!list_empty(&ci->i_flushing_item)) { in remove_session_caps_cb()
1685 ceph_cap_string(ci->i_flushing_caps), in remove_session_caps_cb()
1687 ci->i_flushing_caps = 0; in remove_session_caps_cb()
1688 list_del_init(&ci->i_flushing_item); in remove_session_caps_cb()
1689 mdsc->num_cap_flushing--; in remove_session_caps_cb()
1692 spin_unlock(&mdsc->cap_dirty_lock); in remove_session_caps_cb()
1695 mapping_set_error(inode->i_mapping, -EIO); in remove_session_caps_cb()
1697 if (ci->i_wrbuffer_ref_head == 0 && in remove_session_caps_cb()
1698 ci->i_wr_ref == 0 && in remove_session_caps_cb()
1699 ci->i_dirty_caps == 0 && in remove_session_caps_cb()
1700 ci->i_flushing_caps == 0) { in remove_session_caps_cb()
1701 ceph_put_snap_context(ci->i_head_snapc); in remove_session_caps_cb()
1702 ci->i_head_snapc = NULL; in remove_session_caps_cb()
1706 if (atomic_read(&ci->i_filelock_ref) > 0) { in remove_session_caps_cb()
1707 /* make further file lock syscall return -EIO */ in remove_session_caps_cb()
1708 ci->i_ceph_flags |= CEPH_I_ERROR_FILELOCK; in remove_session_caps_cb()
1713 if (!ci->i_dirty_caps && ci->i_prealloc_cap_flush) { in remove_session_caps_cb()
1714 list_add(&ci->i_prealloc_cap_flush->i_list, &to_remove); in remove_session_caps_cb()
1715 ci->i_prealloc_cap_flush = NULL; in remove_session_caps_cb()
1718 if (!list_empty(&ci->i_cap_snaps)) in remove_session_caps_cb()
1721 spin_unlock(&ci->i_ceph_lock); in remove_session_caps_cb()
1726 list_del_init(&cf->i_list); in remove_session_caps_cb()
1727 if (!cf->is_capsnap) in remove_session_caps_cb()
1731 wake_up_all(&ci->i_cap_wq); in remove_session_caps_cb()
1736 while (capsnap_release--) in remove_session_caps_cb()
1746 struct ceph_fs_client *fsc = session->s_mdsc->fsc; in remove_session_caps()
1747 struct super_block *sb = fsc->sb; in remove_session_caps()
1753 wake_up_all(&fsc->mdsc->cap_flushing_wq); in remove_session_caps()
1755 spin_lock(&session->s_cap_lock); in remove_session_caps()
1756 if (session->s_nr_caps > 0) { in remove_session_caps()
1767 while (!list_empty(&session->s_caps)) { in remove_session_caps()
1768 cap = list_entry(session->s_caps.next, in remove_session_caps()
1773 vino = cap->ci->i_vino; in remove_session_caps()
1774 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1780 spin_lock(&session->s_cap_lock); in remove_session_caps()
1787 BUG_ON(session->s_nr_caps > 0); in remove_session_caps()
1788 BUG_ON(!list_empty(&session->s_cap_flushing)); in remove_session_caps()
1789 spin_unlock(&session->s_cap_lock); in remove_session_caps()
1790 dispose_cap_releases(session->s_mdsc, &dispose); in remove_session_caps()
1812 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1813 ci->i_wanted_max_size = 0; in wake_up_session_cb()
1814 ci->i_requested_max_size = 0; in wake_up_session_cb()
1815 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1817 if (cap->cap_gen < cap->session->s_cap_gen) { in wake_up_session_cb()
1818 /* mds did not re-issue stale cap */ in wake_up_session_cb()
1819 spin_lock(&ci->i_ceph_lock); in wake_up_session_cb()
1820 cap->issued = cap->implemented = CEPH_CAP_PIN; in wake_up_session_cb()
1821 spin_unlock(&ci->i_ceph_lock); in wake_up_session_cb()
1825 wake_up_all(&ci->i_cap_wq); in wake_up_session_cb()
1831 dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); in wake_up_session_caps()
1848 if (time_after_eq(jiffies, session->s_cap_ttl) && in send_renew_caps()
1849 time_after_eq(session->s_cap_ttl, session->s_renew_requested)) in send_renew_caps()
1850 pr_info("mds%d caps stale\n", session->s_mds); in send_renew_caps()
1851 session->s_renew_requested = jiffies; in send_renew_caps()
1855 state = ceph_mdsmap_get_state(mdsc->mdsmap, session->s_mds); in send_renew_caps()
1858 session->s_mds, ceph_mds_state_name(state)); in send_renew_caps()
1862 dout("send_renew_caps to mds%d (%s)\n", session->s_mds, in send_renew_caps()
1865 ++session->s_renew_seq); in send_renew_caps()
1867 return -ENOMEM; in send_renew_caps()
1868 ceph_con_send(&session->s_con, msg); in send_renew_caps()
1878 session->s_mds, ceph_session_state_name(session->s_state), seq); in send_flushmsg_ack()
1881 return -ENOMEM; in send_flushmsg_ack()
1882 ceph_con_send(&session->s_con, msg); in send_flushmsg_ack()
1888 * Note new cap ttl, and any transition from stale -> not stale (fresh?).
1890 * Called under session->s_mutex
1898 spin_lock(&session->s_cap_lock); in renewed_caps()
1899 was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl); in renewed_caps()
1901 session->s_cap_ttl = session->s_renew_requested + in renewed_caps()
1902 mdsc->mdsmap->m_session_timeout*HZ; in renewed_caps()
1905 if (time_before(jiffies, session->s_cap_ttl)) { in renewed_caps()
1906 pr_info("mds%d caps renewed\n", session->s_mds); in renewed_caps()
1909 pr_info("mds%d caps still stale\n", session->s_mds); in renewed_caps()
1913 session->s_mds, session->s_cap_ttl, was_stale ? "stale" : "fresh", in renewed_caps()
1914 time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh"); in renewed_caps()
1915 spin_unlock(&session->s_cap_lock); in renewed_caps()
1929 session->s_mds, ceph_session_state_name(session->s_state), in request_close_session()
1930 session->s_seq); in request_close_session()
1932 session->s_seq); in request_close_session()
1934 return -ENOMEM; in request_close_session()
1935 ceph_con_send(&session->s_con, msg); in request_close_session()
1945 if (session->s_state >= CEPH_MDS_SESSION_CLOSING) in __close_session()
1947 session->s_state = CEPH_MDS_SESSION_CLOSING; in __close_session()
1959 spin_lock(&dentry->d_lock); in drop_negative_children()
1960 list_for_each_entry(child, &dentry->d_subdirs, d_child) { in drop_negative_children()
1966 spin_unlock(&dentry->d_lock); in drop_negative_children()
1991 return -1; in trim_caps_cb()
1993 spin_lock(&ci->i_ceph_lock); in trim_caps_cb()
1994 mine = cap->issued | cap->implemented; in trim_caps_cb()
2002 if (cap == ci->i_auth_cap) { in trim_caps_cb()
2003 if (ci->i_dirty_caps || ci->i_flushing_caps || in trim_caps_cb()
2004 !list_empty(&ci->i_cap_snaps)) in trim_caps_cb()
2008 /* Note: it's possible that i_filelock_ref becomes non-zero in trim_caps_cb()
2010 * of lock mds request will re-add auth caps. */ in trim_caps_cb()
2011 if (atomic_read(&ci->i_filelock_ref) > 0) in trim_caps_cb()
2016 if (S_ISREG(inode->i_mode) && in trim_caps_cb()
2028 (*remaining)--; in trim_caps_cb()
2032 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2038 count = atomic_read(&inode->i_count); in trim_caps_cb()
2040 (*remaining)--; in trim_caps_cb()
2050 spin_unlock(&ci->i_ceph_lock); in trim_caps_cb()
2061 int trim_caps = session->s_nr_caps - max_caps; in ceph_trim_caps()
2064 session->s_mds, session->s_nr_caps, max_caps, trim_caps); in ceph_trim_caps()
2070 session->s_mds, session->s_nr_caps, max_caps, in ceph_trim_caps()
2071 trim_caps - remaining); in ceph_trim_caps()
2083 spin_lock(&mdsc->cap_dirty_lock); in check_caps_flush()
2084 if (!list_empty(&mdsc->cap_flush_list)) { in check_caps_flush()
2086 list_first_entry(&mdsc->cap_flush_list, in check_caps_flush()
2088 if (cf->tid <= want_flush_tid) { in check_caps_flush()
2090 "%llu <= %llu\n", cf->tid, want_flush_tid); in check_caps_flush()
2094 spin_unlock(&mdsc->cap_dirty_lock); in check_caps_flush()
2108 wait_event(mdsc->cap_flushing_wq, in wait_caps_flush()
2123 struct ceph_osd_client *osdc = &mdsc->fsc->client->osdc; in ceph_send_cap_releases()
2129 down_read(&osdc->lock); in ceph_send_cap_releases()
2130 barrier = cpu_to_le32(osdc->epoch_barrier); in ceph_send_cap_releases()
2131 up_read(&osdc->lock); in ceph_send_cap_releases()
2133 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2135 list_splice_init(&session->s_cap_releases, &tmp_list); in ceph_send_cap_releases()
2136 num_cap_releases = session->s_num_cap_releases; in ceph_send_cap_releases()
2137 session->s_num_cap_releases = 0; in ceph_send_cap_releases()
2138 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2146 head = msg->front.iov_base; in ceph_send_cap_releases()
2147 head->num = cpu_to_le32(0); in ceph_send_cap_releases()
2148 msg->front.iov_len = sizeof(*head); in ceph_send_cap_releases()
2150 msg->hdr.version = cpu_to_le16(2); in ceph_send_cap_releases()
2151 msg->hdr.compat_version = cpu_to_le16(1); in ceph_send_cap_releases()
2156 list_del(&cap->session_caps); in ceph_send_cap_releases()
2157 num_cap_releases--; in ceph_send_cap_releases()
2159 head = msg->front.iov_base; in ceph_send_cap_releases()
2160 put_unaligned_le32(get_unaligned_le32(&head->num) + 1, in ceph_send_cap_releases()
2161 &head->num); in ceph_send_cap_releases()
2162 item = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2163 item->ino = cpu_to_le64(cap->cap_ino); in ceph_send_cap_releases()
2164 item->cap_id = cpu_to_le64(cap->cap_id); in ceph_send_cap_releases()
2165 item->migrate_seq = cpu_to_le32(cap->mseq); in ceph_send_cap_releases()
2166 item->seq = cpu_to_le32(cap->issue_seq); in ceph_send_cap_releases()
2167 msg->front.iov_len += sizeof(*item); in ceph_send_cap_releases()
2171 if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { in ceph_send_cap_releases()
2173 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2175 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2177 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2178 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2179 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2186 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2187 if (!list_empty(&session->s_cap_releases)) in ceph_send_cap_releases()
2189 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2193 cap_barrier = msg->front.iov_base + msg->front.iov_len; in ceph_send_cap_releases()
2195 msg->front.iov_len += sizeof(*cap_barrier); in ceph_send_cap_releases()
2197 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in ceph_send_cap_releases()
2198 dout("send_cap_releases mds%d %p\n", session->s_mds, msg); in ceph_send_cap_releases()
2199 ceph_con_send(&session->s_con, msg); in ceph_send_cap_releases()
2204 session->s_mds); in ceph_send_cap_releases()
2205 spin_lock(&session->s_cap_lock); in ceph_send_cap_releases()
2206 list_splice(&tmp_list, &session->s_cap_releases); in ceph_send_cap_releases()
2207 session->s_num_cap_releases += num_cap_releases; in ceph_send_cap_releases()
2208 spin_unlock(&session->s_cap_lock); in ceph_send_cap_releases()
2216 mutex_lock(&session->s_mutex); in ceph_cap_release_work()
2217 if (session->s_state == CEPH_MDS_SESSION_OPEN || in ceph_cap_release_work()
2218 session->s_state == CEPH_MDS_SESSION_HUNG) in ceph_cap_release_work()
2219 ceph_send_cap_releases(session->s_mdsc, session); in ceph_cap_release_work()
2220 mutex_unlock(&session->s_mutex); in ceph_cap_release_work()
2227 if (mdsc->stopping) in ceph_flush_cap_releases()
2231 if (queue_work(mdsc->fsc->cap_wq, in ceph_flush_cap_releases()
2232 &session->s_cap_release_work)) { in ceph_flush_cap_releases()
2241 * caller holds session->s_cap_lock
2246 list_add_tail(&cap->session_caps, &session->s_cap_releases); in __ceph_queue_cap_release()
2247 session->s_num_cap_releases++; in __ceph_queue_cap_release()
2249 if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE)) in __ceph_queue_cap_release()
2250 ceph_flush_cap_releases(session->s_mdsc, session); in __ceph_queue_cap_release()
2258 if (ret == -EAGAIN) in ceph_cap_reclaim_work()
2264 if (mdsc->stopping) in ceph_queue_cap_reclaim_work()
2267 if (queue_work(mdsc->fsc->cap_wq, &mdsc->cap_reclaim_work)) { in ceph_queue_cap_reclaim_work()
2279 val = atomic_add_return(nr, &mdsc->cap_reclaim_pending); in ceph_reclaim_caps_nr()
2281 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_reclaim_caps_nr()
2294 struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; in ceph_alloc_readdir_reply_buffer()
2295 struct ceph_mount_options *opt = req->r_mdsc->fsc->mount_options; in ceph_alloc_readdir_reply_buffer()
2300 spin_lock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2301 num_entries = ci->i_files + ci->i_subdirs; in ceph_alloc_readdir_reply_buffer()
2302 spin_unlock(&ci->i_ceph_lock); in ceph_alloc_readdir_reply_buffer()
2304 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2308 rinfo->dir_entries = (void*)__get_free_pages(GFP_KERNEL | in ceph_alloc_readdir_reply_buffer()
2311 if (rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2313 order--; in ceph_alloc_readdir_reply_buffer()
2315 if (!rinfo->dir_entries) in ceph_alloc_readdir_reply_buffer()
2316 return -ENOMEM; in ceph_alloc_readdir_reply_buffer()
2319 num_entries = min(num_entries, opt->max_readdir); in ceph_alloc_readdir_reply_buffer()
2321 rinfo->dir_buf_size = PAGE_SIZE << order; in ceph_alloc_readdir_reply_buffer()
2322 req->r_num_caps = num_entries + 1; in ceph_alloc_readdir_reply_buffer()
2323 req->r_args.readdir.max_entries = cpu_to_le32(num_entries); in ceph_alloc_readdir_reply_buffer()
2324 req->r_args.readdir.max_bytes = cpu_to_le32(opt->max_readdir_bytes); in ceph_alloc_readdir_reply_buffer()
2338 return ERR_PTR(-ENOMEM); in ceph_mdsc_create_request()
2340 mutex_init(&req->r_fill_mutex); in ceph_mdsc_create_request()
2341 req->r_mdsc = mdsc; in ceph_mdsc_create_request()
2342 req->r_started = jiffies; in ceph_mdsc_create_request()
2343 req->r_start_latency = ktime_get(); in ceph_mdsc_create_request()
2344 req->r_resend_mds = -1; in ceph_mdsc_create_request()
2345 INIT_LIST_HEAD(&req->r_unsafe_dir_item); in ceph_mdsc_create_request()
2346 INIT_LIST_HEAD(&req->r_unsafe_target_item); in ceph_mdsc_create_request()
2347 req->r_fmode = -1; in ceph_mdsc_create_request()
2348 kref_init(&req->r_kref); in ceph_mdsc_create_request()
2349 RB_CLEAR_NODE(&req->r_node); in ceph_mdsc_create_request()
2350 INIT_LIST_HEAD(&req->r_wait); in ceph_mdsc_create_request()
2351 init_completion(&req->r_completion); in ceph_mdsc_create_request()
2352 init_completion(&req->r_safe_completion); in ceph_mdsc_create_request()
2353 INIT_LIST_HEAD(&req->r_unsafe_item); in ceph_mdsc_create_request()
2355 ktime_get_coarse_real_ts64(&req->r_stamp); in ceph_mdsc_create_request()
2357 req->r_op = op; in ceph_mdsc_create_request()
2358 req->r_direct_mode = mode; in ceph_mdsc_create_request()
2365 * called under mdsc->mutex.
2369 if (RB_EMPTY_ROOT(&mdsc->request_tree)) in __get_oldest_req()
2371 return rb_entry(rb_first(&mdsc->request_tree), in __get_oldest_req()
2377 return mdsc->oldest_tid; in __get_oldest_tid()
2384 * If @stop_on_nosnap, generate path relative to the first non-snapped
2388 * foo/.snap/bar -> foo//bar
2400 return ERR_PTR(-EINVAL); in ceph_mdsc_build_path()
2404 return ERR_PTR(-ENOMEM); in ceph_mdsc_build_path()
2406 pos = PATH_MAX - 1; in ceph_mdsc_build_path()
2415 spin_lock(&temp->d_lock); in ceph_mdsc_build_path()
2422 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2426 pos -= temp->d_name.len; in ceph_mdsc_build_path()
2428 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2431 memcpy(path + pos, temp->d_name.name, temp->d_name.len); in ceph_mdsc_build_path()
2433 spin_unlock(&temp->d_lock); in ceph_mdsc_build_path()
2434 temp = READ_ONCE(temp->d_parent); in ceph_mdsc_build_path()
2441 if (--pos < 0) in ceph_mdsc_build_path()
2454 * A rename didn't occur, but somehow we didn't end up where in ceph_mdsc_build_path()
2457 pr_warn("build_path did not end path lookup where " in ceph_mdsc_build_path()
2463 *plen = PATH_MAX - 1 - pos; in ceph_mdsc_build_path()
2477 dir = d_inode_rcu(dentry->d_parent); in build_dentry_path()
2481 *ppath = dentry->d_name.name; in build_dentry_path()
2482 *ppathlen = dentry->d_name.len; in build_dentry_path()
2547 * called under mdsc->mutex
2562 void *p, *end; in create_request_message() local
2565 ret = set_request_path_attr(req->r_inode, req->r_dentry, in create_request_message()
2566 req->r_parent, req->r_path1, req->r_ino1.ino, in create_request_message()
2569 &req->r_req_flags)); in create_request_message()
2576 ret = set_request_path_attr(NULL, req->r_old_dentry, in create_request_message()
2577 req->r_old_dentry_dir, in create_request_message()
2578 req->r_path2, req->r_ino2.ino, in create_request_message()
2591 (!!req->r_inode_drop + !!req->r_dentry_drop + in create_request_message()
2592 !!req->r_old_inode_drop + !!req->r_old_dentry_drop); in create_request_message()
2593 if (req->r_dentry_drop) in create_request_message()
2595 if (req->r_old_dentry_drop) in create_request_message()
2600 msg = ERR_PTR(-ENOMEM); in create_request_message()
2604 msg->hdr.version = cpu_to_le16(2); in create_request_message()
2605 msg->hdr.tid = cpu_to_le64(req->r_tid); in create_request_message()
2607 head = msg->front.iov_base; in create_request_message()
2608 p = msg->front.iov_base + sizeof(*head); in create_request_message()
2609 end = msg->front.iov_base + msg->front.iov_len; in create_request_message()
2611 head->mdsmap_epoch = cpu_to_le32(mdsc->mdsmap->m_epoch); in create_request_message()
2612 head->op = cpu_to_le32(req->r_op); in create_request_message()
2613 head->caller_uid = cpu_to_le32(from_kuid(&init_user_ns, req->r_uid)); in create_request_message()
2614 head->caller_gid = cpu_to_le32(from_kgid(&init_user_ns, req->r_gid)); in create_request_message()
2615 head->ino = cpu_to_le64(req->r_deleg_ino); in create_request_message()
2616 head->args = req->r_args; in create_request_message()
2618 ceph_encode_filepath(&p, end, ino1, path1); in create_request_message()
2619 ceph_encode_filepath(&p, end, ino2, path2); in create_request_message()
2622 req->r_request_release_offset = p - msg->front.iov_base; in create_request_message()
2626 if (req->r_inode_drop) in create_request_message()
2628 req->r_inode ? req->r_inode : d_inode(req->r_dentry), in create_request_message()
2629 mds, req->r_inode_drop, req->r_inode_unless, in create_request_message()
2630 req->r_op == CEPH_MDS_OP_READDIR); in create_request_message()
2631 if (req->r_dentry_drop) in create_request_message()
2632 releases += ceph_encode_dentry_release(&p, req->r_dentry, in create_request_message()
2633 req->r_parent, mds, req->r_dentry_drop, in create_request_message()
2634 req->r_dentry_unless); in create_request_message()
2635 if (req->r_old_dentry_drop) in create_request_message()
2636 releases += ceph_encode_dentry_release(&p, req->r_old_dentry, in create_request_message()
2637 req->r_old_dentry_dir, mds, in create_request_message()
2638 req->r_old_dentry_drop, in create_request_message()
2639 req->r_old_dentry_unless); in create_request_message()
2640 if (req->r_old_inode_drop) in create_request_message()
2642 d_inode(req->r_old_dentry), in create_request_message()
2643 mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); in create_request_message()
2647 p = msg->front.iov_base + req->r_request_release_offset; in create_request_message()
2650 head->num_releases = cpu_to_le16(releases); in create_request_message()
2655 ceph_encode_timespec64(&ts, &req->r_stamp); in create_request_message()
2659 if (WARN_ON_ONCE(p > end)) { in create_request_message()
2661 msg = ERR_PTR(-ERANGE); in create_request_message()
2665 msg->front.iov_len = p - msg->front.iov_base; in create_request_message()
2666 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in create_request_message()
2668 if (req->r_pagelist) { in create_request_message()
2669 struct ceph_pagelist *pagelist = req->r_pagelist; in create_request_message()
2671 msg->hdr.data_len = cpu_to_le32(pagelist->length); in create_request_message()
2673 msg->hdr.data_len = 0; in create_request_message()
2676 msg->hdr.data_off = cpu_to_le16(0); in create_request_message()
2689 * called under mdsc->mutex if error, under no mutex if
2695 req->r_end_latency = ktime_get(); in complete_request()
2697 if (req->r_callback) in complete_request()
2698 req->r_callback(mdsc, req); in complete_request()
2699 complete_all(&req->r_completion); in complete_request()
2703 * called under mdsc->mutex
2713 req->r_attempts++; in __prepare_send_request()
2714 if (req->r_inode) { in __prepare_send_request()
2716 ceph_get_cap_for_mds(ceph_inode(req->r_inode), mds); in __prepare_send_request()
2719 req->r_sent_on_mseq = cap->mseq; in __prepare_send_request()
2721 req->r_sent_on_mseq = -1; in __prepare_send_request()
2724 req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); in __prepare_send_request()
2726 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in __prepare_send_request()
2734 msg = req->r_request; in __prepare_send_request()
2735 rhead = msg->front.iov_base; in __prepare_send_request()
2737 flags = le32_to_cpu(rhead->flags); in __prepare_send_request()
2739 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2741 if (req->r_target_inode) in __prepare_send_request()
2742 rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); in __prepare_send_request()
2744 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2747 rhead->num_releases = 0; in __prepare_send_request()
2750 p = msg->front.iov_base + req->r_request_release_offset; in __prepare_send_request()
2753 ceph_encode_timespec64(&ts, &req->r_stamp); in __prepare_send_request()
2757 msg->front.iov_len = p - msg->front.iov_base; in __prepare_send_request()
2758 msg->hdr.front_len = cpu_to_le32(msg->front.iov_len); in __prepare_send_request()
2762 if (req->r_request) { in __prepare_send_request()
2763 ceph_msg_put(req->r_request); in __prepare_send_request()
2764 req->r_request = NULL; in __prepare_send_request()
2768 req->r_err = PTR_ERR(msg); in __prepare_send_request()
2771 req->r_request = msg; in __prepare_send_request()
2773 rhead = msg->front.iov_base; in __prepare_send_request()
2774 rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc)); in __prepare_send_request()
2775 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in __prepare_send_request()
2777 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) in __prepare_send_request()
2779 if (req->r_parent) in __prepare_send_request()
2781 rhead->flags = cpu_to_le32(flags); in __prepare_send_request()
2782 rhead->num_fwd = req->r_num_fwd; in __prepare_send_request()
2783 rhead->num_retry = req->r_attempts - 1; in __prepare_send_request()
2785 dout(" r_parent = %p\n", req->r_parent); in __prepare_send_request()
2790 * called under mdsc->mutex
2799 err = __prepare_send_request(mdsc, req, session->s_mds, in __send_request()
2802 ceph_msg_get(req->r_request); in __send_request()
2803 ceph_con_send(&session->s_con, req->r_request); in __send_request()
2816 int mds = -1; in __do_request()
2820 if (req->r_err || test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in __do_request()
2821 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) in __do_request()
2826 if (req->r_timeout && in __do_request()
2827 time_after_eq(jiffies, req->r_started + req->r_timeout)) { in __do_request()
2829 err = -ETIMEDOUT; in __do_request()
2832 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) { in __do_request()
2834 err = -EIO; in __do_request()
2837 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_MOUNTING) { in __do_request()
2838 if (mdsc->mdsmap_err) { in __do_request()
2839 err = mdsc->mdsmap_err; in __do_request()
2843 if (mdsc->mdsmap->m_epoch == 0) { in __do_request()
2845 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2848 if (!(mdsc->fsc->mount_options->flags & in __do_request()
2850 !ceph_mdsmap_is_cluster_available(mdsc->mdsmap)) { in __do_request()
2851 err = -EHOSTUNREACH; in __do_request()
2860 ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { in __do_request()
2861 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2862 err = -EJUKEBOX; in __do_request()
2866 list_add(&req->r_wait, &mdsc->waiting_for_map); in __do_request()
2879 req->r_session = ceph_get_mds_session(session); in __do_request()
2882 ceph_session_state_name(session->s_state)); in __do_request()
2883 if (session->s_state != CEPH_MDS_SESSION_OPEN && in __do_request()
2884 session->s_state != CEPH_MDS_SESSION_HUNG) { in __do_request()
2885 if (session->s_state == CEPH_MDS_SESSION_REJECTED) { in __do_request()
2886 err = -EACCES; in __do_request()
2891 * inodes are bound to the session. Just return -EJUKEBOX and in __do_request()
2894 if (test_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags)) { in __do_request()
2895 err = -EJUKEBOX; in __do_request()
2898 if (session->s_state == CEPH_MDS_SESSION_NEW || in __do_request()
2899 session->s_state == CEPH_MDS_SESSION_CLOSING) { in __do_request()
2905 req->r_resend_mds = mds; in __do_request()
2907 list_add(&req->r_wait, &session->s_waiting); in __do_request()
2912 req->r_resend_mds = -1; /* forget any previous mds hint */ in __do_request()
2914 if (req->r_request_started == 0) /* note request start time */ in __do_request()
2915 req->r_request_started = jiffies; in __do_request()
2924 req->r_err = err; in __do_request()
2932 * called under mdsc->mutex
2945 list_del_init(&req->r_wait); in __wake_requests()
2946 dout(" wake request %p tid %llu\n", req, req->r_tid); in __wake_requests()
2958 struct rb_node *p = rb_first(&mdsc->request_tree); in kick_requests()
2964 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in kick_requests()
2966 if (req->r_attempts > 0) in kick_requests()
2968 if (req->r_session && in kick_requests()
2969 req->r_session->s_mds == mds) { in kick_requests()
2970 dout(" kicking tid %llu\n", req->r_tid); in kick_requests()
2971 list_del_init(&req->r_wait); in kick_requests()
2983 if (req->r_inode) in ceph_mdsc_submit_request()
2984 ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); in ceph_mdsc_submit_request()
2985 if (req->r_parent) { in ceph_mdsc_submit_request()
2986 struct ceph_inode_info *ci = ceph_inode(req->r_parent); in ceph_mdsc_submit_request()
2987 int fmode = (req->r_op & CEPH_MDS_OP_WRITE) ? in ceph_mdsc_submit_request()
2989 spin_lock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2992 spin_unlock(&ci->i_ceph_lock); in ceph_mdsc_submit_request()
2993 ihold(req->r_parent); in ceph_mdsc_submit_request()
2995 if (req->r_old_dentry_dir) in ceph_mdsc_submit_request()
2996 ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), in ceph_mdsc_submit_request()
2999 if (req->r_inode) { in ceph_mdsc_submit_request()
3000 err = ceph_wait_on_async_create(req->r_inode); in ceph_mdsc_submit_request()
3008 if (!err && req->r_old_inode) { in ceph_mdsc_submit_request()
3009 err = ceph_wait_on_async_create(req->r_old_inode); in ceph_mdsc_submit_request()
3018 mutex_lock(&mdsc->mutex); in ceph_mdsc_submit_request()
3021 err = req->r_err; in ceph_mdsc_submit_request()
3022 mutex_unlock(&mdsc->mutex); in ceph_mdsc_submit_request()
3033 if (!req->r_timeout && req->r_wait_for_completion) { in ceph_mdsc_wait_request()
3034 err = req->r_wait_for_completion(mdsc, req); in ceph_mdsc_wait_request()
3037 &req->r_completion, in ceph_mdsc_wait_request()
3038 ceph_timeout_jiffies(req->r_timeout)); in ceph_mdsc_wait_request()
3042 err = -ETIMEDOUT; /* timed out */ in ceph_mdsc_wait_request()
3047 mutex_lock(&mdsc->mutex); in ceph_mdsc_wait_request()
3050 if (test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)) { in ceph_mdsc_wait_request()
3051 err = le32_to_cpu(req->r_reply_info.head->result); in ceph_mdsc_wait_request()
3053 dout("aborted request %lld with %d\n", req->r_tid, err); in ceph_mdsc_wait_request()
3060 mutex_lock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3061 req->r_err = err; in ceph_mdsc_wait_request()
3062 set_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags); in ceph_mdsc_wait_request()
3063 mutex_unlock(&req->r_fill_mutex); in ceph_mdsc_wait_request()
3065 if (req->r_parent && in ceph_mdsc_wait_request()
3066 (req->r_op & CEPH_MDS_OP_WRITE)) in ceph_mdsc_wait_request()
3069 err = req->r_err; in ceph_mdsc_wait_request()
3072 mutex_unlock(&mdsc->mutex); in ceph_mdsc_wait_request()
3102 struct inode *dir = req->r_parent; in ceph_invalidate_dir_request()
3103 struct inode *old_dir = req->r_old_dentry_dir; in ceph_invalidate_dir_request()
3110 if (req->r_dentry) in ceph_invalidate_dir_request()
3111 ceph_invalidate_dentry_lease(req->r_dentry); in ceph_invalidate_dir_request()
3112 if (req->r_old_dentry) in ceph_invalidate_dir_request()
3113 ceph_invalidate_dentry_lease(req->r_old_dentry); in ceph_invalidate_dir_request()
3125 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_reply()
3127 struct ceph_mds_reply_head *head = msg->front.iov_base; in handle_reply()
3132 int mds = session->s_mds; in handle_reply()
3134 if (msg->front.iov_len < sizeof(*head)) { in handle_reply()
3141 tid = le64_to_cpu(msg->hdr.tid); in handle_reply()
3142 mutex_lock(&mdsc->mutex); in handle_reply()
3146 mutex_unlock(&mdsc->mutex); in handle_reply()
3152 if (req->r_session != session) { in handle_reply()
3154 " not mds%d\n", tid, session->s_mds, in handle_reply()
3155 req->r_session ? req->r_session->s_mds : -1); in handle_reply()
3156 mutex_unlock(&mdsc->mutex); in handle_reply()
3161 if ((test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags) && !head->safe) || in handle_reply()
3162 (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags) && head->safe)) { in handle_reply()
3164 head->safe ? "safe" : "unsafe", tid, mds); in handle_reply()
3165 mutex_unlock(&mdsc->mutex); in handle_reply()
3168 if (test_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags)) { in handle_reply()
3171 mutex_unlock(&mdsc->mutex); in handle_reply()
3175 result = le32_to_cpu(head->result); in handle_reply()
3184 if (result == -ESTALE) { in handle_reply()
3185 dout("got ESTALE on request %llu\n", req->r_tid); in handle_reply()
3186 req->r_resend_mds = -1; in handle_reply()
3187 if (req->r_direct_mode != USE_AUTH_MDS) { in handle_reply()
3189 req->r_direct_mode = USE_AUTH_MDS; in handle_reply()
3191 mutex_unlock(&mdsc->mutex); in handle_reply()
3195 if (mds >= 0 && mds != req->r_session->s_mds) { in handle_reply()
3198 mutex_unlock(&mdsc->mutex); in handle_reply()
3202 dout("have to return ESTALE on request %llu\n", req->r_tid); in handle_reply()
3206 if (head->safe) { in handle_reply()
3207 set_bit(CEPH_MDS_R_GOT_SAFE, &req->r_req_flags); in handle_reply()
3211 if (mdsc->stopping && !__get_oldest_req(mdsc)) in handle_reply()
3212 complete_all(&mdsc->safe_umount_waiters); in handle_reply()
3214 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3224 mutex_unlock(&mdsc->mutex); in handle_reply()
3228 set_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags); in handle_reply()
3229 list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); in handle_reply()
3233 rinfo = &req->r_reply_info; in handle_reply()
3234 if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features)) in handle_reply()
3235 err = parse_reply_info(session, msg, rinfo, (u64)-1); in handle_reply()
3237 err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features); in handle_reply()
3238 mutex_unlock(&mdsc->mutex); in handle_reply()
3240 mutex_lock(&session->s_mutex); in handle_reply()
3249 if (rinfo->snapblob_len) { in handle_reply()
3250 down_write(&mdsc->snap_rwsem); in handle_reply()
3251 ceph_update_snap_trace(mdsc, rinfo->snapblob, in handle_reply()
3252 rinfo->snapblob + rinfo->snapblob_len, in handle_reply()
3253 le32_to_cpu(head->op) == CEPH_MDS_OP_RMSNAP, in handle_reply()
3255 downgrade_write(&mdsc->snap_rwsem); in handle_reply()
3257 down_read(&mdsc->snap_rwsem); in handle_reply()
3261 mutex_lock(&req->r_fill_mutex); in handle_reply()
3262 current->journal_info = req; in handle_reply()
3263 err = ceph_fill_trace(mdsc->fsc->sb, req); in handle_reply()
3265 if (result == 0 && (req->r_op == CEPH_MDS_OP_READDIR || in handle_reply()
3266 req->r_op == CEPH_MDS_OP_LSSNAP)) in handle_reply()
3267 ceph_readdir_prepopulate(req, req->r_session); in handle_reply()
3269 current->journal_info = NULL; in handle_reply()
3270 mutex_unlock(&req->r_fill_mutex); in handle_reply()
3272 up_read(&mdsc->snap_rwsem); in handle_reply()
3277 if (req->r_target_inode && in handle_reply()
3278 test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) { in handle_reply()
3280 ceph_inode(req->r_target_inode); in handle_reply()
3281 spin_lock(&ci->i_unsafe_lock); in handle_reply()
3282 list_add_tail(&req->r_unsafe_target_item, in handle_reply()
3283 &ci->i_unsafe_iops); in handle_reply()
3284 spin_unlock(&ci->i_unsafe_lock); in handle_reply()
3287 ceph_unreserve_caps(mdsc, &req->r_caps_reservation); in handle_reply()
3290 mutex_lock(&mdsc->mutex); in handle_reply()
3291 if (!test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_reply()
3293 req->r_err = err; in handle_reply()
3295 req->r_reply = ceph_msg_get(msg); in handle_reply()
3296 set_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags); in handle_reply()
3301 mutex_unlock(&mdsc->mutex); in handle_reply()
3303 mutex_unlock(&session->s_mutex); in handle_reply()
3308 ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency, in handle_reply()
3309 req->r_end_latency, err); in handle_reply()
3325 u64 tid = le64_to_cpu(msg->hdr.tid); in handle_forward()
3328 int err = -EINVAL; in handle_forward()
3329 void *p = msg->front.iov_base; in handle_forward()
3330 void *end = p + msg->front.iov_len; in handle_forward() local
3332 ceph_decode_need(&p, end, 2*sizeof(u32), bad); in handle_forward()
3336 mutex_lock(&mdsc->mutex); in handle_forward()
3339 dout("forward tid %llu to mds%d - req dne\n", tid, next_mds); in handle_forward()
3343 if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) { in handle_forward()
3346 } else if (fwd_seq <= req->r_num_fwd) { in handle_forward()
3347 dout("forward tid %llu to mds%d - old seq %d <= %d\n", in handle_forward()
3348 tid, next_mds, req->r_num_fwd, fwd_seq); in handle_forward()
3352 BUG_ON(req->r_err); in handle_forward()
3353 BUG_ON(test_bit(CEPH_MDS_R_GOT_RESULT, &req->r_req_flags)); in handle_forward()
3354 req->r_attempts = 0; in handle_forward()
3355 req->r_num_fwd = fwd_seq; in handle_forward()
3356 req->r_resend_mds = next_mds; in handle_forward()
3362 mutex_unlock(&mdsc->mutex); in handle_forward()
3369 static int __decode_session_metadata(void **p, void *end, in __decode_session_metadata() argument
3375 ceph_decode_32_safe(p, end, n, bad); in __decode_session_metadata()
3376 while (n-- > 0) { in __decode_session_metadata()
3378 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3379 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3382 ceph_decode_32_safe(p, end, len, bad); in __decode_session_metadata()
3383 ceph_decode_need(p, end, len, bad); in __decode_session_metadata()
3394 return -1; in __decode_session_metadata()
3403 struct ceph_mds_client *mdsc = session->s_mdsc; in handle_session()
3404 int mds = session->s_mds; in handle_session()
3405 int msg_version = le16_to_cpu(msg->hdr.version); in handle_session()
3406 void *p = msg->front.iov_base; in handle_session()
3407 void *end = p + msg->front.iov_len; in handle_session() local
3415 ceph_decode_need(&p, end, sizeof(*h), bad); in handle_session()
3419 op = le32_to_cpu(h->op); in handle_session()
3420 seq = le64_to_cpu(h->seq); in handle_session()
3425 if (__decode_session_metadata(&p, end, &blocklisted) < 0) in handle_session()
3428 ceph_decode_32_safe(&p, end, len, bad); in handle_session()
3430 ceph_decode_64_safe(&p, end, features, bad); in handle_session()
3431 p += len - sizeof(features); in handle_session()
3435 mutex_lock(&mdsc->mutex); in handle_session()
3441 session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; in handle_session()
3442 mutex_unlock(&mdsc->mutex); in handle_session()
3444 mutex_lock(&session->s_mutex); in handle_session()
3448 ceph_session_state_name(session->s_state), seq); in handle_session()
3450 if (session->s_state == CEPH_MDS_SESSION_HUNG) { in handle_session()
3451 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3452 pr_info("mds%d came back\n", session->s_mds); in handle_session()
3457 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3458 pr_info("mds%d reconnect success\n", session->s_mds); in handle_session()
3459 session->s_state = CEPH_MDS_SESSION_OPEN; in handle_session()
3460 session->s_features = features; in handle_session()
3462 if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features)) in handle_session()
3463 metric_schedule_delayed(&mdsc->metric); in handle_session()
3465 if (mdsc->stopping) in handle_session()
3470 if (session->s_renew_seq == seq) in handle_session()
3475 if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) in handle_session()
3476 pr_info("mds%d reconnect denied\n", session->s_mds); in handle_session()
3477 session->s_state = CEPH_MDS_SESSION_CLOSED; in handle_session()
3481 wake_up_all(&mdsc->session_close_wq); in handle_session()
3486 session->s_mds); in handle_session()
3487 spin_lock(&session->s_gen_ttl_lock); in handle_session()
3488 session->s_cap_gen++; in handle_session()
3489 session->s_cap_ttl = jiffies - 1; in handle_session()
3490 spin_unlock(&session->s_gen_ttl_lock); in handle_session()
3495 ceph_trim_caps(mdsc, session, le32_to_cpu(h->max_caps)); in handle_session()
3504 spin_lock(&session->s_cap_lock); in handle_session()
3505 session->s_readonly = true; in handle_session()
3506 spin_unlock(&session->s_cap_lock); in handle_session()
3511 WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); in handle_session()
3512 pr_info("mds%d rejected session\n", session->s_mds); in handle_session()
3513 session->s_state = CEPH_MDS_SESSION_REJECTED; in handle_session()
3517 mdsc->fsc->blocklisted = true; in handle_session()
3526 mutex_unlock(&session->s_mutex); in handle_session()
3528 mutex_lock(&mdsc->mutex); in handle_session()
3529 __wake_requests(mdsc, &session->s_waiting); in handle_session()
3532 mutex_unlock(&mdsc->mutex); in handle_session()
3540 (int)msg->front.iov_len); in handle_session()
3549 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps()
3552 ceph_put_cap_refs(ceph_inode(req->r_parent), dcaps); in ceph_mdsc_release_dir_caps()
3560 dcaps = xchg(&req->r_dir_caps, 0); in ceph_mdsc_release_dir_caps_no_check()
3563 ceph_put_cap_refs_no_check_caps(ceph_inode(req->r_parent), in ceph_mdsc_release_dir_caps_no_check()
3569 * called under session->mutex.
3577 dout("replay_unsafe_requests mds%d\n", session->s_mds); in replay_unsafe_requests()
3579 mutex_lock(&mdsc->mutex); in replay_unsafe_requests()
3580 list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) in replay_unsafe_requests()
3584 * also re-send old requests when MDS enters reconnect stage. So that MDS in replay_unsafe_requests()
3587 p = rb_first(&mdsc->request_tree); in replay_unsafe_requests()
3591 if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) in replay_unsafe_requests()
3593 if (req->r_attempts == 0) in replay_unsafe_requests()
3595 if (!req->r_session) in replay_unsafe_requests()
3597 if (req->r_session->s_mds != session->s_mds) in replay_unsafe_requests()
3604 mutex_unlock(&mdsc->mutex); in replay_unsafe_requests()
3613 int err = -ENOMEM; in send_reconnect_partial()
3615 if (!recon_state->allow_multi) in send_reconnect_partial()
3616 return -ENOSPC; in send_reconnect_partial()
3619 BUG_ON(!recon_state->nr_caps == !recon_state->nr_realms); in send_reconnect_partial()
3621 /* pre-allocate new pagelist */ in send_reconnect_partial()
3624 return -ENOMEM; in send_reconnect_partial()
3635 if (recon_state->nr_caps) { in send_reconnect_partial()
3637 err = ceph_pagelist_encode_32(recon_state->pagelist, 0); in send_reconnect_partial()
3647 err = ceph_pagelist_encode_8(recon_state->pagelist, 1); in send_reconnect_partial()
3651 page = list_first_entry(&recon_state->pagelist->head, struct page, lru); in send_reconnect_partial()
3653 if (recon_state->nr_caps) { in send_reconnect_partial()
3655 *addr = cpu_to_le32(recon_state->nr_caps); in send_reconnect_partial()
3658 *(addr + 1) = cpu_to_le32(recon_state->nr_realms); in send_reconnect_partial()
3662 reply->hdr.version = cpu_to_le16(5); in send_reconnect_partial()
3663 reply->hdr.compat_version = cpu_to_le16(4); in send_reconnect_partial()
3665 reply->hdr.data_len = cpu_to_le32(recon_state->pagelist->length); in send_reconnect_partial()
3666 ceph_msg_data_add_pagelist(reply, recon_state->pagelist); in send_reconnect_partial()
3668 ceph_con_send(&recon_state->session->s_con, reply); in send_reconnect_partial()
3669 ceph_pagelist_release(recon_state->pagelist); in send_reconnect_partial()
3671 recon_state->pagelist = _pagelist; in send_reconnect_partial()
3672 recon_state->nr_caps = 0; in send_reconnect_partial()
3673 recon_state->nr_realms = 0; in send_reconnect_partial()
3674 recon_state->msg_version = 5; in send_reconnect_partial()
3687 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3690 spin_lock(&inode->i_lock); in d_find_primary()
3691 if (hlist_empty(&inode->i_dentry)) in d_find_primary()
3694 if (S_ISDIR(inode->i_mode)) { in d_find_primary()
3695 alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias); in d_find_primary()
3701 hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { in d_find_primary()
3702 spin_lock(&alias->d_lock); in d_find_primary()
3704 (ceph_dentry(alias)->flags & CEPH_DENTRY_PRIMARY_LINK)) { in d_find_primary()
3707 spin_unlock(&alias->d_lock); in d_find_primary()
3712 spin_unlock(&inode->i_lock); in d_find_primary()
3726 struct ceph_inode_info *ci = cap->ci; in reconnect_caps_cb()
3728 struct ceph_pagelist *pagelist = recon_state->pagelist; in reconnect_caps_cb()
3736 inode, ceph_vinop(inode), cap, cap->cap_id, in reconnect_caps_cb()
3737 ceph_cap_string(cap->issued)); in reconnect_caps_cb()
3743 recon_state->msg_version >= 2); in reconnect_caps_cb()
3754 spin_lock(&ci->i_ceph_lock); in reconnect_caps_cb()
3755 cap->seq = 0; /* reset cap seq */ in reconnect_caps_cb()
3756 cap->issue_seq = 0; /* and issue_seq */ in reconnect_caps_cb()
3757 cap->mseq = 0; /* and migrate_seq */ in reconnect_caps_cb()
3758 cap->cap_gen = cap->session->s_cap_gen; in reconnect_caps_cb()
3761 if (S_ISDIR(inode->i_mode)) { in reconnect_caps_cb()
3762 if (cap->issued & CEPH_CAP_DIR_CREATE) { in reconnect_caps_cb()
3763 ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); in reconnect_caps_cb()
3764 memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout)); in reconnect_caps_cb()
3766 cap->issued &= ~CEPH_CAP_ANY_DIR_OPS; in reconnect_caps_cb()
3769 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3770 rec.v2.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3772 rec.v2.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3773 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3776 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1); in reconnect_caps_cb()
3778 rec.v1.cap_id = cpu_to_le64(cap->cap_id); in reconnect_caps_cb()
3780 rec.v1.issued = cpu_to_le32(cap->issued); in reconnect_caps_cb()
3781 rec.v1.size = cpu_to_le64(inode->i_size); in reconnect_caps_cb()
3782 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime); in reconnect_caps_cb()
3783 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime); in reconnect_caps_cb()
3784 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); in reconnect_caps_cb()
3788 if (list_empty(&ci->i_cap_snaps)) { in reconnect_caps_cb()
3789 snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0; in reconnect_caps_cb()
3792 list_first_entry(&ci->i_cap_snaps, in reconnect_caps_cb()
3794 snap_follows = capsnap->follows; in reconnect_caps_cb()
3796 spin_unlock(&ci->i_ceph_lock); in reconnect_caps_cb()
3798 if (recon_state->msg_version >= 2) { in reconnect_caps_cb()
3816 err = -ENOMEM; in reconnect_caps_cb()
3825 if (err == -ENOSPC) in reconnect_caps_cb()
3834 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3854 if (pagelist->length + total_len > RECONNECT_MAX_SIZE) { in reconnect_caps_cb()
3858 pagelist = recon_state->pagelist; in reconnect_caps_cb()
3866 if (recon_state->msg_version >= 3) { in reconnect_caps_cb()
3894 recon_state->nr_caps++; in reconnect_caps_cb()
3902 struct ceph_pagelist *pagelist = recon_state->pagelist; in encode_snap_realms()
3905 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3906 err = ceph_pagelist_encode_32(pagelist, mdsc->num_snap_realms); in encode_snap_realms()
3916 for (p = rb_first(&mdsc->snap_realms); p; p = rb_next(p)) { in encode_snap_realms()
3921 if (recon_state->msg_version >= 4) { in encode_snap_realms()
3925 if (pagelist->length + need > RECONNECT_MAX_SIZE) { in encode_snap_realms()
3929 pagelist = recon_state->pagelist; in encode_snap_realms()
3942 realm->ino, realm->seq, realm->parent_ino); in encode_snap_realms()
3943 sr_rec.ino = cpu_to_le64(realm->ino); in encode_snap_realms()
3944 sr_rec.seq = cpu_to_le64(realm->seq); in encode_snap_realms()
3945 sr_rec.parent = cpu_to_le64(realm->parent_ino); in encode_snap_realms()
3951 recon_state->nr_realms++; in encode_snap_realms()
3972 int mds = session->s_mds; in send_mds_reconnect()
3973 int err = -ENOMEM; in send_mds_reconnect()
3989 xa_destroy(&session->s_delegated_inos); in send_mds_reconnect()
3991 mutex_lock(&session->s_mutex); in send_mds_reconnect()
3992 session->s_state = CEPH_MDS_SESSION_RECONNECTING; in send_mds_reconnect()
3993 session->s_seq = 0; in send_mds_reconnect()
3996 ceph_session_state_name(session->s_state)); in send_mds_reconnect()
3998 spin_lock(&session->s_gen_ttl_lock); in send_mds_reconnect()
3999 session->s_cap_gen++; in send_mds_reconnect()
4000 spin_unlock(&session->s_gen_ttl_lock); in send_mds_reconnect()
4002 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
4004 session->s_readonly = 0; in send_mds_reconnect()
4010 session->s_cap_reconnect = 1; in send_mds_reconnect()
4013 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4017 if (mdsc->fsc->sb->s_root) in send_mds_reconnect()
4018 shrink_dcache_parent(mdsc->fsc->sb->s_root); in send_mds_reconnect()
4020 ceph_con_close(&session->s_con); in send_mds_reconnect()
4021 ceph_con_open(&session->s_con, in send_mds_reconnect()
4023 ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); in send_mds_reconnect()
4030 down_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4037 if (test_bit(CEPHFS_FEATURE_MULTI_RECONNECT, &session->s_features)) { in send_mds_reconnect()
4040 } else if (session->s_con.peer_features & CEPH_FEATURE_MDSENC) { in send_mds_reconnect()
4048 spin_lock(&session->s_cap_lock); in send_mds_reconnect()
4049 session->s_cap_reconnect = 0; in send_mds_reconnect()
4050 spin_unlock(&session->s_cap_lock); in send_mds_reconnect()
4056 if (mdsc->num_snap_realms) { in send_mds_reconnect()
4058 recon_state.pagelist->length + in send_mds_reconnect()
4059 mdsc->num_snap_realms * in send_mds_reconnect()
4065 total_len += mdsc->num_snap_realms * in send_mds_reconnect()
4070 err = -ENOSPC; in send_mds_reconnect()
4094 list_first_entry(&recon_state.pagelist->head, in send_mds_reconnect()
4098 WARN_ON(recon_state.nr_realms != mdsc->num_snap_realms); in send_mds_reconnect()
4106 reply->hdr.version = cpu_to_le16(recon_state.msg_version); in send_mds_reconnect()
4108 reply->hdr.compat_version = cpu_to_le16(4); in send_mds_reconnect()
4110 reply->hdr.data_len = cpu_to_le32(recon_state.pagelist->length); in send_mds_reconnect()
4113 ceph_con_send(&session->s_con, reply); in send_mds_reconnect()
4115 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4117 mutex_lock(&mdsc->mutex); in send_mds_reconnect()
4118 __wake_requests(mdsc, &session->s_waiting); in send_mds_reconnect()
4119 mutex_unlock(&mdsc->mutex); in send_mds_reconnect()
4121 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4127 up_read(&mdsc->snap_rwsem); in send_mds_reconnect()
4128 mutex_unlock(&session->s_mutex); in send_mds_reconnect()
4141 * called under mdsc->mutex.
4152 newmap->m_epoch, oldmap->m_epoch); in check_new_map()
4154 for (i = 0; i < oldmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4155 if (!mdsc->sessions[i]) in check_new_map()
4157 s = mdsc->sessions[i]; in check_new_map()
4161 dout("check_new_map mds%d state %s%s -> %s%s (session %s)\n", in check_new_map()
4166 ceph_session_state_name(s->s_state)); in check_new_map()
4168 if (i >= newmap->possible_max_rank) { in check_new_map()
4172 __wake_requests(mdsc, &s->s_waiting); in check_new_map()
4173 mutex_unlock(&mdsc->mutex); in check_new_map()
4175 mutex_lock(&s->s_mutex); in check_new_map()
4178 mutex_unlock(&s->s_mutex); in check_new_map()
4182 mutex_lock(&mdsc->mutex); in check_new_map()
4191 mutex_unlock(&mdsc->mutex); in check_new_map()
4192 mutex_lock(&s->s_mutex); in check_new_map()
4193 mutex_lock(&mdsc->mutex); in check_new_map()
4194 ceph_con_close(&s->s_con); in check_new_map()
4195 mutex_unlock(&s->s_mutex); in check_new_map()
4196 s->s_state = CEPH_MDS_SESSION_RESTARTING; in check_new_map()
4204 if (s->s_state == CEPH_MDS_SESSION_RESTARTING && in check_new_map()
4206 mutex_unlock(&mdsc->mutex); in check_new_map()
4208 mutex_lock(&mdsc->mutex); in check_new_map()
4218 pr_info("mds%d recovery completed\n", s->s_mds); in check_new_map()
4220 mutex_unlock(&mdsc->mutex); in check_new_map()
4221 mutex_lock(&s->s_mutex); in check_new_map()
4222 mutex_lock(&mdsc->mutex); in check_new_map()
4224 mutex_unlock(&s->s_mutex); in check_new_map()
4229 for (i = 0; i < newmap->possible_max_rank && i < mdsc->max_sessions; i++) { in check_new_map()
4230 s = mdsc->sessions[i]; in check_new_map()
4235 if (s->s_state == CEPH_MDS_SESSION_OPEN || in check_new_map()
4236 s->s_state == CEPH_MDS_SESSION_HUNG || in check_new_map()
4237 s->s_state == CEPH_MDS_SESSION_CLOSING) { in check_new_map()
4252 * caller must hold session s_mutex, dentry->d_lock
4258 ceph_put_mds_session(di->lease_session); in __ceph_mdsc_drop_dentry_lease()
4259 di->lease_session = NULL; in __ceph_mdsc_drop_dentry_lease()
4266 struct super_block *sb = mdsc->fsc->sb; in handle_lease()
4270 int mds = session->s_mds; in handle_lease()
4271 struct ceph_mds_lease *h = msg->front.iov_base; in handle_lease()
4280 if (msg->front.iov_len < sizeof(*h) + sizeof(u32)) in handle_lease()
4282 vino.ino = le64_to_cpu(h->ino); in handle_lease()
4284 seq = le32_to_cpu(h->seq); in handle_lease()
4286 if (msg->front.iov_len < sizeof(*h) + sizeof(u32) + dname.len) in handle_lease()
4293 ceph_lease_op_name(h->action), vino.ino, inode, in handle_lease()
4296 mutex_lock(&session->s_mutex); in handle_lease()
4317 spin_lock(&dentry->d_lock); in handle_lease()
4319 switch (h->action) { in handle_lease()
4321 if (di->lease_session == session) { in handle_lease()
4322 if (ceph_seq_cmp(di->lease_seq, seq) > 0) in handle_lease()
4323 h->seq = cpu_to_le32(di->lease_seq); in handle_lease()
4330 if (di->lease_session == session && in handle_lease()
4331 di->lease_gen == session->s_cap_gen && in handle_lease()
4332 di->lease_renew_from && in handle_lease()
4333 di->lease_renew_after == 0) { in handle_lease()
4335 msecs_to_jiffies(le32_to_cpu(h->duration_ms)); in handle_lease()
4337 di->lease_seq = seq; in handle_lease()
4338 di->time = di->lease_renew_from + duration; in handle_lease()
4339 di->lease_renew_after = di->lease_renew_from + in handle_lease()
4341 di->lease_renew_from = 0; in handle_lease()
4345 spin_unlock(&dentry->d_lock); in handle_lease()
4353 h->action = CEPH_MDS_LEASE_REVOKE_ACK; in handle_lease()
4355 ceph_con_send(&session->s_con, msg); in handle_lease()
4358 mutex_unlock(&session->s_mutex); in handle_lease()
4378 dentry, ceph_lease_op_name(action), session->s_mds); in ceph_mdsc_lease_send_msg()
4383 lease = msg->front.iov_base; in ceph_mdsc_lease_send_msg()
4384 lease->action = action; in ceph_mdsc_lease_send_msg()
4385 lease->seq = cpu_to_le32(seq); in ceph_mdsc_lease_send_msg()
4387 spin_lock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4388 dir = d_inode(dentry->d_parent); in ceph_mdsc_lease_send_msg()
4389 lease->ino = cpu_to_le64(ceph_ino(dir)); in ceph_mdsc_lease_send_msg()
4390 lease->first = lease->last = cpu_to_le64(ceph_snap(dir)); in ceph_mdsc_lease_send_msg()
4392 put_unaligned_le32(dentry->d_name.len, lease + 1); in ceph_mdsc_lease_send_msg()
4394 dentry->d_name.name, dentry->d_name.len); in ceph_mdsc_lease_send_msg()
4395 spin_unlock(&dentry->d_lock); in ceph_mdsc_lease_send_msg()
4401 msg->more_to_follow = (action == CEPH_MDS_LEASE_RELEASE); in ceph_mdsc_lease_send_msg()
4403 ceph_con_send(&session->s_con, msg); in ceph_mdsc_lease_send_msg()
4411 mutex_lock(&s->s_mutex); in lock_unlock_session()
4412 mutex_unlock(&s->s_mutex); in lock_unlock_session()
4417 struct ceph_fs_client *fsc = mdsc->fsc; in maybe_recover_session()
4422 if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED) in maybe_recover_session()
4425 if (!READ_ONCE(fsc->blocklisted)) in maybe_recover_session()
4428 if (fsc->last_auto_reconnect && in maybe_recover_session()
4429 time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30)) in maybe_recover_session()
4433 fsc->last_auto_reconnect = jiffies; in maybe_recover_session()
4434 ceph_force_reconnect(fsc->sb); in maybe_recover_session()
4439 switch (s->s_state) { in check_session_state()
4441 if (s->s_ttl && time_after(jiffies, s->s_ttl)) { in check_session_state()
4442 s->s_state = CEPH_MDS_SESSION_HUNG; in check_session_state()
4443 pr_info("mds%d hung\n", s->s_mds); in check_session_state()
4448 WARN_ON_ONCE(s->s_ttl); in check_session_state()
4466 lockdep_assert_held(&s->s_mutex); in inc_session_sequence()
4468 s->s_seq++; in inc_session_sequence()
4470 if (s->s_state == CEPH_MDS_SESSION_CLOSING) { in inc_session_sequence()
4473 dout("resending session close request for mds%d\n", s->s_mds); in inc_session_sequence()
4477 s->s_mds, ret); in inc_session_sequence()
4482 * delayed work -- periodically trim expired leases, renew caps with mds. If
4493 schedule_delayed_work(&mdsc->delayed_work, in schedule_delayed()
4508 if (mdsc->stopping) in delayed_work()
4511 mutex_lock(&mdsc->mutex); in delayed_work()
4512 renew_interval = mdsc->mdsmap->m_session_timeout >> 2; in delayed_work()
4514 mdsc->last_renew_caps); in delayed_work()
4516 mdsc->last_renew_caps = jiffies; in delayed_work()
4518 for (i = 0; i < mdsc->max_sessions; i++) { in delayed_work()
4527 mutex_unlock(&mdsc->mutex); in delayed_work()
4529 mutex_lock(&s->s_mutex); in delayed_work()
4533 ceph_con_keepalive(&s->s_con); in delayed_work()
4534 if (s->s_state == CEPH_MDS_SESSION_OPEN || in delayed_work()
4535 s->s_state == CEPH_MDS_SESSION_HUNG) in delayed_work()
4537 mutex_unlock(&s->s_mutex); in delayed_work()
4540 mutex_lock(&mdsc->mutex); in delayed_work()
4542 mutex_unlock(&mdsc->mutex); in delayed_work()
4563 return -ENOMEM; in ceph_mdsc_init()
4564 mdsc->fsc = fsc; in ceph_mdsc_init()
4565 mutex_init(&mdsc->mutex); in ceph_mdsc_init()
4566 mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); in ceph_mdsc_init()
4567 if (!mdsc->mdsmap) { in ceph_mdsc_init()
4568 err = -ENOMEM; in ceph_mdsc_init()
4572 init_completion(&mdsc->safe_umount_waiters); in ceph_mdsc_init()
4573 init_waitqueue_head(&mdsc->session_close_wq); in ceph_mdsc_init()
4574 INIT_LIST_HEAD(&mdsc->waiting_for_map); in ceph_mdsc_init()
4575 mdsc->sessions = NULL; in ceph_mdsc_init()
4576 atomic_set(&mdsc->num_sessions, 0); in ceph_mdsc_init()
4577 mdsc->max_sessions = 0; in ceph_mdsc_init()
4578 mdsc->stopping = 0; in ceph_mdsc_init()
4579 atomic64_set(&mdsc->quotarealms_count, 0); in ceph_mdsc_init()
4580 mdsc->quotarealms_inodes = RB_ROOT; in ceph_mdsc_init()
4581 mutex_init(&mdsc->quotarealms_inodes_mutex); in ceph_mdsc_init()
4582 mdsc->last_snap_seq = 0; in ceph_mdsc_init()
4583 init_rwsem(&mdsc->snap_rwsem); in ceph_mdsc_init()
4584 mdsc->snap_realms = RB_ROOT; in ceph_mdsc_init()
4585 INIT_LIST_HEAD(&mdsc->snap_empty); in ceph_mdsc_init()
4586 mdsc->num_snap_realms = 0; in ceph_mdsc_init()
4587 spin_lock_init(&mdsc->snap_empty_lock); in ceph_mdsc_init()
4588 mdsc->last_tid = 0; in ceph_mdsc_init()
4589 mdsc->oldest_tid = 0; in ceph_mdsc_init()
4590 mdsc->request_tree = RB_ROOT; in ceph_mdsc_init()
4591 INIT_DELAYED_WORK(&mdsc->delayed_work, delayed_work); in ceph_mdsc_init()
4592 mdsc->last_renew_caps = jiffies; in ceph_mdsc_init()
4593 INIT_LIST_HEAD(&mdsc->cap_delay_list); in ceph_mdsc_init()
4594 INIT_LIST_HEAD(&mdsc->cap_wait_list); in ceph_mdsc_init()
4595 spin_lock_init(&mdsc->cap_delay_lock); in ceph_mdsc_init()
4596 INIT_LIST_HEAD(&mdsc->snap_flush_list); in ceph_mdsc_init()
4597 spin_lock_init(&mdsc->snap_flush_lock); in ceph_mdsc_init()
4598 mdsc->last_cap_flush_tid = 1; in ceph_mdsc_init()
4599 INIT_LIST_HEAD(&mdsc->cap_flush_list); in ceph_mdsc_init()
4600 INIT_LIST_HEAD(&mdsc->cap_dirty_migrating); in ceph_mdsc_init()
4601 mdsc->num_cap_flushing = 0; in ceph_mdsc_init()
4602 spin_lock_init(&mdsc->cap_dirty_lock); in ceph_mdsc_init()
4603 init_waitqueue_head(&mdsc->cap_flushing_wq); in ceph_mdsc_init()
4604 INIT_WORK(&mdsc->cap_reclaim_work, ceph_cap_reclaim_work); in ceph_mdsc_init()
4605 atomic_set(&mdsc->cap_reclaim_pending, 0); in ceph_mdsc_init()
4606 err = ceph_metric_init(&mdsc->metric); in ceph_mdsc_init()
4610 spin_lock_init(&mdsc->dentry_list_lock); in ceph_mdsc_init()
4611 INIT_LIST_HEAD(&mdsc->dentry_leases); in ceph_mdsc_init()
4612 INIT_LIST_HEAD(&mdsc->dentry_dir_leases); in ceph_mdsc_init()
4615 ceph_adjust_caps_max_min(mdsc, fsc->mount_options); in ceph_mdsc_init()
4617 spin_lock_init(&mdsc->snapid_map_lock); in ceph_mdsc_init()
4618 mdsc->snapid_map_tree = RB_ROOT; in ceph_mdsc_init()
4619 INIT_LIST_HEAD(&mdsc->snapid_map_lru); in ceph_mdsc_init()
4621 init_rwsem(&mdsc->pool_perm_rwsem); in ceph_mdsc_init()
4622 mdsc->pool_perm_tree = RB_ROOT; in ceph_mdsc_init()
4624 strscpy(mdsc->nodename, utsname()->nodename, in ceph_mdsc_init()
4625 sizeof(mdsc->nodename)); in ceph_mdsc_init()
4627 fsc->mdsc = mdsc; in ceph_mdsc_init()
4631 kfree(mdsc->mdsmap); in ceph_mdsc_init()
4643 struct ceph_options *opts = mdsc->fsc->client->options; in wait_requests()
4646 mutex_lock(&mdsc->mutex); in wait_requests()
4648 mutex_unlock(&mdsc->mutex); in wait_requests()
4651 wait_for_completion_timeout(&mdsc->safe_umount_waiters, in wait_requests()
4652 ceph_timeout_jiffies(opts->mount_timeout)); in wait_requests()
4655 mutex_lock(&mdsc->mutex); in wait_requests()
4658 req->r_tid); in wait_requests()
4659 list_del_init(&req->r_wait); in wait_requests()
4663 mutex_unlock(&mdsc->mutex); in wait_requests()
4672 * Pre-luminous MDS crashes when it sees an unknown session request in send_flush_mdlog()
4674 if (!CEPH_HAVE_FEATURE(s->s_con.peer_features, SERVER_LUMINOUS)) in send_flush_mdlog()
4677 mutex_lock(&s->s_mutex); in send_flush_mdlog()
4678 dout("request mdlog flush to mds%d (%s)s seq %lld\n", s->s_mds, in send_flush_mdlog()
4679 ceph_session_state_name(s->s_state), s->s_seq); in send_flush_mdlog()
4681 s->s_seq); in send_flush_mdlog()
4684 s->s_mds, ceph_session_state_name(s->s_state), s->s_seq); in send_flush_mdlog()
4686 ceph_con_send(&s->s_con, msg); in send_flush_mdlog()
4688 mutex_unlock(&s->s_mutex); in send_flush_mdlog()
4698 mdsc->stopping = 1; in ceph_mdsc_pre_umount()
4722 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4726 while (req && req->r_tid <= want_tid) { in wait_unsafe_requests()
4728 n = rb_next(&req->r_node); in wait_unsafe_requests()
4733 if (req->r_op != CEPH_MDS_OP_SETFILELOCK && in wait_unsafe_requests()
4734 (req->r_op & CEPH_MDS_OP_WRITE)) { in wait_unsafe_requests()
4739 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4741 req->r_tid, want_tid); in wait_unsafe_requests()
4742 wait_for_completion(&req->r_safe_completion); in wait_unsafe_requests()
4743 mutex_lock(&mdsc->mutex); in wait_unsafe_requests()
4747 if (RB_EMPTY_NODE(&nextreq->r_node)) { in wait_unsafe_requests()
4756 mutex_unlock(&mdsc->mutex); in wait_unsafe_requests()
4764 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in ceph_mdsc_sync()
4768 mutex_lock(&mdsc->mutex); in ceph_mdsc_sync()
4769 want_tid = mdsc->last_tid; in ceph_mdsc_sync()
4770 mutex_unlock(&mdsc->mutex); in ceph_mdsc_sync()
4773 spin_lock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4774 want_flush = mdsc->last_cap_flush_tid; in ceph_mdsc_sync()
4775 if (!list_empty(&mdsc->cap_flush_list)) { in ceph_mdsc_sync()
4777 list_last_entry(&mdsc->cap_flush_list, in ceph_mdsc_sync()
4779 cf->wake = true; in ceph_mdsc_sync()
4781 spin_unlock(&mdsc->cap_dirty_lock); in ceph_mdsc_sync()
4795 if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) in done_closing_sessions()
4797 return atomic_read(&mdsc->num_sessions) <= skipped; in done_closing_sessions()
4805 struct ceph_options *opts = mdsc->fsc->client->options; in ceph_mdsc_close_sessions()
4813 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4814 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4818 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4819 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4822 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4824 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4826 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4829 wait_event_timeout(mdsc->session_close_wq, in ceph_mdsc_close_sessions()
4831 ceph_timeout_jiffies(opts->mount_timeout)); in ceph_mdsc_close_sessions()
4834 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4835 for (i = 0; i < mdsc->max_sessions; i++) { in ceph_mdsc_close_sessions()
4836 if (mdsc->sessions[i]) { in ceph_mdsc_close_sessions()
4837 session = ceph_get_mds_session(mdsc->sessions[i]); in ceph_mdsc_close_sessions()
4839 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4840 mutex_lock(&session->s_mutex); in ceph_mdsc_close_sessions()
4842 mutex_unlock(&session->s_mutex); in ceph_mdsc_close_sessions()
4844 mutex_lock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4847 WARN_ON(!list_empty(&mdsc->cap_delay_list)); in ceph_mdsc_close_sessions()
4848 mutex_unlock(&mdsc->mutex); in ceph_mdsc_close_sessions()
4853 cancel_work_sync(&mdsc->cap_reclaim_work); in ceph_mdsc_close_sessions()
4854 cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */ in ceph_mdsc_close_sessions()
4866 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4867 for (mds = 0; mds < mdsc->max_sessions; mds++) { in ceph_mdsc_force_umount()
4872 if (session->s_state == CEPH_MDS_SESSION_REJECTED) in ceph_mdsc_force_umount()
4874 __wake_requests(mdsc, &session->s_waiting); in ceph_mdsc_force_umount()
4875 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4877 mutex_lock(&session->s_mutex); in ceph_mdsc_force_umount()
4879 if (session->s_state == CEPH_MDS_SESSION_CLOSING) { in ceph_mdsc_force_umount()
4883 mutex_unlock(&session->s_mutex); in ceph_mdsc_force_umount()
4886 mutex_lock(&mdsc->mutex); in ceph_mdsc_force_umount()
4889 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_force_umount()
4890 mutex_unlock(&mdsc->mutex); in ceph_mdsc_force_umount()
4902 * delayed work will re-arm itself again after that. in ceph_mdsc_stop()
4904 flush_delayed_work(&mdsc->delayed_work); in ceph_mdsc_stop()
4906 if (mdsc->mdsmap) in ceph_mdsc_stop()
4907 ceph_mdsmap_destroy(mdsc->mdsmap); in ceph_mdsc_stop()
4908 kfree(mdsc->sessions); in ceph_mdsc_stop()
4915 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_mdsc_destroy()
4926 ceph_metric_destroy(&mdsc->metric); in ceph_mdsc_destroy()
4928 fsc->mdsc = NULL; in ceph_mdsc_destroy()
4935 struct ceph_fs_client *fsc = mdsc->fsc; in ceph_mdsc_handle_fsmap()
4936 const char *mds_namespace = fsc->mount_options->mds_namespace; in ceph_mdsc_handle_fsmap()
4937 void *p = msg->front.iov_base; in ceph_mdsc_handle_fsmap()
4938 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_fsmap() local
4942 u32 mount_fscid = (u32)-1; in ceph_mdsc_handle_fsmap()
4944 int err = -EINVAL; in ceph_mdsc_handle_fsmap()
4946 ceph_decode_need(&p, end, sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4951 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4956 ceph_decode_need(&p, end, sizeof(u32) * 3, bad); in ceph_mdsc_handle_fsmap()
4960 while (num_fs-- > 0) { in ceph_mdsc_handle_fsmap()
4966 ceph_decode_need(&p, end, 2 + sizeof(u32), bad); in ceph_mdsc_handle_fsmap()
4970 ceph_decode_need(&p, end, info_len, bad); in ceph_mdsc_handle_fsmap()
4988 ceph_monc_got_map(&fsc->client->monc, CEPH_SUB_FSMAP, epoch); in ceph_mdsc_handle_fsmap()
4989 if (mount_fscid != (u32)-1) { in ceph_mdsc_handle_fsmap()
4990 fsc->client->monc.fs_cluster_id = mount_fscid; in ceph_mdsc_handle_fsmap()
4991 ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_fsmap()
4993 ceph_monc_renew_subs(&fsc->client->monc); in ceph_mdsc_handle_fsmap()
4995 err = -ENOENT; in ceph_mdsc_handle_fsmap()
5003 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
5004 mdsc->mdsmap_err = err; in ceph_mdsc_handle_fsmap()
5005 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_fsmap()
5006 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_fsmap()
5016 void *p = msg->front.iov_base; in ceph_mdsc_handle_mdsmap()
5017 void *end = p + msg->front.iov_len; in ceph_mdsc_handle_mdsmap() local
5020 int err = -EINVAL; in ceph_mdsc_handle_mdsmap()
5022 ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad); in ceph_mdsc_handle_mdsmap()
5024 if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0) in ceph_mdsc_handle_mdsmap()
5031 mutex_lock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5032 if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) { in ceph_mdsc_handle_mdsmap()
5034 epoch, mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
5035 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5039 newmap = ceph_mdsmap_decode(&p, end); in ceph_mdsc_handle_mdsmap()
5046 if (mdsc->mdsmap) { in ceph_mdsc_handle_mdsmap()
5047 oldmap = mdsc->mdsmap; in ceph_mdsc_handle_mdsmap()
5048 mdsc->mdsmap = newmap; in ceph_mdsc_handle_mdsmap()
5052 mdsc->mdsmap = newmap; /* first mds map */ in ceph_mdsc_handle_mdsmap()
5054 mdsc->fsc->max_file_size = min((loff_t)mdsc->mdsmap->m_max_file_size, in ceph_mdsc_handle_mdsmap()
5057 __wake_requests(mdsc, &mdsc->waiting_for_map); in ceph_mdsc_handle_mdsmap()
5058 ceph_monc_got_map(&mdsc->fsc->client->monc, CEPH_SUB_MDSMAP, in ceph_mdsc_handle_mdsmap()
5059 mdsc->mdsmap->m_epoch); in ceph_mdsc_handle_mdsmap()
5061 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5066 mutex_unlock(&mdsc->mutex); in ceph_mdsc_handle_mdsmap()
5074 struct ceph_mds_session *s = con->private; in con_get()
5083 struct ceph_mds_session *s = con->private; in con_put()
5094 struct ceph_mds_session *s = con->private; in peer_reset()
5095 struct ceph_mds_client *mdsc = s->s_mdsc; in peer_reset()
5097 pr_warn("mds%d closed our session\n", s->s_mds); in peer_reset()
5103 struct ceph_mds_session *s = con->private; in dispatch()
5104 struct ceph_mds_client *mdsc = s->s_mdsc; in dispatch()
5105 int type = le16_to_cpu(msg->hdr.type); in dispatch()
5107 mutex_lock(&mdsc->mutex); in dispatch()
5109 mutex_unlock(&mdsc->mutex); in dispatch()
5112 mutex_unlock(&mdsc->mutex); in dispatch()
5162 struct ceph_mds_session *s = con->private; in get_authorizer()
5163 struct ceph_mds_client *mdsc = s->s_mdsc; in get_authorizer()
5164 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in get_authorizer()
5165 struct ceph_auth_handshake *auth = &s->s_auth; in get_authorizer()
5167 if (force_new && auth->authorizer) { in get_authorizer()
5168 ceph_auth_destroy_authorizer(auth->authorizer); in get_authorizer()
5169 auth->authorizer = NULL; in get_authorizer()
5171 if (!auth->authorizer) { in get_authorizer()
5182 *proto = ac->protocol; in get_authorizer()
5190 struct ceph_mds_session *s = con->private; in add_authorizer_challenge()
5191 struct ceph_mds_client *mdsc = s->s_mdsc; in add_authorizer_challenge()
5192 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in add_authorizer_challenge()
5194 return ceph_auth_add_authorizer_challenge(ac, s->s_auth.authorizer, in add_authorizer_challenge()
5200 struct ceph_mds_session *s = con->private; in verify_authorizer_reply()
5201 struct ceph_mds_client *mdsc = s->s_mdsc; in verify_authorizer_reply()
5202 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in verify_authorizer_reply()
5204 return ceph_auth_verify_authorizer_reply(ac, s->s_auth.authorizer); in verify_authorizer_reply()
5209 struct ceph_mds_session *s = con->private; in invalidate_authorizer()
5210 struct ceph_mds_client *mdsc = s->s_mdsc; in invalidate_authorizer()
5211 struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; in invalidate_authorizer()
5215 return ceph_monc_validate_auth(&mdsc->fsc->client->monc); in invalidate_authorizer()
5222 int type = (int) le16_to_cpu(hdr->type); in mds_alloc_msg()
5223 int front_len = (int) le32_to_cpu(hdr->front_len); in mds_alloc_msg()
5225 if (con->in_msg) in mds_alloc_msg()
5226 return con->in_msg; in mds_alloc_msg()
5241 struct ceph_mds_session *s = msg->con->private; in mds_sign_message()
5242 struct ceph_auth_handshake *auth = &s->s_auth; in mds_sign_message()
5249 struct ceph_mds_session *s = msg->con->private; in mds_check_message_signature()
5250 struct ceph_auth_handshake *auth = &s->s_auth; in mds_check_message_signature()