pi->version = in->pre_dirty();
EUpdate *le = new EUpdate("subtree merge writebehind");
- le->metablob.add_dir_context(in->get_parent_dn()->get_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ in->get_parent_dn()->get_dir());
le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
mds->mdlog->submit_entry(le);
dout(15) << " subtree " << *dir << endl;
le->subtrees[dir->dirfrag()].clear();
- le->metablob.add_dir_context(dir, EMetaBlob::TO_ROOT);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ dir, EMetaBlob::TO_ROOT);
le->metablob.add_dir(dir, false);
// bounds
CDir *bound = *q;
dout(15) << " subtree bound " << *bound << endl;
le->subtrees[dir->dirfrag()].push_back(bound->dirfrag());
- le->metablob.add_dir_context(bound, EMetaBlob::TO_ROOT);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ bound, EMetaBlob::TO_ROOT);
le->metablob.add_dir(bound, false);
}
}
version_t pdv = in->pre_dirty();
EUpdate *le = new EUpdate("anchor_create");
- le->metablob.add_dir_context(in->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ in->get_parent_dir());
// update the logged inode copy
inode_t *pi = le->metablob.add_dentry(in->parent, true);
version_t pdv = in->pre_dirty();
EUpdate *le = new EUpdate("anchor_destroy");
- le->metablob.add_dir_context(in->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ in->get_parent_dir());
// update the logged inode copy
inode_t *pi = le->metablob.add_dentry(in->parent, true);
version_t pdv = dn->pre_dirty();
EUpdate *le = new EUpdate("purge_stray");
- le->metablob.add_dir_context(dn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
le->metablob.add_null_dentry(dn, true);
le->metablob.add_inode_truncate(dn->inode->inode, 0);
mds->mdlog->submit_entry(le, new C_MDC_PurgeStray(this, dn, pdv));
// first time only,
if (p == resultfrags.begin()) {
- le->metablob.add_dir_context(dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dir);
// note peers
// only do this once: all frags have identical replica_maps.
inode_t *pi = diri->project_inode();
if (dirpv) pi->version = dirpv;
pi->ctime = pi->mtime = mdr->now;
- blob->add_dir_context(diri->get_parent_dir());
+ blob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ diri->get_parent_dir());
blob->add_primary_dentry(diri->get_parent_dn(), true, 0, pi);
} else {
// journal the mtime change anyway.
// log + wait
EUpdate *le = new EUpdate("utime");
le->metablob.add_client_req(req->get_reqid());
- le->metablob.add_dir_context(cur->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ cur->get_parent_dir());
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le);
// log + wait
EUpdate *le = new EUpdate("chmod");
le->metablob.add_client_req(req->get_reqid());
- le->metablob.add_dir_context(cur->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ cur->get_parent_dir());
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le);
// log + wait
EUpdate *le = new EUpdate("chown");
le->metablob.add_client_req(req->get_reqid());
- le->metablob.add_dir_context(cur->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ cur->get_parent_dir());
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le);
le->metablob.add_client_req(req->get_reqid());
le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob); // dir mtime too
- le->metablob.add_dir_context(dn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
// log + wait
le->metablob.add_client_req(req->get_reqid());
le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob); // dir mtime too
- le->metablob.add_dir_context(dn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
le->metablob.add_dir(newdir, true, true); // dirty AND complete
le->metablob.add_client_req(req->get_reqid());
le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob); // dir mtime too
- le->metablob.add_dir_context(dn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
// log + wait
EUpdate *le = new EUpdate("link_local");
le->metablob.add_client_req(mdr->reqid);
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob); // dir inode's mtime
- le->metablob.add_dir_context(dn->get_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
le->metablob.add_remote_dentry(dn, true, targeti->ino()); // new remote
- le->metablob.add_dir_context(targeti->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), targeti->get_parent_dir());
le->metablob.add_primary_dentry(targeti->parent, true, targeti, pi); // update old primary
mdlog->submit_entry(le);
EUpdate *le = new EUpdate("link_remote");
le->metablob.add_client_req(mdr->reqid);
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob); // dir inode's mtime
- le->metablob.add_dir_context(dn->get_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
le->metablob.add_remote_dentry(dn, true, targeti->ino()); // new remote
// mark committing (needed for proper recovery)
// journal it
ESlaveUpdate *le = new ESlaveUpdate("slave_link_prep", mdr->reqid, mdr->slave_to_mds, ESlaveUpdate::OP_PREPARE);
- le->metablob.add_dir_context(targeti->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), targeti->get_parent_dir());
le->metablob.add_primary_dentry(dn, true, targeti, pi); // update old primary
mds->mdlog->submit_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti, old_ctime, inc));
}
// primary link. add stray dentry.
assert(straydn);
ipv = straydn->pre_dirty(dn->inode->inode.version);
- le->metablob.add_dir_context(straydn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), straydn->dir);
ji = le->metablob.add_primary_dentry(straydn, true, dn->inode);
} else {
// remote link. update remote inode.
ipv = dn->inode->pre_dirty();
- le->metablob.add_dir_context(dn->inode->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ dn->inode->get_parent_dir());
ji = le->metablob.add_primary_dentry(dn->inode->parent, true, dn->inode);
}
// the unlinked dentry
dn->pre_dirty();
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);
- le->metablob.add_dir_context(dn->get_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
le->metablob.add_null_dentry(dn, true);
if (mdr->dst_reanchor_atid)
// the unlinked dentry
dn->pre_dirty();
version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);
- le->metablob.add_dir_context(dn->get_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
le->metablob.add_null_dentry(dn, true);
if (mdr->dst_reanchor_atid)
dout(10) << "will merge remote+primary links" << endl;
// destdn -> primary
- metablob->add_dir_context(destdn->dir);
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), destdn->dir);
if (destdn->is_auth())
ipv = mdr->pvmap[destdn] = destdn->pre_dirty(destdn->inode->inode.version);
ji = metablob->add_primary_dentry(destdn, true, destdn->inode);
// do src dentry
- metablob->add_dir_context(srcdn->dir);
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), srcdn->dir);
if (srcdn->is_auth())
mdr->pvmap[srcdn] = srcdn->pre_dirty();
metablob->add_null_dentry(srcdn, true);
assert(straydn);
// link-- inode, move to stray dir.
- metablob->add_dir_context(straydn->dir);
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), straydn->dir);
if (straydn->is_auth())
ipv = mdr->pvmap[straydn] = straydn->pre_dirty(destdn->inode->inode.version);
ji = metablob->add_primary_dentry(straydn, true, destdn->inode);
else if (destdn->is_remote()) {
// remote.
// nlink-- targeti
- metablob->add_dir_context(destdn->inode->get_parent_dir());
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+ destdn->inode->get_parent_dir());
if (destdn->inode->is_auth())
ipv = mdr->pvmap[destdn->inode] = destdn->inode->pre_dirty();
ji = metablob->add_primary_dentry(destdn->inode->parent, true, destdn->inode); // update primary
}
// add dest dentry
- metablob->add_dir_context(destdn->dir);
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), destdn->dir);
if (srcdn->is_primary()) {
dout(10) << "src is a primary dentry" << endl;
if (destdn->is_auth()) {
}
// remove src dentry
- metablob->add_dir_context(srcdn->dir);
+ metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), srcdn->dir);
if (srcdn->is_auth())
mdr->pvmap[srcdn] = srcdn->pre_dirty();
metablob->add_null_dentry(srcdn, true);
// log + wait
EUpdate *le = new EUpdate("truncate");
le->metablob.add_client_req(mdr->reqid);
- le->metablob.add_dir_context(cur->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), cur->get_parent_dir());
le->metablob.add_inode_truncate(cur->inode, req->args.truncate.length);
inode_t *pi = le->metablob.add_dentry(cur->parent, true);
pi->mtime = ctime;
// log + wait
EUpdate *le = new EUpdate("open_truncate");
le->metablob.add_client_req(mdr->reqid);
- le->metablob.add_dir_context(cur->get_parent_dir());
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), cur->get_parent_dir());
le->metablob.add_inode_truncate(cur->inode, 0);
inode_t *pi = le->metablob.add_dentry(cur->parent, true);
pi->mtime = ctime;
EUpdate *le = new EUpdate("openc");
le->metablob.add_client_req(req->get_reqid());
le->metablob.add_allocated_ino(in->ino(), mds->idalloc->get_version());
- le->metablob.add_dir_context(dn->dir);
+ le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
le->metablob.add_primary_dentry(dn, true, in, &in->inode);
// log + wait