}
 };
 
-void MDCache::split_dir(CDir *dir, int bits)
+
+bool MDCache::can_fragment(CInode *diri, list<CDir*>& dirs)
 {
-  dout(7) << "split_dir " << *dir << " bits " << bits << dendl;
-  assert(dir->is_auth());
-  
   if (mds->mdsmap->is_degraded()) {
     dout(7) << "cluster degraded, no fragmenting for now" << dendl;
-    return;
-  }
-  if (dir->inode->is_base()) {
-    dout(7) << "i won't fragment root/base" << dendl;
-    //assert(0);
-    return;
-  }
-  if (dir->inode->get_parent_dir() &&
-      dir->inode->get_parent_dir()->get_inode()->is_stray()) {
-    dout(7) << "i won't split anything in stray" << dendl;
-    return;
+    return false;
   }
-  if (dir->is_frozen() ||
-      dir->is_freezing()) {
-    dout(7) << " can't fragment, freezing|frozen.  wait for other exports to finish first." << dendl;
-    return;
+  if (diri->get_parent_dir() &&
+      diri->get_parent_dir()->get_inode()->is_stray()) {
+    dout(7) << "i won't merge|split anything in stray" << dendl;
+    return false;
   }
-  if (dir->state_test(CDir::STATE_FRAGMENTING)) {
-    dout(7) << "already fragmenting" << dendl;
-    return;
+
+  for (list<CDir*>::iterator p = dirs.begin(); p != dirs.end(); p++) {
+    CDir *dir = *p;
+    if (dir->state_test(CDir::STATE_FRAGMENTING)) {
+      dout(7) << " already fragmenting " << *dir << dendl;
+      return false;
+    }
+    if (!dir->is_auth()) {
+      dout(7) << " not auth on " << *dir << dendl;
+      return false;
+    }
+    if (dir->is_frozen() ||
+       dir->is_freezing()) {
+      dout(7) << " can't merge, freezing|frozen.  wait for other exports to finish first." << dendl;
+      return false;
+    }
   }
 
-  // ok.
+  return true;
+}
+
+
+void MDCache::split_dir(CDir *dir, int bits)
+{
+  dout(7) << "split_dir " << *dir << " bits " << bits << dendl;
+  assert(dir->is_auth());
+  CInode *diri = dir->inode;
   list<CDir*> dirs;
   dirs.push_back(dir);
 
+  if (!can_fragment(diri, dirs))
+    return;
+
   C_Gather *gather = new C_Gather(new C_MDC_FragmentFrozen(this, dirs, dir->get_frag(), bits));
   fragment_freeze_dirs(dirs, gather);
 
 {
   dout(7) << "merge_dir to " << frag << " on " << *diri << dendl;
 
-  if (mds->mdsmap->is_degraded()) {
-    dout(7) << "cluster degraded, no fragmenting for now" << dendl;
-    return;
-  }
-  if (diri->get_parent_dir() &&
-      diri->get_parent_dir()->get_inode()->is_stray()) {
-    dout(7) << "i won't merge|split anything in stray" << dendl;
-    return;
-  }
-
   list<CDir*> dirs;
   if (!diri->get_dirfrags_under(frag, dirs)) {
     dout(7) << "don't have all frags under " << frag << " for " << *diri << dendl;
     return;
   }
 
-  for (list<CDir*>::iterator p = dirs.begin(); p != dirs.end(); p++) {
-    CDir *dir = *p;
-    if (dir->state_test(CDir::STATE_FRAGMENTING)) {
-      dout(7) << " already fragmenting " << *dir << dendl;
-      return;
-    }
-    if (!dir->is_auth()) {
-      dout(7) << " not auth on " << *dir << dendl;
-      return;
-    }
-    if (dir->is_frozen() ||
-       dir->is_freezing()) {
-      dout(7) << " can't merge, freezing|frozen.  wait for other exports to finish first." << dendl;
-      return;
-    }
-  }
+  if (!can_fragment(diri, dirs))
+    return;
 
   C_Gather *gather = new C_Gather(new C_MDC_FragmentFrozen(this, dirs, frag, 0));
   fragment_freeze_dirs(dirs, gather);