return projected_srnode.back();
}
+/* if newparent != parent, add parent to past_parents
+ if parent DNE, we need to find what the parent actually is and fill that in */
+void CInode::project_past_parent(SnapRealm *newparent, bufferlist& snapbl)
+{
+ sr_t *new_snap = project_snaprealm();
+ SnapRealm *oldparent;
+ if (!snaprealm)
+ oldparent = find_snaprealm();
+ else
+ oldparent = snaprealm->parent;
+
+ if (newparent != oldparent) {
+ snapid_t oldparentseq = oldparent->get_newest_seq();
+ new_snap->past_parents[oldparentseq].ino = oldparent->inode->ino();
+ new_snap->past_parents[oldparentseq].first = new_snap->current_parent_since;
+ new_snap->current_parent_since = MAX(oldparentseq, newparent->get_last_created()) + 1;
+ }
+ new_snap->encode(snapbl);
+ projected_srnode.pop_back();
+ delete new_snap;
+}
+
void CInode::pop_projected_snaprealm()
{
assert(!projected_srnode.empty());
else
return projected_srnode.back();
}
-
+ void project_past_parent(SnapRealm *newparent, bufferlist& snapbl);
old_inode_t& cow_old_inode(snapid_t follows, inode_t *pi);
old_inode_t *pick_old_inode(snapid_t last);
// project snaprealm, too
bufferlist snapbl;
- if (!in->snaprealm) {
- in->open_snaprealm(true); // don't do a split
- in->snaprealm->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
- in->close_snaprealm(true); // or a matching join
- } else
- in->snaprealm->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
+ in->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
le->metablob.add_primary_dentry(straydn, true, in, 0, &snapbl);
} else {
if (destdnl->is_primary()) {
// project snaprealm, too
bufferlist snapbl;
- if (!destdnl->get_inode()->snaprealm) {
- destdnl->get_inode()->open_snaprealm(true); // don't do a split
- destdnl->get_inode()->snaprealm->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
- destdnl->get_inode()->close_snaprealm(true); // or a matching join
- } else
- destdnl->get_inode()->snaprealm->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
+ destdnl->get_inode()->project_past_parent(straydn->get_dir()->inode->find_snaprealm(), snapbl);
straydn->first = destdnl->get_inode()->first; // XXX hmm, is this right?
tji = metablob->add_primary_dentry(straydn, true, destdnl->get_inode(), 0, &snapbl);
} else if (destdnl->is_remote()) {
// project snap parent update?
bufferlist snapbl;
if (destdn->is_auth() && srcdnl->get_inode()->snaprealm)
- srcdnl->get_inode()->snaprealm->project_past_parent(destdn->get_dir()->inode->find_snaprealm(), snapbl);
+ srcdnl->get_inode()->project_past_parent(destdn->get_dir()->inode->find_snaprealm(), snapbl);
if (!destdnl->is_null())
mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl);
-
-void SnapRealm::project_past_parent(SnapRealm *newparent, bufferlist& snapbl)
-{
- snapid_t newlast = newparent->get_last_created();
- snapid_t oldlast = parent->get_newest_seq();
- snapid_t first = srnode.current_parent_since;
-
- if (oldlast >= srnode.current_parent_since) {
- srnode.past_parents[oldlast].ino = parent->inode->ino();
- srnode.past_parents[oldlast].first = first;
- dout(10) << "project_past_parent new past_parent [" << first << "," << oldlast << "] = "
- << parent->inode->ino() << dendl;
- }
- srnode.current_parent_since = MAX(oldlast, newlast) + 1;
- dout(10) << "project_past_parent current_parent_since " << srnode.current_parent_since << dendl;
-
- ::encode(*this, snapbl);
-
- if (oldlast >= first)
- srnode.past_parents.erase(oldlast);
- srnode.current_parent_since = first;
-}
-
void SnapRealm::add_past_parent(SnapRealm *oldparent)
{
snapid_t newlast = parent->get_last_created();
void add_open_past_parent(SnapRealm *parent);
void close_parents();
- void project_past_parent(SnapRealm *newparent, bufferlist& snapbl);
void add_past_parent(SnapRealm *oldparent);
void prune_past_parents();
bool has_past_parents() { return !srnode.past_parents.empty(); }