From 55063a9fdf0f0059af396caaab4ddc81192578ab Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 19 May 2015 15:28:09 +0800 Subject: [PATCH] mds: fix CInode::pop_projected_snaprealm() CInode::pop_projected_snaprealm() was called after calling CDentry::pop_projected_linkage(). So get_parent_inode()->find_snaprealm() is not past parent snaprealm. The fix is set snaprealm->open to 'false' and let SnapRealm::_open_parents() open the new past parent. Signed-off-by: Yan, Zheng --- src/mds/CInode.cc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 0a4cfc627bbd5..ea390e14dcf03 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -443,20 +443,11 @@ void CInode::pop_projected_snaprealm(sr_t *next_snaprealm) } else if (next_snaprealm->past_parents.size() != snaprealm->srnode.past_parents.size()) { invalidate_cached_snaps = true; + // re-open past parents + snaprealm->open = false; - // update parent pointer - assert(snaprealm->open); - assert(snaprealm->parent); // had a parent before - SnapRealm *new_parent = get_parent_inode()->find_snaprealm(); - assert(new_parent); - CInode *parenti = new_parent->inode; - assert(parenti); - assert(parenti->snaprealm); - snaprealm->parent = new_parent; - snaprealm->add_open_past_parent(new_parent); dout(10) << " realm " << *snaprealm << " past_parents " << snaprealm->srnode.past_parents << " -> " << next_snaprealm->past_parents << dendl; - dout(10) << " pinning new parent " << *parenti << dendl; } snaprealm->srnode = *next_snaprealm; delete next_snaprealm; -- 2.39.5