This provides the client with a lease on a dentry's nonexistence,
allowing it to avoid repetitive ENOENT lookups.
// dentry is mine.
if (curdir->is_complete()) {
// file not found
+ if (pdnvec) {
+ // instantiate a null dn
+ if (dn) {
+ dout(20) << " had null " << *dn << dendl;
+ assert(dnl->is_null());
+ } else {
+ // create a null dentry
+ dn = curdir->add_null_dentry(path[depth]);
+ dout(20) << " added null " << *dn << dendl;
+ }
+ pdnvec->push_back(dn);
+ }
return -ENOENT;
} else {
// directory isn't complete; reload
int r = mdcache->path_traverse(mdr, 0, refpath, &mdr->dn[n], &mdr->in[n], MDS_TRAVERSE_FORWARD);
if (r > 0) return false; // delayed
if (r < 0) { // error
- reply_request(mdr, r);
+ if (r == -ENOENT && n == 0) {
+ reply_request(mdr, r, NULL, mdr->dn[n][mdr->dn[n].size()-1]);
+ } else {
+ reply_request(mdr, r);
+ }
return 0;
}
CInode *ref = mdr->in[n];