Lines Matching refs:mdsc
66 void ceph_get_snap_realm(struct ceph_mds_client *mdsc, in ceph_get_snap_realm() argument
69 lockdep_assert_held(&mdsc->snap_rwsem); in ceph_get_snap_realm()
80 spin_lock(&mdsc->snap_empty_lock); in ceph_get_snap_realm()
83 spin_unlock(&mdsc->snap_empty_lock); in ceph_get_snap_realm()
114 struct ceph_mds_client *mdsc, in ceph_create_snap_realm() argument
119 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_create_snap_realm()
138 __insert_snap_realm(&mdsc->snap_realms, realm); in ceph_create_snap_realm()
139 mdsc->num_snap_realms++; in ceph_create_snap_realm()
141 doutc(mdsc->fsc->client, "%llx %p\n", realm->ino, realm); in ceph_create_snap_realm()
150 static struct ceph_snap_realm *__lookup_snap_realm(struct ceph_mds_client *mdsc, in __lookup_snap_realm() argument
153 struct ceph_client *cl = mdsc->fsc->client; in __lookup_snap_realm()
154 struct rb_node *n = mdsc->snap_realms.rb_node; in __lookup_snap_realm()
157 lockdep_assert_held(&mdsc->snap_rwsem); in __lookup_snap_realm()
173 struct ceph_snap_realm *ceph_lookup_snap_realm(struct ceph_mds_client *mdsc, in ceph_lookup_snap_realm() argument
177 r = __lookup_snap_realm(mdsc, ino); in ceph_lookup_snap_realm()
179 ceph_get_snap_realm(mdsc, r); in ceph_lookup_snap_realm()
183 static void __put_snap_realm(struct ceph_mds_client *mdsc,
189 static void __destroy_snap_realm(struct ceph_mds_client *mdsc, in __destroy_snap_realm() argument
192 struct ceph_client *cl = mdsc->fsc->client; in __destroy_snap_realm()
193 lockdep_assert_held_write(&mdsc->snap_rwsem); in __destroy_snap_realm()
197 rb_erase(&realm->node, &mdsc->snap_realms); in __destroy_snap_realm()
198 mdsc->num_snap_realms--; in __destroy_snap_realm()
202 __put_snap_realm(mdsc, realm->parent); in __destroy_snap_realm()
214 static void __put_snap_realm(struct ceph_mds_client *mdsc, in __put_snap_realm() argument
217 lockdep_assert_held_write(&mdsc->snap_rwsem); in __put_snap_realm()
224 __destroy_snap_realm(mdsc, realm); in __put_snap_realm()
230 void ceph_put_snap_realm(struct ceph_mds_client *mdsc, in ceph_put_snap_realm() argument
233 if (!atomic_dec_and_lock(&realm->nref, &mdsc->snap_empty_lock)) in ceph_put_snap_realm()
236 if (down_write_trylock(&mdsc->snap_rwsem)) { in ceph_put_snap_realm()
237 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
238 __destroy_snap_realm(mdsc, realm); in ceph_put_snap_realm()
239 up_write(&mdsc->snap_rwsem); in ceph_put_snap_realm()
241 list_add(&realm->empty_item, &mdsc->snap_empty); in ceph_put_snap_realm()
242 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
253 static void __cleanup_empty_realms(struct ceph_mds_client *mdsc) in __cleanup_empty_realms() argument
257 lockdep_assert_held_write(&mdsc->snap_rwsem); in __cleanup_empty_realms()
259 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
260 while (!list_empty(&mdsc->snap_empty)) { in __cleanup_empty_realms()
261 realm = list_first_entry(&mdsc->snap_empty, in __cleanup_empty_realms()
264 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
265 __destroy_snap_realm(mdsc, realm); in __cleanup_empty_realms()
266 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
268 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
271 void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc) in ceph_cleanup_global_and_empty_realms() argument
275 down_write(&mdsc->snap_rwsem); in ceph_cleanup_global_and_empty_realms()
276 global_realm = __lookup_snap_realm(mdsc, CEPH_INO_GLOBAL_SNAPREALM); in ceph_cleanup_global_and_empty_realms()
278 ceph_put_snap_realm(mdsc, global_realm); in ceph_cleanup_global_and_empty_realms()
279 __cleanup_empty_realms(mdsc); in ceph_cleanup_global_and_empty_realms()
280 up_write(&mdsc->snap_rwsem); in ceph_cleanup_global_and_empty_realms()
291 static int adjust_snap_realm_parent(struct ceph_mds_client *mdsc, in adjust_snap_realm_parent() argument
295 struct ceph_client *cl = mdsc->fsc->client; in adjust_snap_realm_parent()
298 lockdep_assert_held_write(&mdsc->snap_rwsem); in adjust_snap_realm_parent()
303 parent = ceph_lookup_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
305 parent = ceph_create_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
313 ceph_put_snap_realm(mdsc, realm->parent); in adjust_snap_realm_parent()
335 static int build_snap_context(struct ceph_mds_client *mdsc, in build_snap_context() argument
340 struct ceph_client *cl = mdsc->fsc->client; in build_snap_context()
433 static void rebuild_snap_realms(struct ceph_mds_client *mdsc, in rebuild_snap_realms() argument
437 struct ceph_client *cl = mdsc->fsc->client; in rebuild_snap_realms()
461 last = build_snap_context(mdsc, _realm, &realm_queue, in rebuild_snap_realms()
666 struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb); in __ceph_finish_cap_snap() local
667 struct ceph_client *cl = mdsc->fsc->client; in __ceph_finish_cap_snap()
709 spin_lock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
712 list_add_tail(&ci->i_snap_flush_item, &mdsc->snap_flush_list); in __ceph_finish_cap_snap()
714 spin_unlock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
722 static void queue_realm_cap_snaps(struct ceph_mds_client *mdsc, in queue_realm_cap_snaps() argument
725 struct ceph_client *cl = mdsc->fsc->client; in queue_realm_cap_snaps()
779 int ceph_update_snap_trace(struct ceph_mds_client *mdsc, in ceph_update_snap_trace() argument
783 struct ceph_client *cl = mdsc->fsc->client; in ceph_update_snap_trace()
790 struct ceph_client *client = mdsc->fsc->client; in ceph_update_snap_trace()
796 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_update_snap_trace()
812 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
814 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
822 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
847 if (realm->seq > mdsc->last_snap_seq) in ceph_update_snap_trace()
848 mdsc->last_snap_seq = realm->seq; in ceph_update_snap_trace()
873 rebuild_snap_realms(mdsc, realm_to_rebuild, &dirty_realms); in ceph_update_snap_trace()
878 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
891 queue_realm_cap_snaps(mdsc, realm); in ceph_update_snap_trace()
897 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
899 __cleanup_empty_realms(mdsc); in ceph_update_snap_trace()
906 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
908 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
920 WRITE_ONCE(mdsc->fsc->mount_state, CEPH_MOUNT_FENCE_IO); in ceph_update_snap_trace()
942 static void flush_snaps(struct ceph_mds_client *mdsc) in flush_snaps() argument
944 struct ceph_client *cl = mdsc->fsc->client; in flush_snaps()
950 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
951 while (!list_empty(&mdsc->snap_flush_list)) { in flush_snaps()
952 ci = list_first_entry(&mdsc->snap_flush_list, in flush_snaps()
956 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
959 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
961 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
980 struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc; in ceph_change_snap_realm() local
991 ceph_put_snap_realm(mdsc, oldrealm); in ceph_change_snap_realm()
1016 void ceph_handle_snap(struct ceph_mds_client *mdsc, in ceph_handle_snap() argument
1020 struct ceph_client *cl = mdsc->fsc->client; in ceph_handle_snap()
1021 struct super_block *sb = mdsc->fsc->sb; in ceph_handle_snap()
1036 if (!ceph_inc_mds_stopping_blocker(mdsc, session)) in ceph_handle_snap()
1054 down_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1076 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
1078 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
1116 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
1130 __lookup_snap_realm(mdsc, in ceph_handle_snap()
1134 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
1155 if (ceph_update_snap_trace(mdsc, p, e, in ceph_handle_snap()
1164 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()
1166 __cleanup_empty_realms(mdsc); in ceph_handle_snap()
1168 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1170 flush_snaps(mdsc); in ceph_handle_snap()
1171 ceph_dec_mds_stopping_blocker(mdsc); in ceph_handle_snap()
1179 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1181 ceph_dec_mds_stopping_blocker(mdsc); in ceph_handle_snap()
1184 ceph_mdsc_close_sessions(mdsc); in ceph_handle_snap()
1188 struct ceph_snapid_map* ceph_get_snapid_map(struct ceph_mds_client *mdsc, in ceph_get_snapid_map() argument
1191 struct ceph_client *cl = mdsc->fsc->client; in ceph_get_snapid_map()
1197 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1198 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1212 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1235 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1236 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1253 rb_insert_color(&sm->node, &mdsc->snapid_map_tree); in ceph_get_snapid_map()
1255 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1268 void ceph_put_snapid_map(struct ceph_mds_client* mdsc, in ceph_put_snapid_map() argument
1273 if (atomic_dec_and_lock(&sm->ref, &mdsc->snapid_map_lock)) { in ceph_put_snapid_map()
1276 list_add_tail(&sm->lru, &mdsc->snapid_map_lru); in ceph_put_snapid_map()
1277 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1281 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1287 void ceph_trim_snapid_map(struct ceph_mds_client *mdsc) in ceph_trim_snapid_map() argument
1289 struct ceph_client *cl = mdsc->fsc->client; in ceph_trim_snapid_map()
1294 spin_lock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1297 while (!list_empty(&mdsc->snapid_map_lru)) { in ceph_trim_snapid_map()
1298 sm = list_first_entry(&mdsc->snapid_map_lru, in ceph_trim_snapid_map()
1303 rb_erase(&sm->node, &mdsc->snapid_map_tree); in ceph_trim_snapid_map()
1306 spin_unlock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1317 void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc) in ceph_cleanup_snapid_map() argument
1319 struct ceph_client *cl = mdsc->fsc->client; in ceph_cleanup_snapid_map()
1324 spin_lock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()
1325 while ((p = rb_first(&mdsc->snapid_map_tree))) { in ceph_cleanup_snapid_map()
1327 rb_erase(p, &mdsc->snapid_map_tree); in ceph_cleanup_snapid_map()
1331 spin_unlock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()