Lines Matching refs:mdsc
65 void ceph_get_snap_realm(struct ceph_mds_client *mdsc, in ceph_get_snap_realm() argument
68 lockdep_assert_held(&mdsc->snap_rwsem); in ceph_get_snap_realm()
79 spin_lock(&mdsc->snap_empty_lock); in ceph_get_snap_realm()
82 spin_unlock(&mdsc->snap_empty_lock); in ceph_get_snap_realm()
113 struct ceph_mds_client *mdsc, in ceph_create_snap_realm() argument
118 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_create_snap_realm()
132 __insert_snap_realm(&mdsc->snap_realms, realm); in ceph_create_snap_realm()
133 mdsc->num_snap_realms++; in ceph_create_snap_realm()
144 static struct ceph_snap_realm *__lookup_snap_realm(struct ceph_mds_client *mdsc, in __lookup_snap_realm() argument
147 struct rb_node *n = mdsc->snap_realms.rb_node; in __lookup_snap_realm()
150 lockdep_assert_held(&mdsc->snap_rwsem); in __lookup_snap_realm()
166 struct ceph_snap_realm *ceph_lookup_snap_realm(struct ceph_mds_client *mdsc, in ceph_lookup_snap_realm() argument
170 r = __lookup_snap_realm(mdsc, ino); in ceph_lookup_snap_realm()
172 ceph_get_snap_realm(mdsc, r); in ceph_lookup_snap_realm()
176 static void __put_snap_realm(struct ceph_mds_client *mdsc,
182 static void __destroy_snap_realm(struct ceph_mds_client *mdsc, in __destroy_snap_realm() argument
185 lockdep_assert_held_write(&mdsc->snap_rwsem); in __destroy_snap_realm()
189 rb_erase(&realm->node, &mdsc->snap_realms); in __destroy_snap_realm()
190 mdsc->num_snap_realms--; in __destroy_snap_realm()
194 __put_snap_realm(mdsc, realm->parent); in __destroy_snap_realm()
206 static void __put_snap_realm(struct ceph_mds_client *mdsc, in __put_snap_realm() argument
209 lockdep_assert_held_write(&mdsc->snap_rwsem); in __put_snap_realm()
216 __destroy_snap_realm(mdsc, realm); in __put_snap_realm()
222 void ceph_put_snap_realm(struct ceph_mds_client *mdsc, in ceph_put_snap_realm() argument
225 if (!atomic_dec_and_lock(&realm->nref, &mdsc->snap_empty_lock)) in ceph_put_snap_realm()
228 if (down_write_trylock(&mdsc->snap_rwsem)) { in ceph_put_snap_realm()
229 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
230 __destroy_snap_realm(mdsc, realm); in ceph_put_snap_realm()
231 up_write(&mdsc->snap_rwsem); in ceph_put_snap_realm()
233 list_add(&realm->empty_item, &mdsc->snap_empty); in ceph_put_snap_realm()
234 spin_unlock(&mdsc->snap_empty_lock); in ceph_put_snap_realm()
245 static void __cleanup_empty_realms(struct ceph_mds_client *mdsc) in __cleanup_empty_realms() argument
249 lockdep_assert_held_write(&mdsc->snap_rwsem); in __cleanup_empty_realms()
251 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
252 while (!list_empty(&mdsc->snap_empty)) { in __cleanup_empty_realms()
253 realm = list_first_entry(&mdsc->snap_empty, in __cleanup_empty_realms()
256 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
257 __destroy_snap_realm(mdsc, realm); in __cleanup_empty_realms()
258 spin_lock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
260 spin_unlock(&mdsc->snap_empty_lock); in __cleanup_empty_realms()
263 void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc) in ceph_cleanup_empty_realms() argument
265 down_write(&mdsc->snap_rwsem); in ceph_cleanup_empty_realms()
266 __cleanup_empty_realms(mdsc); in ceph_cleanup_empty_realms()
267 up_write(&mdsc->snap_rwsem); in ceph_cleanup_empty_realms()
278 static int adjust_snap_realm_parent(struct ceph_mds_client *mdsc, in adjust_snap_realm_parent() argument
284 lockdep_assert_held_write(&mdsc->snap_rwsem); in adjust_snap_realm_parent()
289 parent = ceph_lookup_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
291 parent = ceph_create_snap_realm(mdsc, parentino); in adjust_snap_realm_parent()
300 ceph_put_snap_realm(mdsc, realm->parent); in adjust_snap_realm_parent()
622 struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb); in __ceph_finish_cap_snap() local
649 spin_lock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
651 list_add_tail(&ci->i_snap_flush_item, &mdsc->snap_flush_list); in __ceph_finish_cap_snap()
652 spin_unlock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
693 int ceph_update_snap_trace(struct ceph_mds_client *mdsc, in ceph_update_snap_trace() argument
707 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_update_snap_trace()
723 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
725 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
733 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
758 if (realm->seq > mdsc->last_snap_seq) in ceph_update_snap_trace()
759 mdsc->last_snap_seq = realm->seq; in ceph_update_snap_trace()
789 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
808 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
810 __cleanup_empty_realms(mdsc); in ceph_update_snap_trace()
817 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
819 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
831 static void flush_snaps(struct ceph_mds_client *mdsc) in flush_snaps() argument
838 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
839 while (!list_empty(&mdsc->snap_flush_list)) { in flush_snaps()
840 ci = list_first_entry(&mdsc->snap_flush_list, in flush_snaps()
844 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
849 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
851 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
872 void ceph_handle_snap(struct ceph_mds_client *mdsc, in ceph_handle_snap() argument
876 struct super_block *sb = mdsc->fsc->sb; in ceph_handle_snap()
909 down_write(&mdsc->snap_rwsem); in ceph_handle_snap()
931 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
933 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
989 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
990 ceph_put_snap_realm(mdsc, oldrealm); in ceph_handle_snap()
1005 __lookup_snap_realm(mdsc, in ceph_handle_snap()
1009 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
1017 ceph_update_snap_trace(mdsc, p, e, in ceph_handle_snap()
1022 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()
1024 __cleanup_empty_realms(mdsc); in ceph_handle_snap()
1026 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1028 flush_snaps(mdsc); in ceph_handle_snap()
1036 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1040 struct ceph_snapid_map* ceph_get_snapid_map(struct ceph_mds_client *mdsc, in ceph_get_snapid_map() argument
1048 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1049 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1063 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1085 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1086 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1103 rb_insert_color(&sm->node, &mdsc->snapid_map_tree); in ceph_get_snapid_map()
1105 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1117 void ceph_put_snapid_map(struct ceph_mds_client* mdsc, in ceph_put_snapid_map() argument
1122 if (atomic_dec_and_lock(&sm->ref, &mdsc->snapid_map_lock)) { in ceph_put_snapid_map()
1125 list_add_tail(&sm->lru, &mdsc->snapid_map_lru); in ceph_put_snapid_map()
1126 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1130 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1136 void ceph_trim_snapid_map(struct ceph_mds_client *mdsc) in ceph_trim_snapid_map() argument
1142 spin_lock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1145 while (!list_empty(&mdsc->snapid_map_lru)) { in ceph_trim_snapid_map()
1146 sm = list_first_entry(&mdsc->snapid_map_lru, in ceph_trim_snapid_map()
1151 rb_erase(&sm->node, &mdsc->snapid_map_tree); in ceph_trim_snapid_map()
1154 spin_unlock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1165 void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc) in ceph_cleanup_snapid_map() argument
1171 spin_lock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()
1172 while ((p = rb_first(&mdsc->snapid_map_tree))) { in ceph_cleanup_snapid_map()
1174 rb_erase(p, &mdsc->snapid_map_tree); in ceph_cleanup_snapid_map()
1178 spin_unlock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()