]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix unlink snaprealm creation
authorSage Weil <sage@newdream.net>
Thu, 7 Aug 2008 17:31:25 +0000 (10:31 -0700)
committerSage Weil <sage@newdream.net>
Thu, 7 Aug 2008 17:31:25 +0000 (10:31 -0700)
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/Server.cc

index 2887bfd3d0d772bdea20b60ee690834fc30d35cf..47d2904334f89df8e7e6a8299e87dc7ce42fcdf2 100644 (file)
@@ -82,6 +82,9 @@ ostream& operator<<(ostream& out, CInode& in)
 #endif
   }
 
+  if (in.snaprealm)
+    out << " snaprealm=" << in.snaprealm;
+
   if (in.state_test(CInode::STATE_AMBIGUOUSAUTH)) out << " AMBIGAUTH";
   if (in.state_test(CInode::STATE_NEEDSRECOVER)) out << " needsrecover";
   if (in.state_test(CInode::STATE_RECOVERING)) out << " recovering";
index 2bb71a4976c4643e663ec11fd2f2633138cbc43d..0d98830981ffabcc458d9a7db3ede0c6b8563973 100644 (file)
@@ -4006,7 +4006,10 @@ void MDCache::_do_purge_inode(CInode *in, loff_t newsize, loff_t oldsize)
 
   // remove
   if (newsize < oldsize) {
-    const SnapContext& snapc = in->find_snaprealm()->get_snap_context();
+    SnapRealm *realm = in->find_snaprealm();
+    dout(10) << "_do_purge_inode realm " << *realm << dendl;
+    const SnapContext& snapc = realm->get_snap_context();
+    dout(10) << "_do_purge_inode snapc " << snapc << " on " << *in << dendl;
     mds->filer->remove(in->inode.ino, &in->inode.layout, snapc,
                       newsize, oldsize-newsize, 0,
                       0, new C_MDC_PurgeFinish(this, in, newsize, oldsize));
index 6b761d7347a9fcea777c1da30dff08ef72bc2868..b0209c0455455528a2847ac6815f89a4cdcb4456 100644 (file)
@@ -3007,12 +3007,18 @@ void Server::_unlink_local_finish(MDRequest *mdr,
   if (straydn) {
     dout(20) << " straydn is " << *straydn << dendl;
     straydn->dir->link_primary_inode(straydn, in);
-
+    
+    SnapRealm *oldparent = dn->dir->inode->find_snaprealm();
+    
+    bool isnew = false;
     if (!straydn->inode->snaprealm) {
       straydn->inode->open_snaprealm();
-      mdcache->do_realm_split_notify(straydn->inode);
+      straydn->inode->snaprealm->seq = oldparent->get_newest_seq();
+      isnew = true;
     }
-    straydn->inode->snaprealm->add_past_parent(dn->dir->inode->find_snaprealm());
+    straydn->inode->snaprealm->add_past_parent(oldparent);
+    if (isnew)
+      mdcache->do_realm_split_notify(straydn->inode);
   }
 
   dn->mark_dirty(dnpv, mdr->ls);