From: Sage Weil Date: Tue, 8 Apr 2008 00:00:51 +0000 (-0700) Subject: mds: fix rename dirtying goofup X-Git-Tag: v0.3~239^2~78 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2302510700a7c1313655df70c432c4932b8a4ddf;p=ceph.git mds: fix rename dirtying goofup --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index ec6563b1a98e..6d2bf1652e9d 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3271,7 +3271,18 @@ void Server::_rename_prepare(MDRequest *mdr, // add dest dentry metablob->add_dir_context(destdn->dir); - if (srcdn->is_primary()) { + if (srcdn->is_remote()) { + dout(10) << "src is a remote dentry" << dendl; + if (destdn->is_auth()) + mdr->more()->pvmap[destdn] = destdn->pre_dirty(); + metablob->add_remote_dentry(destdn, true, srcdn->get_remote_ino(), + srcdn->get_remote_d_type()); + if (srcdn->inode->is_auth()) { + sipv = srcdn->inode->pre_dirty(); + sji = metablob->add_primary_dentry(srcdn->inode->get_parent_dn(), true); + } + } else { + assert(srcdn->is_primary()); dout(10) << "src is a primary dentry" << dendl; if (destdn->is_auth()) { if (srcdn->is_auth()) @@ -3300,18 +3311,10 @@ void Server::_rename_prepare(MDRequest *mdr, srcdn->inode->state_clear(CInode::STATE_AUTH); srcdn->inode->mark_clean(); } - mdr->more()->pvmap[destdn] = destdn->pre_dirty(sipv+1); + sipv = mdr->more()->pvmap[destdn] = destdn->pre_dirty(sipv+1); } sji = metablob->add_primary_dentry(destdn, true, srcdn->inode); srcdn->inode->projected_parent = destdn; - - } else { - assert(srcdn->is_remote()); - dout(10) << "src is a remote dentry" << dendl; - if (destdn->is_auth()) - mdr->more()->pvmap[destdn] = destdn->pre_dirty(); - metablob->add_remote_dentry(destdn, true, srcdn->get_remote_ino(), - srcdn->get_remote_d_type()); } // remove src dentry @@ -3453,15 +3456,12 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen // hack: fix auth bit destdn->inode->state_set(CInode::STATE_AUTH); } - if (destdn->inode->is_auth()) - destdn->inode->mark_dirty(mdr->more()->pvmap[destdn], mdr->ls); } + if (destdn->inode->is_auth()) + destdn->inode->pop_and_dirty_projected_inode(mdr->ls); if (srcdn->is_auth()) srcdn->mark_dirty(mdr->more()->pvmap[srcdn], mdr->ls); - - if (destdn->inode->is_auth()) - destdn->inode->pop_and_dirty_projected_inode(mdr->ls); } // update subtree map?