From: Jos Collin Date: Thu, 8 Feb 2018 12:31:28 +0000 (+0530) Subject: Handle dir->dentries.empty() X-Git-Tag: v13.0.2~236^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F20168%2Fhead;p=ceph.git Handle dir->dentries.empty() Handle dir->dentries.empty() (during stale file handle error) situation appropriately. Fixes: http://tracker.ceph.com/issues/21995 Signed-off-by: Jos Collin --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 4265fa79b604..03b8e042b6ec 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6083,8 +6083,23 @@ int Client::_lookup(Inode *dir, const string& dname, int mask, InodeRef *target, } if (dname == "..") { - if (dir->dentries.empty()) - *target = dir; + if (dir->dentries.empty()) { + MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LOOKUPPARENT); + filepath path(dir->ino); + req->set_filepath(path); + + InodeRef tmptarget; + int r = make_request(req, perms, &tmptarget, NULL, rand() % mdsmap->get_num_in_mds()); + + if (r == 0) { + Inode *tempino = tmptarget.get(); + _ll_get(tempino); + *target = tempino; + ldout(cct, 3) << __func__ << " found target " << (*target)->ino << dendl; + } else { + *target = dir; + } + } else *target = dir->get_first_parent()->dir->parent_inode; //dirs can't be hard-linked goto done;