From 884b936f4045ad475d83629daf6169c66a12e001 Mon Sep 17 00:00:00 2001 From: Jos Collin Date: Thu, 8 Feb 2018 18:01:28 +0530 Subject: [PATCH] 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 --- src/client/Client.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 4265fa79b60..03b8e042b6e 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; -- 2.39.5