summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-17 11:45:04 -0700
committerSage Weil <sage@inktank.com>2013-06-24 21:21:47 -0700
commit809bebb55ac2aececcb04505cf3f879957278af1 (patch)
treedfcb34702869b752cbc97378b5a322ce41a1d36a
parent46c5681be5ca32fbdf1afb193022095b5ce77873 (diff)
downloadceph-809bebb55ac2aececcb04505cf3f879957278af1.tar.gz
client: refactor _lookup; fix NULL dentry case
Return ENOENT for a valid NULL dentry in our cache. Restructure _lookup to avoid duplicating some code. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/client/Client.cc20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index 5d50caa3c8d..f390cbe3105 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -3931,6 +3931,7 @@ int Client::_do_lookup(Inode *dir, const string& name, Inode **target)
int Client::_lookup(Inode *dir, const string& dname, Inode **target)
{
int r = 0;
+ Dentry *dn = NULL;
if (!dir->is_dir()) {
r = -ENOTDIR;
@@ -3963,7 +3964,7 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
if (dir->dir &&
dir->dir->dentries.count(dname)) {
- Dentry *dn = dir->dir->dentries[dname];
+ dn = dir->dir->dentries[dname];
ldout(cct, 20) << "_lookup have dn " << dname << " mds." << dn->lease_mds << " ttl " << dn->lease_ttl
<< " seq " << dn->lease_seq
@@ -3977,12 +3978,10 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
MetaSession *s = mds_sessions[dn->lease_mds];
if (s->cap_ttl > now &&
s->cap_gen == dn->lease_gen) {
- *target = dn->inode;
// touch this mds's dir cap too, even though we don't _explicitly_ use it here, to
// make trim_caps() behave.
dir->try_touch_cap(dn->lease_mds);
- touch_dn(dn);
- goto done;
+ goto hit_dn;
}
ldout(cct, 20) << " bad lease, cap_ttl " << s->cap_ttl << ", cap_gen " << s->cap_gen
<< " vs lease_gen " << dn->lease_gen << dendl;
@@ -3990,9 +3989,7 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
// dir lease?
if (dir->caps_issued_mask(CEPH_CAP_FILE_SHARED) &&
dn->cap_shared_gen == dir->shared_gen) {
- *target = dn->inode;
- touch_dn(dn);
- goto done;
+ goto hit_dn;
}
} else {
// can we conclude ENOENT locally?
@@ -4004,6 +4001,15 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
}
r = _do_lookup(dir, dname, target);
+ goto done;
+
+ hit_dn:
+ if (dn->inode) {
+ *target = dn->inode;
+ } else {
+ r = -ENOENT;
+ }
+ touch_dn(dn);
done:
if (r < 0)