if (cur->state_test(CInode::STATE_PURGING))
return -ESTALE;
+ // make sure snaprealm are open...
+ if (mdr && cur->snaprealm && !cur->snaprealm->open &&
+ !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) {
+ return 1;
+ }
+
// start trace
if (pdnvec)
pdnvec->clear();
}
*/
- // make sure snaprealm parents are open...
- if (cur->snaprealm && !cur->snaprealm->open && mdr &&
- !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) {
- return 1;
- }
-
-
// dentry
CDentry *dn = curdir->lookup(path[depth], snapid);
CDentry::linkage_t *dnl = dn ? dn->get_projected_linkage() : 0;
}
}
- // add to trace, continue.
cur = in;
+ // make sure snaprealm are open...
+ if (mdr && cur->snaprealm && !cur->snaprealm->open &&
+ !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) {
+ return 1;
+ }
+
+ // add to trace, continue.
touch_inode(cur);
if (pdnvec)
pdnvec->push_back(dn);
return;
}
+ if (mdr && in->snaprealm &&
+ !in->snaprealm->open_parents(new C_MDS_RetryRequest(mdcache, mdr))) {
+ return;
+ }
+
CDentry *dn = in->get_projected_parent_dn();
CInode *diri = dn ? dn->get_dir()->inode : NULL;
if (dn && (want_parent || want_dentry)) {