++p) {
// we may have had incorrect dir fragmentation; refragment based
// on what they auth tells us.
- CDir *dir = get_dirfrag(p->first);
- if (!dir) {
- dir = get_force_dirfrag(p->first);
- if (dir)
- refragged_inodes.insert(dir->get_inode());
+ CInode *diri = get_inode(p->first.ino);
+ CDir *dir = NULL;
+ if (diri) {
+ dir = diri->get_dirfrag(p->first.frag);
+ if (!dir) {
+ dir = force_dir_fragment(diri, p->first.frag, false);
+ if (dir)
+ refragged_inodes.insert(dir->get_inode());
+ }
}
if (!dir) {
- CInode *diri = get_inode(p->first.ino);
if (!diri) {
// barebones inode; the full inode loop below will clean up.
diri = new CInode(this, false);
adjust_dir_fragments(diri, srcfrags, basefrag, bits, resultfrags, waiters, replay);
}
-CDir *MDCache::force_dir_fragment(CInode *diri, frag_t fg)
+CDir *MDCache::force_dir_fragment(CInode *diri, frag_t fg, bool replay)
{
CDir *dir = diri->get_dirfrag(fg);
if (dir)
int split = fg.bits() - parent.bits();
dout(10) << " splitting parent by " << split << " " << *pdir << dendl;
src.push_back(pdir);
- adjust_dir_fragments(diri, src, parent, split, result, waiters, true);
+ adjust_dir_fragments(diri, src, parent, split, result, waiters, replay);
dir = diri->get_dirfrag(fg);
if (dir)
dout(10) << "force_dir_fragment result " << *dir << dendl;
return NULL;
}
dout(10) << " will combine frags under " << fg << ": " << src << dendl;
- adjust_dir_fragments(diri, src, fg, 0, result, waiters, true);
+ adjust_dir_fragments(diri, src, fg, 0, result, waiters, replay);
dir = result.front();
dout(10) << "force_dir_fragment result " << *dir << dendl;
return dir;
list<CDir*>& resultfrags,
list<Context*>& waiters,
bool replay);
- CDir *force_dir_fragment(CInode *diri, frag_t fg);
+ CDir *force_dir_fragment(CInode *diri, frag_t fg, bool replay=true);
void get_force_dirfrag_bound_set(vector<dirfrag_t>& dfs, set<CDir*>& bounds);
bool can_fragment(CInode *diri, list<CDir*>& dirs);