/**
* steal_dentry -- semi-violently move a dentry from one CDir to another
* (*) violently, in that nitems, most pins, etc. are not correctly maintained
- * on the old CDir corpse; must call purge_stolen() when finished.
+ * on the old CDir corpse; must call finish_old_fragment() when finished.
*/
void CDir::steal_dentry(CDentry *dn)
{
dn->dir = this;
}
-void CDir::purge_stolen(list<Context*>& waiters, bool replay)
+void CDir::prepare_new_fragment(bool replay)
+{
+ if (!replay && is_auth())
+ _freeze_dir();
+}
+
+void CDir::finish_old_fragment(list<Context*>& waiters, bool replay)
{
// take waiters _before_ unfreeze...
if (!replay) {
subfrags[n++] = f;
subs.push_back(f);
inode->add_dirfrag(f);
+
+ f->prepare_new_fragment(replay);
}
// repartition dentries
subfrags[0]->fnode.accounted_rstat.add_delta(zero, olddiff);
dout(10) << " " << subfrags[0]->fnode.accounted_fragstat << dendl;
- purge_stolen(waiters, replay);
+ finish_old_fragment(waiters, replay);
}
void CDir::merge(list<CDir*>& subs, list<Context*>& waiters, bool replay)
{
dout(10) << "merge " << subs << dendl;
+ prepare_new_fragment(replay);
+
// see if _any_ of the source frags have stale fragstat or rstat
int stale_rstat = 0;
int stale_fragstat = 0;
state_set(dir->get_state() & MASK_STATE_FRAGMENT_KEPT);
dir_auth = dir->dir_auth;
- dir->purge_stolen(waiters, replay);
+ dir->finish_old_fragment(waiters, replay);
inode->close_dirfrag(dir->get_frag());
}
}
private:
+ void prepare_new_fragment(bool replay);
void steal_dentry(CDentry *dn); // from another dir. used by merge/split.
- void purge_stolen(list<Context*>& waiters, bool replay);
+ void finish_old_fragment(list<Context*>& waiters, bool replay);
void init_fragment_pins();
q++)
for (set<inodeno_t>::iterator r = q->second.begin();
r != q->second.end();
- r++)
+ r++)
prepare_realm_split(in->snaprealm, q->first, *r, splits);
missing_snap_parents.erase(p++);
// freeze and store them too
dir->state_set(CDir::STATE_FRAGMENTING);
dir->commit(0, gather->new_sub(), true); // ignore authpinnability
- dir->_freeze_dir();
}
mds->mdlog->submit_entry(le, gather->new_sub());