From: Sage Weil Date: Fri, 17 May 2013 18:45:04 +0000 (-0700) Subject: client: refactor _lookup; fix NULL dentry case X-Git-Tag: v0.81~19^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=727ad6487114423383d7ffdab6e0e0064d753d8e;p=ceph.git 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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index b1e21a3dd6f..300ba1126bf 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -4247,6 +4247,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; @@ -4279,7 +4280,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 @@ -4294,12 +4295,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; @@ -4307,9 +4306,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 { ldout(cct, 20) << " no cap on " << dn->inode->vino() << dendl; @@ -4324,6 +4321,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)