version_t CInode::pre_dirty()
{
assert(parent);
- return parent->pre_dirty();
+ if (projected_parent)
+ return projected_parent->pre_dirty();
+ else
+ return parent->pre_dirty();
}
void CInode::_mark_dirty(LogSegment *ls)
// parent dentries in cache
CDentry *parent; // primary link
set<CDentry*> remote_parents; // if hard linked
+ CDentry *projected_parent; // for in-progress rename
pair<int,int> inode_auth;
last_journaled(0), last_open_journaled(0),
//hack_accessed(true),
stickydir_ref(0),
- parent(0), inode_auth(CDIR_AUTH_DEFAULT),
+ parent(0), projected_parent(0),
+ inode_auth(CDIR_AUTH_DEFAULT),
replica_caps_wanted(0),
xlist_dirty(this), xlist_open_file(this),
xlist_dirty_inode_mtime(this), xlist_purging_inode(this),
void set_primary_parent(CDentry *p) {
assert(parent == 0);
parent = p;
+ if (projected_parent) {
+ assert(projected_parent == p);
+ projected_parent = 0;
+ }
}
void remove_primary_parent(CDentry *dn) {
assert(dn == parent);
if (destdn->is_auth())
ipv = mdr->more()->pvmap[destdn] = destdn->pre_dirty(destdn->inode->inode.version);
ji = metablob->add_primary_dentry(destdn, true, destdn->inode);
+ destdn->inode->projected_parent = destdn;
// do src dentry
metablob->add_dir_context(srcdn->dir);
if (straydn->is_auth())
ipv = mdr->more()->pvmap[straydn] = straydn->pre_dirty(destdn->inode->inode.version);
ji = metablob->add_primary_dentry(straydn, true, destdn->inode);
+ destdn->inode->projected_parent = straydn;
}
else if (destdn->is_remote()) {
// remote.
mdr->more()->pvmap[destdn] = destdn->pre_dirty(siv+1);
}
metablob->add_primary_dentry(destdn, true, srcdn->inode);
+ srcdn->inode->projected_parent = destdn;
} else {
assert(srcdn->is_remote());