]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
MDS: move slave rename xlock handling before finish_export_inode.
authorGreg Farnum <gregory.farnum@dreamhost.com>
Sat, 16 Apr 2011 01:00:57 +0000 (18:00 -0700)
committerSage Weil <sage@newdream.net>
Mon, 18 Apr 2011 17:41:29 +0000 (10:41 -0700)
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 <gregory.farnum@dreamhost.com>
src/mds/Server.cc

index e39e4ccaf7c52b123048e1e092c4f551ecabba3e..7841d77221349ad8dd437e66db76255021c74a57 100644 (file)
@@ -5658,22 +5658,6 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
        destdnl->get_inode()->state_test(CInode::STATE_AMBIGUOUSAUTH)) {
       list<Context*> 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<SimpleLock*>::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();