]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: link on commit in openc; make find_snaprealm() follow projected_parent for unlin...
authorSage Weil <sage@newdream.net>
Wed, 24 Dec 2008 22:18:06 +0000 (14:18 -0800)
committerSage Weil <sage@newdream.net>
Wed, 24 Dec 2008 22:19:30 +0000 (14:19 -0800)
Linking inode in early confuses CDir::_committed().

src/mds/CInode.cc
src/mds/Server.cc

index 97d32c5000533d4b349c4eb3c0000a912003baeb..ce200ed9129cb11a8e62709d8524a880a37f9430 100644 (file)
@@ -1248,8 +1248,14 @@ void CInode::close_snaprealm(bool nojoin)
 SnapRealm *CInode::find_snaprealm()
 {
   CInode *cur = this;
-  while (cur->get_parent_dn() && !cur->snaprealm)
-    cur = cur->get_parent_dn()->get_dir()->get_inode();
+  while (!cur->snaprealm) {
+    if (cur->get_parent_dn())
+      cur = cur->get_parent_dn()->get_dir()->get_inode();
+    else if (cur == this && get_projected_parent_dn())
+      cur = get_projected_parent_dn()->get_dir()->get_inode();
+    else
+      break;
+  }
   return cur->snaprealm;
 }
 
index e17c8efde42ed2733b0bf465b6eb6f808212e51d..b6553ebf72042ee4e637261c4c0a22d8da1616fe 100644 (file)
@@ -4984,6 +4984,8 @@ public:
   void finish(int r) {
     assert(r == 0);
 
+    dn->get_dir()->link_primary_inode(dn, newi);
+
     // dirty inode, dn, dir
     newi->mark_dirty(newi->inode.version + 1, mdr->ls);
 
@@ -5052,9 +5054,6 @@ void Server::handle_client_openc(MDRequest *mdr)
 
   dn->first = in->first = follows+1;
   
-  // link now, so that in->parent is set and find_snaprealm() works.
-  dn->dir->link_primary_inode(dn, in);
-
   // prepare finisher
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "openc");