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
659 spin_lock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
661 list_add_tail(&ci->i_snap_flush_item, &mdsc->snap_flush_list); in __ceph_finish_cap_snap()
662 spin_unlock(&mdsc->snap_flush_lock); in __ceph_finish_cap_snap()
701 int ceph_update_snap_trace(struct ceph_mds_client *mdsc, in ceph_update_snap_trace() argument
714 lockdep_assert_held_write(&mdsc->snap_rwsem); in ceph_update_snap_trace()
728 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
730 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
738 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
763 if (realm->seq > mdsc->last_snap_seq) in ceph_update_snap_trace()
764 mdsc->last_snap_seq = realm->seq; in ceph_update_snap_trace()
786 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
805 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
807 __cleanup_empty_realms(mdsc); in ceph_update_snap_trace()
814 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
816 ceph_put_snap_realm(mdsc, first_realm); in ceph_update_snap_trace()
828 static void flush_snaps(struct ceph_mds_client *mdsc) in flush_snaps() argument
835 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
836 while (!list_empty(&mdsc->snap_flush_list)) { in flush_snaps()
837 ci = list_first_entry(&mdsc->snap_flush_list, in flush_snaps()
841 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
844 spin_lock(&mdsc->snap_flush_lock); in flush_snaps()
846 spin_unlock(&mdsc->snap_flush_lock); in flush_snaps()
865 struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; in ceph_change_snap_realm() local
876 ceph_put_snap_realm(mdsc, oldrealm); in ceph_change_snap_realm()
901 void ceph_handle_snap(struct ceph_mds_client *mdsc, in ceph_handle_snap() argument
905 struct super_block *sb = mdsc->fsc->sb; in ceph_handle_snap()
938 down_write(&mdsc->snap_rwsem); in ceph_handle_snap()
960 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
962 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
1000 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
1014 __lookup_snap_realm(mdsc, in ceph_handle_snap()
1018 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
1026 ceph_update_snap_trace(mdsc, p, e, in ceph_handle_snap()
1031 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()
1033 __cleanup_empty_realms(mdsc); in ceph_handle_snap()
1035 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1037 flush_snaps(mdsc); in ceph_handle_snap()
1045 up_write(&mdsc->snap_rwsem); in ceph_handle_snap()
1049 struct ceph_snapid_map* ceph_get_snapid_map(struct ceph_mds_client *mdsc, in ceph_get_snapid_map() argument
1057 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1058 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1072 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1094 p = &mdsc->snapid_map_tree.rb_node; in ceph_get_snapid_map()
1095 spin_lock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1112 rb_insert_color(&sm->node, &mdsc->snapid_map_tree); in ceph_get_snapid_map()
1114 spin_unlock(&mdsc->snapid_map_lock); in ceph_get_snapid_map()
1126 void ceph_put_snapid_map(struct ceph_mds_client* mdsc, in ceph_put_snapid_map() argument
1131 if (atomic_dec_and_lock(&sm->ref, &mdsc->snapid_map_lock)) { in ceph_put_snapid_map()
1134 list_add_tail(&sm->lru, &mdsc->snapid_map_lru); in ceph_put_snapid_map()
1135 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1139 spin_unlock(&mdsc->snapid_map_lock); in ceph_put_snapid_map()
1145 void ceph_trim_snapid_map(struct ceph_mds_client *mdsc) in ceph_trim_snapid_map() argument
1151 spin_lock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1154 while (!list_empty(&mdsc->snapid_map_lru)) { in ceph_trim_snapid_map()
1155 sm = list_first_entry(&mdsc->snapid_map_lru, in ceph_trim_snapid_map()
1160 rb_erase(&sm->node, &mdsc->snapid_map_tree); in ceph_trim_snapid_map()
1163 spin_unlock(&mdsc->snapid_map_lock); in ceph_trim_snapid_map()
1174 void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc) in ceph_cleanup_snapid_map() argument
1180 spin_lock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()
1181 while ((p = rb_first(&mdsc->snapid_map_tree))) { in ceph_cleanup_snapid_map()
1183 rb_erase(p, &mdsc->snapid_map_tree); in ceph_cleanup_snapid_map()
1187 spin_unlock(&mdsc->snapid_map_lock); in ceph_cleanup_snapid_map()