static int fpos_cmp(loff_t l, loff_t r) { int v = ceph_frag_compare(fpos_frag(l), fpos_frag(r)); if (v) return v; return (int)(fpos_off(l) - fpos_off(r)); }
/* * find a specific frag @f */ struct ceph_inode_frag *__ceph_find_frag(struct ceph_inode_info *ci, u32 f) { struct rb_node *n = ci->i_fragtree.rb_node; while (n) { struct ceph_inode_frag *frag = rb_entry(n, struct ceph_inode_frag, node); int c = ceph_frag_compare(f, frag->frag); if (c < 0) n = n->rb_left; else if (c > 0) n = n->rb_right; else return frag; } return NULL; }
/* * find/create a frag in the tree */ static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci, u32 f) { struct rb_node **p; struct rb_node *parent = NULL; struct ceph_inode_frag *frag; int c; p = &ci->i_fragtree.rb_node; while (*p) { parent = *p; frag = rb_entry(parent, struct ceph_inode_frag, node); c = ceph_frag_compare(f, frag->frag); if (c < 0) p = &(*p)->rb_left; else if (c > 0) p = &(*p)->rb_right; else return frag; } frag = kmalloc(sizeof(*frag), GFP_NOFS); if (!frag) { pr_err("__get_or_create_frag ENOMEM on %p %llx.%llx " "frag %x\n", &ci->vfs_inode, ceph_vinop(&ci->vfs_inode), f); return ERR_PTR(-ENOMEM); } frag->frag = f; frag->split_by = 0; frag->mds = -1; frag->ndist = 0; rb_link_node(&frag->node, parent, p); rb_insert_color(&frag->node, &ci->i_fragtree); dout("get_or_create_frag added %llx.%llx frag %x\n", ceph_vinop(&ci->vfs_inode), f); return frag; }