}
};
-void MDCache::try_subtree_merge_at(CDir *dir)
+void MDCache::try_subtree_merge_at(CDir *dir, bool do_eval)
{
dout(10) << "try_subtree_merge_at " << *dir << dendl;
assert(subtrees.count(dir));
- bool do_eval = true;
if (mds->is_any_replay() || mds->is_resolve())
do_eval = false;
assert(failed == 0);
}
-void MDCache::adjust_subtree_after_rename(CInode *diri, CDir *olddir)
+void MDCache::adjust_subtree_after_rename(CInode *diri, CDir *olddir,
+ bool imported)
{
dout(10) << "adjust_subtree_after_rename " << *diri << " from " << *olddir << dendl;
// un-force dir to subtree root
if (dir->dir_auth == pair<int,int>(dir->dir_auth.first, dir->dir_auth.first)) {
adjust_subtree_auth(dir, dir->dir_auth.first);
- try_subtree_merge_at(dir);
+ try_subtree_merge_at(dir, !imported);
}
}
}
void map_dirfrag_set(list<dirfrag_t>& dfs, set<CDir*>& result);
void try_subtree_merge(CDir *root);
- void try_subtree_merge_at(CDir *root);
+ void try_subtree_merge_at(CDir *root, bool do_eval=true);
void subtree_merge_writebehind_finish(CInode *in, Mutation *mut);
void eval_subtree_root(CInode *diri);
CDir *get_subtree_root(CDir *dir);
void verify_subtree_bounds(CDir *root, const set<CDir*>& bounds);
void verify_subtree_bounds(CDir *root, const list<dirfrag_t>& bounds);
- void adjust_subtree_after_rename(CInode *diri, CDir *olddir);
+ void adjust_subtree_after_rename(CInode *diri, CDir *olddir,
+ bool imported = false);
void get_auth_subtrees(set<CDir*>& s);
void get_fullauth_subtrees(set<CDir*>& s);
CInode *oldin = destdnl->get_inode();
+ bool imported_inode = false;
+
// primary+remote link merge?
bool linkmerge = (srcdnl->get_inode() == destdnl->get_inode() &&
(srcdnl->is_primary() || destdnl->is_primary()));
// hack: fix auth bit
destdnl->get_inode()->state_set(CInode::STATE_AUTH);
+ imported_inode = true;
}
if (destdn->is_auth()) {
// update subtree map?
if (destdnl->is_primary() && destdnl->get_inode()->is_dir())
- mdcache->adjust_subtree_after_rename(destdnl->get_inode(), srcdn->get_dir());
+ mdcache->adjust_subtree_after_rename(destdnl->get_inode(),
+ srcdn->get_dir(),
+ imported_inode);
// removing a new dn?
if (srcdn->is_auth())