diff options
author | Sage Weil <sage@inktank.com> | 2013-05-17 11:45:04 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-24 21:21:47 -0700 |
commit | 809bebb55ac2aececcb04505cf3f879957278af1 (patch) | |
tree | dfcb34702869b752cbc97378b5a322ce41a1d36a | |
parent | 46c5681be5ca32fbdf1afb193022095b5ce77873 (diff) | |
download | ceph-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.cc | 20 |
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) |