From 3d93ca01431e047ac18651e5e30258f9232d3d2c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 24 Dec 2008 14:18:06 -0800 Subject: [PATCH] mds: link on commit in openc; make find_snaprealm() follow projected_parent for unlinked inode Linking inode in early confuses CDir::_committed(). --- src/mds/CInode.cc | 10 ++++++++-- src/mds/Server.cc | 5 ++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 97d32c5000533..ce200ed9129cb 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1248,8 +1248,14 @@ void CInode::close_snaprealm(bool nojoin) SnapRealm *CInode::find_snaprealm() { CInode *cur = this; - while (cur->get_parent_dn() && !cur->snaprealm) - cur = cur->get_parent_dn()->get_dir()->get_inode(); + while (!cur->snaprealm) { + if (cur->get_parent_dn()) + cur = cur->get_parent_dn()->get_dir()->get_inode(); + else if (cur == this && get_projected_parent_dn()) + cur = get_projected_parent_dn()->get_dir()->get_inode(); + else + break; + } return cur->snaprealm; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e17c8efde42ed..b6553ebf72042 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4984,6 +4984,8 @@ public: void finish(int r) { assert(r == 0); + dn->get_dir()->link_primary_inode(dn, newi); + // dirty inode, dn, dir newi->mark_dirty(newi->inode.version + 1, mdr->ls); @@ -5052,9 +5054,6 @@ void Server::handle_client_openc(MDRequest *mdr) dn->first = in->first = follows+1; - // link now, so that in->parent is set and find_snaprealm() works. - dn->dir->link_primary_inode(dn, in); - // prepare finisher mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "openc"); -- 2.47.3