]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't journal src when not auth on rename
authorSage Weil <sage@newdream.net>
Fri, 6 May 2011 20:14:42 +0000 (13:14 -0700)
committerSage Weil <sage@newdream.net>
Fri, 6 May 2011 20:15:18 +0000 (13:15 -0700)
If we aren't auth for the srcdn, don't put it in the journal, or else we'll
barf on journal replay.

This fixes a crash reproduced with

sudo mkdir mnt/foo
sudo touch mnt/foo/a
sudo ln mnt/foo/a mnt/foo/b
sudo rm mnt/foo/a

sudo mkdir mnt/bar
sudo touch mnt/bar/nothing

./ceph mds tell 0 export_dir /bar 1

sudo mv mnt/foo/b mnt/bar/b

+ mds restart.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/Server.cc

index c4518ac923b18e4ad3715c263b5709ce7951836c..12d90a643f3c6464cc6773592f18e5a74a1bf48c 100644 (file)
@@ -5171,11 +5171,6 @@ void Server::_rename_prepare(MDRequest *mdr,
   if (destdn->is_auth())
     mdcache->predirty_journal_parents(mdr, metablob, srcdnl->get_inode(), destdn->get_dir(), flags, 1);
 
-  metablob->add_dir_context(srcdn->get_dir());
-  metablob->add_dir_context(destdn->get_dir());
-  if (straydn)
-    metablob->add_dir_context(straydn->get_dir());
-
   SnapRealm *dest_realm = destdn->get_dir()->inode->find_snaprealm();
   snapid_t next_dest_snap = dest_realm->get_newest_seq() + 1;
 
@@ -5204,8 +5199,10 @@ void Server::_rename_prepare(MDRequest *mdr,
       else
        destdn->first = MAX(destdn->first, next_dest_snap);
       metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type());
-      mdcache->journal_cow_dentry(mdr, metablob, srcdnl->get_inode()->get_parent_dn(), CEPH_NOSNAP, 0, srcdnl);
-      ji = metablob->add_primary_dentry(srcdnl->get_inode()->get_parent_dn(), true, srcdnl->get_inode());
+      if (srcdnl->get_inode()->is_auth()) {
+       mdcache->journal_cow_dentry(mdr, metablob, srcdnl->get_inode()->get_parent_dn(), CEPH_NOSNAP, 0, srcdnl);
+       ji = metablob->add_primary_dentry(srcdnl->get_inode()->get_parent_dn(), true, srcdnl->get_inode());
+      }
     } else {
       if (!destdnl->is_null())
        mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl);
@@ -5227,8 +5224,12 @@ void Server::_rename_prepare(MDRequest *mdr,
   }
     
   // src
-  mdcache->journal_cow_dentry(mdr, metablob, srcdn, CEPH_NOSNAP, 0, srcdnl);
-  metablob->add_null_dentry(srcdn, true);
+  if (srcdn->is_auth()) {
+    dout(10) << " journaling srcdn " << *srcdn << dendl;
+    mdcache->journal_cow_dentry(mdr, metablob, srcdn, CEPH_NOSNAP, 0, srcdnl);
+    metablob->add_null_dentry(srcdn, true);
+  } else
+    dout(10) << " NOT journaling srcdn " << *srcdn << dendl;
 
   // make renamed inode first track the dn
   if (srcdnl->is_primary() && destdn->is_auth())