From: Yan, Zheng Date: Tue, 19 May 2015 07:28:09 +0000 (+0800) Subject: mds: fix CInode::pop_projected_snaprealm() X-Git-Tag: v9.0.2~40^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=55063a9fdf0f0059af396caaab4ddc81192578ab;p=ceph.git 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 --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 0a4cfc627bb..ea390e14dcf 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;