ceph: remove outdated frag information
If directory fragments change, fill_inode() inserts new frags into the fragtree, but it does not remove outdated frags from the fragtree. This patch fixes it. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
ffc79664d1
commit
53e879a485
1 changed files with 29 additions and 4 deletions
|
@ -577,6 +577,8 @@ static int fill_inode(struct inode *inode,
|
|||
int issued = 0, implemented;
|
||||
struct timespec mtime, atime, ctime;
|
||||
u32 nsplits;
|
||||
struct ceph_inode_frag *frag;
|
||||
struct rb_node *rb_node;
|
||||
struct ceph_buffer *xattr_blob = NULL;
|
||||
int err = 0;
|
||||
int queue_trunc = 0;
|
||||
|
@ -751,15 +753,38 @@ static int fill_inode(struct inode *inode,
|
|||
/* FIXME: move me up, if/when version reflects fragtree changes */
|
||||
nsplits = le32_to_cpu(info->fragtree.nsplits);
|
||||
mutex_lock(&ci->i_fragtree_mutex);
|
||||
rb_node = rb_first(&ci->i_fragtree);
|
||||
for (i = 0; i < nsplits; i++) {
|
||||
u32 id = le32_to_cpu(info->fragtree.splits[i].frag);
|
||||
struct ceph_inode_frag *frag = __get_or_create_frag(ci, id);
|
||||
|
||||
if (IS_ERR(frag))
|
||||
continue;
|
||||
frag = NULL;
|
||||
while (rb_node) {
|
||||
frag = rb_entry(rb_node, struct ceph_inode_frag, node);
|
||||
if (ceph_frag_compare(frag->frag, id) >= 0) {
|
||||
if (frag->frag != id)
|
||||
frag = NULL;
|
||||
else
|
||||
rb_node = rb_next(rb_node);
|
||||
break;
|
||||
}
|
||||
rb_node = rb_next(rb_node);
|
||||
rb_erase(&frag->node, &ci->i_fragtree);
|
||||
kfree(frag);
|
||||
frag = NULL;
|
||||
}
|
||||
if (!frag) {
|
||||
frag = __get_or_create_frag(ci, id);
|
||||
if (IS_ERR(frag))
|
||||
continue;
|
||||
}
|
||||
frag->split_by = le32_to_cpu(info->fragtree.splits[i].by);
|
||||
dout(" frag %x split by %d\n", frag->frag, frag->split_by);
|
||||
}
|
||||
while (rb_node) {
|
||||
frag = rb_entry(rb_node, struct ceph_inode_frag, node);
|
||||
rb_node = rb_next(rb_node);
|
||||
rb_erase(&frag->node, &ci->i_fragtree);
|
||||
kfree(frag);
|
||||
}
|
||||
mutex_unlock(&ci->i_fragtree_mutex);
|
||||
|
||||
/* were we issued a capability? */
|
||||
|
|
Loading…
Reference in a new issue