When replaying slave update, inode may gets unlinked, but preserved
in memory in case of rollback. In this case, we need to detach the
inode's snaprealm from its parent.
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
void SnapRealm::adjust_parent()
{
- SnapRealm *newparent = inode->get_parent_dn()->get_dir()->get_inode()->find_snaprealm();
+ CDentry *pdn = inode->get_parent_dn();
+ SnapRealm *newparent = pdn ? pdn->get_dir()->get_inode()->find_snaprealm() : NULL;
if (newparent != parent) {
dout(10) << "adjust_parent " << parent << " -> " << newparent << dendl;
if (parent)
unlinked.erase(*p);
dout(10) << " unlinked set contains " << unlinked << dendl;
for (map<CInode*, CDir*>::iterator p = unlinked.begin(); p != unlinked.end(); ++p) {
- if (slaveup) // preserve unlinked inodes until slave commit
- slaveup->unlinked.insert(p->first);
- else
- mds->mdcache->remove_inode_recursive(p->first);
+ CInode *in = p->first;
+ if (slaveup) { // preserve unlinked inodes until slave commit
+ slaveup->unlinked.insert(in);
+ if (in->snaprealm)
+ in->snaprealm->adjust_parent();
+ } else
+ mds->mdcache->remove_inode_recursive(in);
}
}