From 1594a2bf74514ede4a768c1544bd47982b1428c6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 24 Jul 2008 15:52:00 -0700 Subject: [PATCH] mds: leave remote links behind on dir rename --- src/mds/CInode.h | 2 ++ src/mds/MDCache.cc | 11 +++++++++++ src/mds/Server.cc | 5 ++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 2a15fc4924952..c1598ef1ed40f 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -330,6 +330,8 @@ private: inodeno_t ino() const { return inode.ino; } vinodeno_t vino() const { return vinodeno_t(inode.ino, last); } + int d_type() const { return MODE_TO_DT(inode.mode); } + inode_t& get_inode() { return inode; } CDentry* get_parent_dn() { return parent; } CDentry* get_projected_parent_dn() { return projected_parent ? projected_parent:parent; } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 56e650272a3ea..4838bb4dc18fe 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1053,6 +1053,17 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll return; in->cow_old_inode(follows, in->get_previous_projected_inode()); + + if (in->get_projected_parent_dn() != dn) { + snapid_t oldfirst = dn->first; + dn->first = follows+1; + CDentry *olddn = dn->dir->add_remote_dentry(dn->name, in->ino(), in->d_type(), + oldfirst, follows); + dout(10) << " olddn " << *olddn << dendl; + metablob->add_remote_dentry(olddn, true); + + // FIXME: adjust link count here? hmm. + } } else { if (follows == CEPH_NOSNAP) follows = dn->dir->inode->find_snaprealm()->get_latest_snap(); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 01ae0156acb6e..8c12f83dc4a39 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2318,7 +2318,7 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti) le->metablob.add_client_req(mdr->reqid); mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->dir, PREDIRTY_DIR, 1); // new dn mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, 0, PREDIRTY_PRIMARY); // targeti - le->metablob.add_remote_dentry(dn, true, targeti->ino(), MODE_TO_DT(targeti->inode.mode)); // new remote + le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type()); // new remote mdcache->journal_dirty_inode(&le->metablob, targeti); mdlog->submit_entry(le, new C_MDS_link_local_finish(mds, mdr, dn, targeti, dnpv, tipv)); @@ -2410,8 +2410,7 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti if (inc) { dn->pre_dirty(); mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->dir, PREDIRTY_DIR, 1); - le->metablob.add_remote_dentry(dn, true, targeti->ino(), - MODE_TO_DT(targeti->inode.mode)); // new remote + le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type()); // new remote } else { dn->pre_dirty(); mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->dir, PREDIRTY_DIR, -1); -- 2.39.5