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 <zyan@redhat.com>
This commit is contained in:
Yan, Zheng 2015-05-19 15:28:09 +08:00
parent 6ed6a68e62
commit 55063a9fdf

View File

@ -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;