Lines Matching refs:realm

67 			 struct ceph_snap_realm *realm)  in ceph_get_snap_realm()  argument
77 if (atomic_inc_not_zero(&realm->nref)) in ceph_get_snap_realm()
81 if (atomic_inc_return(&realm->nref) == 1) in ceph_get_snap_realm()
82 list_del_init(&realm->empty_item); in ceph_get_snap_realm()
117 struct ceph_snap_realm *realm; in ceph_create_snap_realm() local
121 realm = kzalloc(sizeof(*realm), GFP_NOFS); in ceph_create_snap_realm()
122 if (!realm) in ceph_create_snap_realm()
127 atomic_set(&realm->nref, 2); in ceph_create_snap_realm()
129 atomic_set(&realm->nref, 1); in ceph_create_snap_realm()
130 realm->ino = ino; in ceph_create_snap_realm()
131 INIT_LIST_HEAD(&realm->children); in ceph_create_snap_realm()
132 INIT_LIST_HEAD(&realm->child_item); in ceph_create_snap_realm()
133 INIT_LIST_HEAD(&realm->empty_item); in ceph_create_snap_realm()
134 INIT_LIST_HEAD(&realm->dirty_item); in ceph_create_snap_realm()
135 INIT_LIST_HEAD(&realm->rebuild_item); in ceph_create_snap_realm()
136 INIT_LIST_HEAD(&realm->inodes_with_caps); in ceph_create_snap_realm()
137 spin_lock_init(&realm->inodes_with_caps_lock); in ceph_create_snap_realm()
138 __insert_snap_realm(&mdsc->snap_realms, realm); in ceph_create_snap_realm()
141 dout("%s %llx %p\n", __func__, realm->ino, realm); in ceph_create_snap_realm()
142 return realm; in ceph_create_snap_realm()
183 struct ceph_snap_realm *realm);
189 struct ceph_snap_realm *realm) in __destroy_snap_realm() argument
193 dout("%s %p %llx\n", __func__, realm, realm->ino); in __destroy_snap_realm()
195 rb_erase(&realm->node, &mdsc->snap_realms); in __destroy_snap_realm()
198 if (realm->parent) { in __destroy_snap_realm()
199 list_del_init(&realm->child_item); in __destroy_snap_realm()
200 __put_snap_realm(mdsc, realm->parent); in __destroy_snap_realm()
203 kfree(realm->prior_parent_snaps); in __destroy_snap_realm()
204 kfree(realm->snaps); in __destroy_snap_realm()
205 ceph_put_snap_context(realm->cached_context); in __destroy_snap_realm()
206 kfree(realm); in __destroy_snap_realm()
213 struct ceph_snap_realm *realm) in __put_snap_realm() argument
221 if (atomic_dec_and_test(&realm->nref)) in __put_snap_realm()
222 __destroy_snap_realm(mdsc, realm); in __put_snap_realm()
229 struct ceph_snap_realm *realm) in ceph_put_snap_realm() argument
231 if (!atomic_dec_and_lock(&realm->nref, &mdsc->snap_empty_lock)) in ceph_put_snap_realm()
236 __destroy_snap_realm(mdsc, realm); in ceph_put_snap_realm()
239 list_add(&realm->empty_item, &mdsc->snap_empty); in ceph_put_snap_realm()
253 struct ceph_snap_realm *realm; in __cleanup_empty_realms() local
259 realm = list_first_entry(&mdsc->snap_empty, in __cleanup_empty_realms()
261 list_del(&realm->empty_item); in __cleanup_empty_realms()
263 __destroy_snap_realm(mdsc, realm); in __cleanup_empty_realms()
290 struct ceph_snap_realm *realm, in adjust_snap_realm_parent() argument
297 if (realm->parent_ino == parentino) in adjust_snap_realm_parent()
306 dout("%s %llx %p: %llx %p -> %llx %p\n", __func__, realm->ino, in adjust_snap_realm_parent()
307 realm, realm->parent_ino, realm->parent, parentino, parent); in adjust_snap_realm_parent()
308 if (realm->parent) { in adjust_snap_realm_parent()
309 list_del_init(&realm->child_item); in adjust_snap_realm_parent()
310 ceph_put_snap_realm(mdsc, realm->parent); in adjust_snap_realm_parent()
312 realm->parent_ino = parentino; in adjust_snap_realm_parent()
313 realm->parent = parent; in adjust_snap_realm_parent()
314 list_add(&realm->child_item, &parent->children); in adjust_snap_realm_parent()
332 static int build_snap_context(struct ceph_snap_realm *realm, in build_snap_context() argument
336 struct ceph_snap_realm *parent = realm->parent; in build_snap_context()
339 u32 num = realm->num_prior_parent_snaps + realm->num_snaps; in build_snap_context()
359 if (realm->cached_context && in build_snap_context()
360 realm->cached_context->seq == realm->seq && in build_snap_context()
362 realm->cached_context->seq >= parent->cached_context->seq)) { in build_snap_context()
364 __func__, realm->ino, realm, realm->cached_context, in build_snap_context()
365 realm->cached_context->seq, in build_snap_context()
366 (unsigned int)realm->cached_context->num_snaps); in build_snap_context()
380 snapc->seq = realm->seq; in build_snap_context()
388 realm->parent_since) in build_snap_context()
394 memcpy(snapc->snaps + num, realm->snaps, in build_snap_context()
395 sizeof(u64)*realm->num_snaps); in build_snap_context()
396 num += realm->num_snaps; in build_snap_context()
397 memcpy(snapc->snaps + num, realm->prior_parent_snaps, in build_snap_context()
398 sizeof(u64)*realm->num_prior_parent_snaps); in build_snap_context()
399 num += realm->num_prior_parent_snaps; in build_snap_context()
403 dout("%s %llx %p: %p seq %lld (%u snaps)\n", __func__, realm->ino, in build_snap_context()
404 realm, snapc, snapc->seq, (unsigned int) snapc->num_snaps); in build_snap_context()
406 ceph_put_snap_context(realm->cached_context); in build_snap_context()
407 realm->cached_context = snapc; in build_snap_context()
409 list_add_tail(&realm->dirty_item, dirty_realms); in build_snap_context()
417 if (realm->cached_context) { in build_snap_context()
418 ceph_put_snap_context(realm->cached_context); in build_snap_context()
419 realm->cached_context = NULL; in build_snap_context()
421 pr_err("%s %llx %p fail %d\n", __func__, realm->ino, realm, err); in build_snap_context()
428 static void rebuild_snap_realms(struct ceph_snap_realm *realm, in rebuild_snap_realms() argument
435 list_add_tail(&realm->rebuild_item, &realm_queue); in rebuild_snap_realms()
711 static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) in queue_realm_cap_snaps() argument
717 dout("%s %p %llx inode\n", __func__, realm, realm->ino); in queue_realm_cap_snaps()
719 spin_lock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
720 list_for_each_entry(ci, &realm->inodes_with_caps, i_snap_realm_item) { in queue_realm_cap_snaps()
724 spin_unlock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
748 spin_lock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
750 spin_unlock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
755 dout("%s %p %llx done\n", __func__, realm, realm->ino); in queue_realm_cap_snaps()
772 struct ceph_snap_realm *realm; in ceph_update_snap_trace() local
785 realm = NULL; in ceph_update_snap_trace()
797 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
798 if (!realm) { in ceph_update_snap_trace()
799 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
800 if (IS_ERR(realm)) { in ceph_update_snap_trace()
801 err = PTR_ERR(realm); in ceph_update_snap_trace()
807 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
812 if (le64_to_cpu(ri->seq) > realm->seq) { in ceph_update_snap_trace()
814 realm->ino, realm, realm->seq, le64_to_cpu(ri->seq)); in ceph_update_snap_trace()
816 realm->seq = le64_to_cpu(ri->seq); in ceph_update_snap_trace()
817 realm->created = le64_to_cpu(ri->created); in ceph_update_snap_trace()
818 realm->parent_since = le64_to_cpu(ri->parent_since); in ceph_update_snap_trace()
820 realm->num_snaps = le32_to_cpu(ri->num_snaps); in ceph_update_snap_trace()
821 err = dup_array(&realm->snaps, snaps, realm->num_snaps); in ceph_update_snap_trace()
825 realm->num_prior_parent_snaps = in ceph_update_snap_trace()
827 err = dup_array(&realm->prior_parent_snaps, prior_parent_snaps, in ceph_update_snap_trace()
828 realm->num_prior_parent_snaps); 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()
836 } else if (!realm->cached_context) { in ceph_update_snap_trace()
838 realm->ino, realm, realm->seq); in ceph_update_snap_trace()
842 realm->ino, realm, realm->seq); in ceph_update_snap_trace()
845 dout("done with %llx %p, rebuild_snapcs=%d, %p %p\n", realm->ino, in ceph_update_snap_trace()
846 realm, rebuild_snapcs, p, e); in ceph_update_snap_trace()
854 realm_to_rebuild = realm; in ceph_update_snap_trace()
861 first_realm = realm; in ceph_update_snap_trace()
863 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
873 realm = list_first_entry(&dirty_realms, struct ceph_snap_realm, in ceph_update_snap_trace()
875 list_del_init(&realm->dirty_item); in ceph_update_snap_trace()
876 queue_realm_cap_snaps(realm); in ceph_update_snap_trace()
890 if (realm && !IS_ERR(realm)) in ceph_update_snap_trace()
891 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
960 void ceph_change_snap_realm(struct inode *inode, struct ceph_snap_realm *realm) in ceph_change_snap_realm() argument
977 ci->i_snap_realm = realm; in ceph_change_snap_realm()
979 if (realm) { in ceph_change_snap_realm()
980 spin_lock(&realm->inodes_with_caps_lock); in ceph_change_snap_realm()
981 list_add(&ci->i_snap_realm_item, &realm->inodes_with_caps); in ceph_change_snap_realm()
982 if (realm->ino == ci->i_vino.ino) in ceph_change_snap_realm()
983 realm->inode = inode; in ceph_change_snap_realm()
984 spin_unlock(&realm->inodes_with_caps_lock); in ceph_change_snap_realm()
1008 struct ceph_snap_realm *realm = NULL; in ceph_handle_snap() local
1058 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
1059 if (!realm) { in ceph_handle_snap()
1060 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
1061 if (IS_ERR(realm)) in ceph_handle_snap()
1065 dout("splitting snap_realm %llx %p\n", realm->ino, realm); in ceph_handle_snap()
1096 inode, ceph_vinop(inode), realm->ino, realm); in ceph_handle_snap()
1098 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
1099 ceph_change_snap_realm(inode, realm); in ceph_handle_snap()
1116 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
1146 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()