return NULL;
}
-
-bool CInode::is_ancestor_of(CInode *other)
+bool CInode::is_projected_ancestor_of(CInode *other)
{
while (other) {
if (other == this)
return true;
- if (!other->get_parent_dn())
+ if (!other->get_projected_parent_dn())
break;
- other = other->get_parent_dn()->get_dir()->get_inode();
+ other = other->get_projected_parent_dn()->get_dir()->get_inode();
}
return false;
}
}
// -- misc --
- bool is_ancestor_of(CInode *other);
+ bool is_projected_ancestor_of(CInode *other);
void make_path_string(string& s, bool force=false, CDentry *use_parent=NULL);
void make_path_string_projected(string& s);
void make_path(filepath& s);
if (common) {
dout(10) << "rename src and dest traces share common dentry " << *common << dendl;
} else {
+ CInode *srcbase = srctrace[0]->get_dir()->get_inode();
+ CInode *destbase = destdir->get_inode();
+ if (!desttrace.empty())
+ destbase = desttrace[0]->get_dir()->get_inode();
+
// ok, extend srctrace toward root until it is an ancestor of desttrace.
- while (srctrace[0]->get_dir()->get_inode() != desttrace[0]->get_dir()->get_inode() &&
- !srctrace[0]->get_dir()->get_inode()->is_ancestor_of(desttrace[0]->get_dir()->get_inode())) {
+ while (srcbase != destbase &&
+ !srcbase->is_projected_ancestor_of(destbase)) {
srctrace.insert(srctrace.begin(),
- srctrace[0]->get_dir()->get_inode()->get_parent_dn());
+ srcbase->get_projected_parent_dn());
dout(10) << "rename prepending srctrace with " << *srctrace[0] << dendl;
+ srcbase = srcbase->get_projected_parent_dn()->get_dir()->get_inode();
}
// then, extend destpath until it shares the same parent inode as srcpath.
- while (desttrace[0]->get_dir()->get_inode() != srctrace[0]->get_dir()->get_inode()) {
+ while (destbase != srcbase) {
desttrace.insert(desttrace.begin(),
- desttrace[0]->get_dir()->get_inode()->get_parent_dn());
+ destbase->get_projected_parent_dn());
dout(10) << "rename prepending desttrace with " << *desttrace[0] << dendl;
+ destbase = destbase->get_projected_parent_dn()->get_dir()->get_inode();
}
- dout(10) << "rename src and dest traces now share common ancestor "
- << *desttrace[0]->get_dir()->get_inode() << dendl;
+ dout(10) << "rename src and dest traces now share common ancestor " << *destbase << dendl;
}
}
p != open_children.end(); ) {
SnapRealm *realm = *p;
if (realm != child &&
- child->inode->is_ancestor_of(realm->inode)) {
+ child->inode->is_projected_ancestor_of(realm->inode)) {
dout(20) << " child gets child realm " << *realm << " on " << *realm->inode << dendl;
realm->parent = child;
child->open_children.insert(realm);