version_t CInode::pre_dirty()
{
assert(parent);
+ version_t pv;
if (projected_parent)
- return projected_parent->pre_dirty();
+ pv = projected_parent->pre_dirty(get_projected_version());
else
- return parent->pre_dirty();
+ pv = parent->pre_dirty();
+ dout(10) << "pre_dirty " << pv << " (current v " << inode.version << ")" << dendl;
+ return pv;
}
void CInode::_mark_dirty(LogSegment *ls)
//utime_t hack_load_stamp;
// projected values (only defined while dirty)
- list<inode_t*> projected_inode;
+ list<inode_t*> projected_inode;
list<fragtree_t> projected_dirfragtree;
version_t get_projected_version() {
if (dn->is_primary()) {
// primary link. add stray dentry.
assert(straydn);
- ipv = straydn->pre_dirty(dn->inode->inode.version);
+ dn->inode->projected_parent = straydn;
+ ipv = dn->inode->pre_dirty();
le->metablob.add_dir_context(straydn->dir);
ji = le->metablob.add_primary_dentry(straydn, true, dn->inode);
} else {
pi->ctime = mdr->now;
pi->version = ipv;
*ji = *pi; // copy into journal
-
+
// the unlinked dentry
dn->pre_dirty();
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);