C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather> *fin = new C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather>(g_ceph_context);
finish_export_dir(dir, ceph_clock_now(g_ceph_context), it->second.peer,
it->second.peer_imported, fin->contexts, &num_dentries);
- dir->add_waiter(CDir::WAIT_UNFREEZE, fin);
-
- // unfreeze
- dout(7) << "export_finish unfreezing" << dendl;
- dir->unfreeze_tree();
// unpin bounds
set<CDir*> bounds;
// no more auth subtree? clear scatter dirty
if (!dir->get_inode()->is_auth() &&
- !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+ !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid())) {
dir->get_inode()->clear_scatter_dirty();
+ // wake up scatter_nudge waiters
+ dir->get_inode()->take_waiting(CInode::WAIT_ANY_MASK, fin->contexts);
+ }
+
+ dir->add_waiter(CDir::WAIT_UNFREEZE, fin);
+
+ // unfreeze
+ dout(7) << "export_finish unfreezing" << dendl;
+ dir->unfreeze_tree();
// discard delayed expires
cache->discard_delayed_expire(dir);
cache->adjust_subtree_auth(dir, stat.peer);
+ C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather> *fin = new C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather>(g_ceph_context);
if (!dir->get_inode()->is_auth() &&
- !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+ !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid())) {
dir->get_inode()->clear_scatter_dirty();
+ // wake up scatter_nudge waiters
+ dir->get_inode()->take_waiting(CInode::WAIT_ANY_MASK, fin->contexts);
+ }
int num_dentries = 0;
// adjust auth bits.
if (in->is_dirty())
in->mark_clean();
in->clear_dirty_rstat();
- if (!in->has_subtree_root_dirfrag(mds->get_nodeid()))
+ if (!in->has_subtree_root_dirfrag(mds->get_nodeid())) {
in->clear_scatter_dirty();
+ in->take_waiting(CInode::WAIT_ANY_MASK, fin->contexts);
+ }
in->clear_dirty_parent();
}
}
+ dir->add_waiter(CDir::WAIT_UNFREEZE, fin);
+
if (stat.state == IMPORT_ACKING) {
// remove imported caps
for (map<CInode*,map<client_t,Capability::Export> >::iterator p = stat.peer_exports.begin();
assert(dir);
dout(7) << "import_reverse_unfreeze " << *dir << dendl;
dir->unfreeze_tree();
- list<MDSInternalContextBase*> ls;
- mds->queue_waiters(ls);
cache->discard_delayed_expire(dir);
import_reverse_final(dir);
}
return;
}
- // clear updated scatterlocks
- /*
- for (list<ScatterLock*>::iterator p = import_updated_scatterlocks[dir].begin();
- p != import_updated_scatterlocks[dir].end();
- ++p)
- (*p)->clear_updated();
- */
-
// remove pins
set<CDir*> bounds;
cache->get_subtree_bounds(dir, bounds);
mds->mdsmap->get_up_features());
prepare_force_open_sessions(mdr->more()->imported_client_map, mdr->more()->sseq_map);
- list<ScatterLock*> updated_scatterlocks; // we clear_updated explicitly below
+ list<ScatterLock*> updated_scatterlocks;
mdcache->migrator->decode_import_inode(srcdn, blp,
srcdn->authority().first,
mdr->ls, 0,
mdr->more()->cap_imports, updated_scatterlocks);
- srcdnl->get_inode()->filelock.remove_dirty();
- srcdnl->get_inode()->nestlock.remove_dirty();
// hack: force back to !auth and clean, temporarily
srcdnl->get_inode()->state_clear(CInode::STATE_AUTH);