Lines Matching refs:realm
63 struct ceph_snap_realm *realm) in ceph_get_snap_realm() argument
65 dout("get_realm %p %d -> %d\n", realm, in ceph_get_snap_realm()
66 atomic_read(&realm->nref), atomic_read(&realm->nref)+1); in ceph_get_snap_realm()
73 if (atomic_inc_return(&realm->nref) == 1) { in ceph_get_snap_realm()
75 list_del_init(&realm->empty_item); in ceph_get_snap_realm()
111 struct ceph_snap_realm *realm; in ceph_create_snap_realm() local
113 realm = kzalloc(sizeof(*realm), GFP_NOFS); in ceph_create_snap_realm()
114 if (!realm) in ceph_create_snap_realm()
117 atomic_set(&realm->nref, 1); /* for caller */ in ceph_create_snap_realm()
118 realm->ino = ino; in ceph_create_snap_realm()
119 INIT_LIST_HEAD(&realm->children); in ceph_create_snap_realm()
120 INIT_LIST_HEAD(&realm->child_item); in ceph_create_snap_realm()
121 INIT_LIST_HEAD(&realm->empty_item); in ceph_create_snap_realm()
122 INIT_LIST_HEAD(&realm->dirty_item); in ceph_create_snap_realm()
123 INIT_LIST_HEAD(&realm->inodes_with_caps); in ceph_create_snap_realm()
124 spin_lock_init(&realm->inodes_with_caps_lock); in ceph_create_snap_realm()
125 __insert_snap_realm(&mdsc->snap_realms, realm); in ceph_create_snap_realm()
126 dout("create_snap_realm %llx %p\n", realm->ino, realm); in ceph_create_snap_realm()
127 return realm; in ceph_create_snap_realm()
166 struct ceph_snap_realm *realm);
172 struct ceph_snap_realm *realm) in __destroy_snap_realm() argument
174 dout("__destroy_snap_realm %p %llx\n", realm, realm->ino); in __destroy_snap_realm()
176 rb_erase(&realm->node, &mdsc->snap_realms); in __destroy_snap_realm()
178 if (realm->parent) { in __destroy_snap_realm()
179 list_del_init(&realm->child_item); in __destroy_snap_realm()
180 __put_snap_realm(mdsc, realm->parent); in __destroy_snap_realm()
183 kfree(realm->prior_parent_snaps); in __destroy_snap_realm()
184 kfree(realm->snaps); in __destroy_snap_realm()
185 ceph_put_snap_context(realm->cached_context); in __destroy_snap_realm()
186 kfree(realm); in __destroy_snap_realm()
193 struct ceph_snap_realm *realm) in __put_snap_realm() argument
195 dout("__put_snap_realm %llx %p %d -> %d\n", realm->ino, realm, in __put_snap_realm()
196 atomic_read(&realm->nref), atomic_read(&realm->nref)-1); in __put_snap_realm()
197 if (atomic_dec_and_test(&realm->nref)) in __put_snap_realm()
198 __destroy_snap_realm(mdsc, realm); in __put_snap_realm()
205 struct ceph_snap_realm *realm) in ceph_put_snap_realm() argument
207 dout("put_snap_realm %llx %p %d -> %d\n", realm->ino, realm, in ceph_put_snap_realm()
208 atomic_read(&realm->nref), atomic_read(&realm->nref)-1); in ceph_put_snap_realm()
209 if (!atomic_dec_and_test(&realm->nref)) in ceph_put_snap_realm()
213 __destroy_snap_realm(mdsc, realm); in ceph_put_snap_realm()
217 list_add(&realm->empty_item, &mdsc->snap_empty); in ceph_put_snap_realm()
231 struct ceph_snap_realm *realm; in __cleanup_empty_realms() local
235 realm = list_first_entry(&mdsc->snap_empty, in __cleanup_empty_realms()
237 list_del(&realm->empty_item); in __cleanup_empty_realms()
239 __destroy_snap_realm(mdsc, realm); in __cleanup_empty_realms()
261 struct ceph_snap_realm *realm, in adjust_snap_realm_parent() argument
266 if (realm->parent_ino == parentino) in adjust_snap_realm_parent()
276 realm->ino, realm, realm->parent_ino, realm->parent, in adjust_snap_realm_parent()
278 if (realm->parent) { in adjust_snap_realm_parent()
279 list_del_init(&realm->child_item); in adjust_snap_realm_parent()
280 ceph_put_snap_realm(mdsc, realm->parent); in adjust_snap_realm_parent()
282 realm->parent_ino = parentino; in adjust_snap_realm_parent()
283 realm->parent = parent; in adjust_snap_realm_parent()
284 list_add(&realm->child_item, &parent->children); in adjust_snap_realm_parent()
304 static int build_snap_context(struct ceph_snap_realm *realm) in build_snap_context() argument
306 struct ceph_snap_realm *parent = realm->parent; in build_snap_context()
309 u32 num = realm->num_prior_parent_snaps + realm->num_snaps; in build_snap_context()
329 if (realm->cached_context && in build_snap_context()
330 realm->cached_context->seq == realm->seq && in build_snap_context()
332 realm->cached_context->seq >= parent->cached_context->seq)) { in build_snap_context()
335 realm->ino, realm, realm->cached_context, in build_snap_context()
336 realm->cached_context->seq, in build_snap_context()
337 (unsigned int) realm->cached_context->num_snaps); in build_snap_context()
341 if (num == 0 && realm->seq == empty_snapc->seq) { in build_snap_context()
357 snapc->seq = realm->seq; in build_snap_context()
365 realm->parent_since) in build_snap_context()
371 memcpy(snapc->snaps + num, realm->snaps, in build_snap_context()
372 sizeof(u64)*realm->num_snaps); in build_snap_context()
373 num += realm->num_snaps; in build_snap_context()
374 memcpy(snapc->snaps + num, realm->prior_parent_snaps, in build_snap_context()
375 sizeof(u64)*realm->num_prior_parent_snaps); in build_snap_context()
376 num += realm->num_prior_parent_snaps; in build_snap_context()
381 realm->ino, realm, snapc, snapc->seq, in build_snap_context()
385 ceph_put_snap_context(realm->cached_context); in build_snap_context()
386 realm->cached_context = snapc; in build_snap_context()
394 if (realm->cached_context) { in build_snap_context()
395 ceph_put_snap_context(realm->cached_context); in build_snap_context()
396 realm->cached_context = NULL; in build_snap_context()
398 pr_err("build_snap_context %llx %p fail %d\n", realm->ino, in build_snap_context()
399 realm, err); in build_snap_context()
406 static void rebuild_snap_realms(struct ceph_snap_realm *realm) in rebuild_snap_realms() argument
410 dout("rebuild_snap_realms %llx %p\n", realm->ino, realm); in rebuild_snap_realms()
411 build_snap_context(realm); in rebuild_snap_realms()
413 list_for_each_entry(child, &realm->children, child_item) in rebuild_snap_realms()
599 static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) in queue_realm_cap_snaps() argument
605 dout("queue_realm_cap_snaps %p %llx inodes\n", realm, realm->ino); in queue_realm_cap_snaps()
607 spin_lock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
608 list_for_each_entry(ci, &realm->inodes_with_caps, in queue_realm_cap_snaps()
613 spin_unlock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
617 spin_lock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
619 spin_unlock(&realm->inodes_with_caps_lock); in queue_realm_cap_snaps()
622 list_for_each_entry(child, &realm->children, child_item) { in queue_realm_cap_snaps()
624 realm, realm->ino, child, child->ino); in queue_realm_cap_snaps()
626 list_add(&child->dirty_item, &realm->dirty_item); in queue_realm_cap_snaps()
629 list_del_init(&realm->dirty_item); in queue_realm_cap_snaps()
630 dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); in queue_realm_cap_snaps()
647 struct ceph_snap_realm *realm = NULL; in ceph_update_snap_trace() local
665 realm = ceph_lookup_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
666 if (!realm) { in ceph_update_snap_trace()
667 realm = ceph_create_snap_realm(mdsc, le64_to_cpu(ri->ino)); in ceph_update_snap_trace()
668 if (IS_ERR(realm)) { in ceph_update_snap_trace()
669 err = PTR_ERR(realm); in ceph_update_snap_trace()
675 err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); in ceph_update_snap_trace()
680 if (le64_to_cpu(ri->seq) > realm->seq) { in ceph_update_snap_trace()
682 realm->ino, realm, realm->seq, le64_to_cpu(ri->seq)); in ceph_update_snap_trace()
684 realm->seq = le64_to_cpu(ri->seq); in ceph_update_snap_trace()
685 realm->created = le64_to_cpu(ri->created); in ceph_update_snap_trace()
686 realm->parent_since = le64_to_cpu(ri->parent_since); in ceph_update_snap_trace()
688 realm->num_snaps = le32_to_cpu(ri->num_snaps); in ceph_update_snap_trace()
689 err = dup_array(&realm->snaps, snaps, realm->num_snaps); in ceph_update_snap_trace()
693 realm->num_prior_parent_snaps = in ceph_update_snap_trace()
695 err = dup_array(&realm->prior_parent_snaps, prior_parent_snaps, in ceph_update_snap_trace()
696 realm->num_prior_parent_snaps); in ceph_update_snap_trace()
701 list_add(&realm->dirty_item, &dirty_realms); in ceph_update_snap_trace()
704 } else if (!realm->cached_context) { in ceph_update_snap_trace()
706 realm->ino, realm, realm->seq); in ceph_update_snap_trace()
710 realm->ino, realm, realm->seq); in ceph_update_snap_trace()
713 dout("done with %llx %p, invalidated=%d, %p %p\n", realm->ino, in ceph_update_snap_trace()
714 realm, invalidate, p, e); in ceph_update_snap_trace()
718 rebuild_snap_realms(realm); in ceph_update_snap_trace()
721 first_realm = realm; in ceph_update_snap_trace()
723 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
733 realm = list_first_entry(&dirty_realms, struct ceph_snap_realm, in ceph_update_snap_trace()
735 queue_realm_cap_snaps(realm); in ceph_update_snap_trace()
749 if (realm && !IS_ERR(realm)) in ceph_update_snap_trace()
750 ceph_put_snap_realm(mdsc, realm); in ceph_update_snap_trace()
814 struct ceph_snap_realm *realm = NULL; in ceph_handle_snap() local
864 realm = ceph_lookup_snap_realm(mdsc, split); in ceph_handle_snap()
865 if (!realm) { in ceph_handle_snap()
866 realm = ceph_create_snap_realm(mdsc, split); in ceph_handle_snap()
867 if (IS_ERR(realm)) in ceph_handle_snap()
871 dout("splitting snap_realm %llx %p\n", realm->ino, realm); in ceph_handle_snap()
903 inode, realm->ino, realm); in ceph_handle_snap()
907 spin_lock(&realm->inodes_with_caps_lock); in ceph_handle_snap()
910 &realm->inodes_with_caps); in ceph_handle_snap()
912 ci->i_snap_realm = realm; in ceph_handle_snap()
913 spin_unlock(&realm->inodes_with_caps_lock); in ceph_handle_snap()
916 ceph_get_snap_realm(mdsc, realm); in ceph_handle_snap()
934 adjust_snap_realm_parent(mdsc, child, realm->ino); in ceph_handle_snap()
947 ceph_put_snap_realm(mdsc, realm); in ceph_handle_snap()