From 22b5f6036e608c6136b82e4d8a6e4183e586a946 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 3 Oct 2008 13:34:31 -0700 Subject: [PATCH] mds: create snaprealm for stray dentries resulting from rename This was done in the unlink path, but overlooked by rename(), resulting in problems down the line when the stray nlink=0 item was purged. --- src/mds/MDCache.cc | 1 + src/mds/Server.cc | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 5fd112744dc86..b35bcc161d569 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -4075,6 +4075,7 @@ void MDCache::_do_purge_inode(CInode *in, loff_t newsize, loff_t oldsize) // remove if (newsize < oldsize) { SnapRealm *realm = in->find_snaprealm(); + assert(realm); 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; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index a44fb65dbd2ac..e1e1e49567f3e 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3738,7 +3738,15 @@ void Server::_rename_prepare(MDRequest *mdr, // target inode if (!linkmerge) { if (destdn->is_primary()) { - tji = metablob->add_primary_dentry(straydn, true, destdn->inode, tpi); + // project snaprealm, too + bufferlist snapbl; + if (!destdn->inode->snaprealm) { + destdn->inode->open_snaprealm(true); // don't do a split + destdn->inode->snaprealm->project_past_parent(straydn->dir->inode->snaprealm, snapbl); + destdn->inode->close_snaprealm(true); // or a matching join + } else + destdn->inode->snaprealm->project_past_parent(straydn->dir->inode->snaprealm, snapbl); + tji = metablob->add_primary_dentry(straydn, true, destdn->inode, tpi, 0, &snapbl); } else if (destdn->is_remote()) { metablob->add_dir_context(destdn->inode->get_parent_dir()); mdcache->journal_cow_dentry(mdr, metablob, destdn->inode->parent); @@ -3829,6 +3837,20 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen dout(10) << "straydn is " << *straydn << dendl; destdn->dir->unlink_inode(destdn); straydn->dir->link_primary_inode(straydn, oldin); + + if (straydn->is_auth()) { + SnapRealm *oldparent = destdn->dir->inode->find_snaprealm(); + bool isnew = false; + if (!straydn->inode->snaprealm) { + straydn->inode->open_snaprealm(); + straydn->inode->snaprealm->seq = oldparent->get_newest_seq(); + isnew = true; + } + straydn->inode->snaprealm->add_past_parent(oldparent); + if (isnew) + mdcache->do_realm_invalidate_and_update_notify(straydn->inode, CEPH_SNAP_OP_SPLIT); + } + } else { destdn->dir->unlink_inode(destdn); } -- 2.39.5