Linking inode in early confuses CDir::_committed().
SnapRealm *CInode::find_snaprealm()
{
CInode *cur = this;
- while (cur->get_parent_dn() && !cur->snaprealm)
- cur = cur->get_parent_dn()->get_dir()->get_inode();
+ while (!cur->snaprealm) {
+ if (cur->get_parent_dn())
+ cur = cur->get_parent_dn()->get_dir()->get_inode();
+ else if (cur == this && get_projected_parent_dn())
+ cur = get_projected_parent_dn()->get_dir()->get_inode();
+ else
+ break;
+ }
return cur->snaprealm;
}
void finish(int r) {
assert(r == 0);
+ dn->get_dir()->link_primary_inode(dn, newi);
+
// dirty inode, dn, dir
newi->mark_dirty(newi->inode.version + 1, mdr->ls);
dn->first = in->first = follows+1;
- // link now, so that in->parent is set and find_snaprealm() works.
- dn->dir->link_primary_inode(dn, in);
-
// prepare finisher
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "openc");