From 6058a36c4eb8b8190afb366212fd9aed7e659b1d Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 15 Apr 2011 18:00:57 -0700 Subject: [PATCH] MDS: move slave rename xlock handling before finish_export_inode. finish_export_inode changes states! That's not good for our checks, so just handle unpinning and stuff before we finish_export_inode. Signed-off-by: Greg Farnum --- src/mds/Server.cc | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e39e4ccaf7c52..7841d77221349 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5658,22 +5658,6 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r, destdnl->get_inode()->state_test(CInode::STATE_AMBIGUOUSAUTH)) { list finished; - dout(10) << " finishing inode export on " << *destdnl->get_inode() << dendl; - mdcache->migrator->finish_export_inode(destdnl->get_inode(), mdr->now, finished); - mds->queue_waiters(finished); // this includes SINGLEAUTH waiters. - - // singleauth - assert(destdnl->get_inode()->state_test(CInode::STATE_AMBIGUOUSAUTH)); - destdnl->get_inode()->state_clear(CInode::STATE_AMBIGUOUSAUTH); - destdnl->get_inode()->take_waiting(CInode::WAIT_SINGLEAUTH, finished); - - // unfreeze - assert(destdnl->get_inode()->is_frozen_inode() || - destdnl->get_inode()->is_freezing_inode()); - destdnl->get_inode()->unfreeze_inode(finished); - - mds->queue_waiters(finished); - // drop our pins // we exported, clear out any xlocks that we moved to another MDS set::iterator i = mdr->xlocks.begin(); @@ -5699,6 +5683,22 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r, mdr->xlocks.erase(i++); mdr->locks.erase(lock); } + + dout(10) << " finishing inode export on " << *destdnl->get_inode() << dendl; + mdcache->migrator->finish_export_inode(destdnl->get_inode(), mdr->now, finished); + mds->queue_waiters(finished); // this includes SINGLEAUTH waiters. + + // singleauth + assert(destdnl->get_inode()->state_test(CInode::STATE_AMBIGUOUSAUTH)); + destdnl->get_inode()->state_clear(CInode::STATE_AMBIGUOUSAUTH); + destdnl->get_inode()->take_waiting(CInode::WAIT_SINGLEAUTH, finished); + + // unfreeze + assert(destdnl->get_inode()->is_frozen_inode() || + destdnl->get_inode()->is_freezing_inode()); + destdnl->get_inode()->unfreeze_inode(finished); + + mds->queue_waiters(finished); } mdr->cleanup(); -- 2.39.5