dn->first = follows+1;
CDentry *olddn = dn->dir->add_remote_dentry(dn->name, in->ino(), in->d_type(),
oldfirst, follows);
+ olddn->pre_dirty();
dout(10) << " olddn " << *olddn << dendl;
metablob->add_remote_dentry(olddn, true);
mut->add_cow_dentry(olddn);
if (pcow_inode)
*pcow_inode = oldin;
CDentry *olddn = dn->dir->add_primary_dentry(dn->name, oldin, oldfirst, follows);
+ oldin->inode.version = olddn->pre_dirty();
dout(10) << " olddn " << *olddn << dendl;
metablob->add_primary_dentry(olddn, true);
mut->add_cow_dentry(olddn);
assert(dnl->is_remote());
CDentry *olddn = dn->dir->add_remote_dentry(dn->name, dnl->get_remote_ino(), dnl->get_remote_d_type(),
oldfirst, follows);
+ olddn->pre_dirty();
dout(10) << " olddn " << *olddn << dendl;
metablob->add_remote_dentry(olddn, true);
mut->add_cow_dentry(olddn);
list<ScatterLock*> updated_locks;
list<CInode*> dirty_cow_inodes;
- list<CDentry*> dirty_cow_dentries;
+ list<pair<CDentry*,version_t> > dirty_cow_dentries;
Mutation() :
ls(0),
}
void add_cow_dentry(CDentry *dn) {
pin(dn);
- dirty_cow_dentries.push_back(dn);
+ dirty_cow_dentries.push_back(pair<CDentry*,version_t>(dn, dn->get_projected_version()));
}
void apply() {
p != dirty_cow_inodes.end();
p++)
(*p)->_mark_dirty(ls);
- for (list<CDentry*>::iterator p = dirty_cow_dentries.begin();
+ for (list<pair<CDentry*,version_t> >::iterator p = dirty_cow_dentries.begin();
p != dirty_cow_dentries.end();
- p++)
- (*p)->_mark_dirty(ls);
+ p++)
+ p->first->mark_dirty(p->second, ls);
for (list<ScatterLock*>::iterator p = updated_locks.begin();
p != updated_locks.end();