From 544a7e016b4245c36ec6a3b8d61516481085fbdd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 7 Aug 2008 10:31:25 -0700 Subject: [PATCH] mds: fix unlink snaprealm creation --- src/mds/CInode.cc | 3 +++ src/mds/MDCache.cc | 5 ++++- src/mds/Server.cc | 12 +++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 2887bfd3d0d77..47d2904334f89 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -82,6 +82,9 @@ ostream& operator<<(ostream& out, CInode& in) #endif } + if (in.snaprealm) + out << " snaprealm=" << in.snaprealm; + if (in.state_test(CInode::STATE_AMBIGUOUSAUTH)) out << " AMBIGAUTH"; if (in.state_test(CInode::STATE_NEEDSRECOVER)) out << " needsrecover"; if (in.state_test(CInode::STATE_RECOVERING)) out << " recovering"; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 2bb71a4976c46..0d98830981ffa 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -4006,7 +4006,10 @@ void MDCache::_do_purge_inode(CInode *in, loff_t newsize, loff_t oldsize) // remove if (newsize < oldsize) { - const SnapContext& snapc = in->find_snaprealm()->get_snap_context(); + SnapRealm *realm = in->find_snaprealm(); + 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; mds->filer->remove(in->inode.ino, &in->inode.layout, snapc, newsize, oldsize-newsize, 0, 0, new C_MDC_PurgeFinish(this, in, newsize, oldsize)); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 6b761d7347a9f..b0209c0455455 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3007,12 +3007,18 @@ void Server::_unlink_local_finish(MDRequest *mdr, if (straydn) { dout(20) << " straydn is " << *straydn << dendl; straydn->dir->link_primary_inode(straydn, in); - + + SnapRealm *oldparent = dn->dir->inode->find_snaprealm(); + + bool isnew = false; if (!straydn->inode->snaprealm) { straydn->inode->open_snaprealm(); - mdcache->do_realm_split_notify(straydn->inode); + straydn->inode->snaprealm->seq = oldparent->get_newest_seq(); + isnew = true; } - straydn->inode->snaprealm->add_past_parent(dn->dir->inode->find_snaprealm()); + straydn->inode->snaprealm->add_past_parent(oldparent); + if (isnew) + mdcache->do_realm_split_notify(straydn->inode); } dn->mark_dirty(dnpv, mdr->ls); -- 2.39.5