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()
150 static struct ceph_snap_realm *__lookup_snap_realm(struct ceph_mds_client *mdsc, in __lookup_snap_realm() argument
153 struct rb_node *n = mdsc->snap_realms.rb_node; in __lookup_snap_realm()
156 lockdep_assert_held(&mdsc->snap_rwsem); in __lookup_snap_realm()
172 struct ceph_snap_realm *ceph_lookup_snap_realm(struct ceph_mds_client *mdsc, in ceph_lookup_snap_realm() argument
176 r = __lookup_snap_realm(mdsc, ino); in ceph_lookup_snap_realm()
178 ceph_get_snap_realm(mdsc, r); in ceph_lookup_snap_realm()
182 static void __put_snap_realm(struct ceph_mds_client *mdsc,
188 static void __destroy_snap_realm(struct ceph_mds_client *mdsc, in __destroy_snap_realm() argument
191 lockdep_assert_held_write(&mdsc->snap_rwsem); in __destroy_snap_realm()
195 rb_erase(&realm->node, &mdsc->snap_realms); in __destroy_snap_realm()
196 mdsc->num_snap_realms--; in __destroy_snap_realm()
200 __put_snap_realm(mdsc, realm->parent); in __destroy_snap_realm()
212 static void __put_snap_realm(struct ceph_mds_client *mdsc, in __put_snap_realm() argument
215 lockdep_assert_held_write(&mdsc->snap_rwsem); in __put_snap_realm()
222 __destroy_snap_realm(mdsc, realm); in __put_snap_realm()
228 void ceph_put_snap_realm(struct ceph_mds_client *mdsc, in ceph_put_snap_realm() argument
231 if (!atomic_dec_and_lock(&realm->nref, &mdsc->snap_empty_lock)) in ceph_put_snap_realm()
234 if (down_write_trylock(&mdsc->snap_rwsem)) { in ceph_put_snap_realm()
235 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
236 __destroy_snap_realm(mdsc, realm); in ceph_put_snap_realm()
237 up_write(&mdsc->snap_rwsem); in ceph_put_snap_realm()
239 list_add(&realm->empty_item, &mdsc->snap_empty); in ceph_put_snap_realm()
240 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
251 static void __cleanup_empty_realms(struct ceph_mds_client *mdsc) in __cleanup_empty_realms() argument
255 lockdep_assert_held_write(&mdsc->snap_rwsem); in __cleanup_empty_realms()
257 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
258 while (!list_empty(&mdsc->snap_empty)) { in __cleanup_empty_realms()
259 realm = list_first_entry(&mdsc->snap_empty, in __cleanup_empty_realms()
262 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
263 __destroy_snap_realm(mdsc, realm); in __cleanup_empty_realms()
264 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
266 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
269 void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc) in ceph_cleanup_global_and_empty_realms() argument
273 down_write(&mdsc->snap_rwsem); in ceph_cleanup_global_and_empty_realms()
274 global_realm = __lookup_snap_realm(mdsc, CEPH_INO_GLOBAL_SNAPREALM); in ceph_cleanup_global_and_empty_realms()
276 ceph_put_snap_realm(mdsc, global_realm); in ceph_cleanup_global_and_empty_realms()
277 __cleanup_empty_realms(mdsc); in ceph_cleanup_global_and_empty_realms()
278 up_write(&mdsc->snap_rwsem); in ceph_cleanup_global_and_empty_realms()
289 static int adjust_snap_realm_parent(struct ceph_mds_client *mdsc, in adjust_snap_realm_parent() argument
295 lockdep_assert_held_write(&mdsc->snap_rwsem); in adjust_snap_realm_parent()
300 parent = ceph_lookup_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
302 parent = ceph_create_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
310 ceph_put_snap_realm(mdsc, realm->parent); in adjust_snap_realm_parent()
657 struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb); in __ceph_finish_cap_snap() local
698 spin_lock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
701 list_add_tail(&ci->i_snap_flush_item, &mdsc->snap_flush_list); in __ceph_finish_cap_snap()
703 spin_unlock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
765 int ceph_update_snap_trace(struct ceph_mds_client *mdsc, in ceph_update_snap_trace() argument
775 struct ceph_client *client = mdsc->fsc->client; in ceph_update_snap_trace()
781 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_update_snap_trace()
797 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
799 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
807 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
832 if (realm->seq > mdsc->last_snap_seq) in ceph_update_snap_trace()
833 mdsc->last_snap_seq = realm->seq; in ceph_update_snap_trace()
863 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
882 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
884 __cleanup_empty_realms(mdsc); in ceph_update_snap_trace()
891 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
893 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
905 WRITE_ONCE(mdsc->fsc->mount_state, CEPH_MOUNT_FENCE_IO); in ceph_update_snap_trace()
926 static void flush_snaps(struct ceph_mds_client *mdsc) in flush_snaps() argument
933 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
934 while (!list_empty(&mdsc->snap_flush_list)) { in flush_snaps()
935 ci = list_first_entry(&mdsc->snap_flush_list, in flush_snaps()
939 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
942 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
944 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
963 struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; in ceph_change_snap_realm() local
974 ceph_put_snap_realm(mdsc, oldrealm); in ceph_change_snap_realm()
999 void ceph_handle_snap(struct ceph_mds_client *mdsc, in ceph_handle_snap() argument
1003 struct super_block *sb = mdsc->fsc->sb; in ceph_handle_snap()
1018 if (!ceph_inc_mds_stopping_blocker(mdsc, session)) in ceph_handle_snap()
1036 down_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1058 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
1060 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
1098 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
1112 __lookup_snap_realm(mdsc, in ceph_handle_snap()
1116 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
1137 if (ceph_update_snap_trace(mdsc, p, e, in ceph_handle_snap()
1146 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()
1148 __cleanup_empty_realms(mdsc); in ceph_handle_snap()
1150 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1152 flush_snaps(mdsc); in ceph_handle_snap()
1153 ceph_dec_mds_stopping_blocker(mdsc); in ceph_handle_snap()
1161 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1163 ceph_dec_mds_stopping_blocker(mdsc); in ceph_handle_snap()
1166 ceph_mdsc_close_sessions(mdsc); in ceph_handle_snap()
1170 struct ceph_snapid_map* ceph_get_snapid_map(struct ceph_mds_client *mdsc, in ceph_get_snapid_map() argument
1178 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1179 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1193 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1216 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1217 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1234 rb_insert_color(&sm->node, &mdsc->snapid_map_tree); in ceph_get_snapid_map()
1236 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1250 void ceph_put_snapid_map(struct ceph_mds_client* mdsc, in ceph_put_snapid_map() argument
1255 if (atomic_dec_and_lock(&sm->ref, &mdsc->snapid_map_lock)) { in ceph_put_snapid_map()
1258 list_add_tail(&sm->lru, &mdsc->snapid_map_lru); in ceph_put_snapid_map()
1259 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1263 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1269 void ceph_trim_snapid_map(struct ceph_mds_client *mdsc) in ceph_trim_snapid_map() argument
1275 spin_lock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1278 while (!list_empty(&mdsc->snapid_map_lru)) { in ceph_trim_snapid_map()
1279 sm = list_first_entry(&mdsc->snapid_map_lru, in ceph_trim_snapid_map()
1284 rb_erase(&sm->node, &mdsc->snapid_map_tree); in ceph_trim_snapid_map()
1287 spin_unlock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1298 void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc) in ceph_cleanup_snapid_map() argument
1304 spin_lock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()
1305 while ((p = rb_first(&mdsc->snapid_map_tree))) { in ceph_cleanup_snapid_map()
1307 rb_erase(p, &mdsc->snapid_map_tree); in ceph_cleanup_snapid_map()
1311 spin_unlock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()