From: Sage Weil Date: Thu, 7 Aug 2008 17:31:25 +0000 (-0700) Subject: mds: fix unlink snaprealm creation X-Git-Tag: v0.4~309 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=544a7e016b4245c36ec6a3b8d61516481085fbdd;p=ceph.git mds: fix unlink snaprealm creation --- 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);