From: Sage Weil Date: Fri, 3 Oct 2008 20:34:31 +0000 (-0700) Subject: mds: create snaprealm for stray dentries resulting from rename X-Git-Tag: v0.4~32 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=22b5f6036e608c6136b82e4d8a6e4183e586a946;p=ceph.git 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. --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 5fd112744dc8..b35bcc161d56 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 a44fb65dbd2a..e1e1e49567f3 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); }