From f8c02856d772ebf074e1ea3ecc117eaa15ae6598 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 18 Sep 2009 13:51:26 -0700 Subject: [PATCH] uclient: Functions to create Dentrys prior to gettin caps from mds. --- src/client/Client.cc | 25 +++++++++++++++++++++++++ src/client/Client.h | 19 ++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 4cc60f0e757a2..ef6f52c9774e6 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2982,6 +2982,31 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target) return r; } +int Client::get_or_create(Inode *dir, const string& name, Dentry **pdn) +{ + // lookup + if (dir->dir && dir->dir->dentries.count(name)) { + Dentry *dn = *pdn = dir->dir->dentries[name]; + + // is dn lease valid? + utime_t now = g_clock.now(); + if (dn->inode && + dn->lease_mds >= 0 && + dn->lease_ttl > now && + mds_sessions.count(dn->lease_mds)) { + MDSSession &s = mds_sessions[dn->lease_mds]; + if (s.cap_ttl > now && + s.cap_gen == dn->lease_gen) { + return -EEXIST; + } + } + } else { + // link up new one + *pdn = link(dir->dir, name.c_str(), NULL); + } + return 0; +} + int Client::path_walk(const filepath& origpath, Inode **final, bool followsym) { filepath path = origpath; diff --git a/src/client/Client.h b/src/client/Client.h index e190f835b80ef..75ad46f9689f5 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -946,6 +946,9 @@ protected: //int get_cache_size() { return lru.lru_get_size(); } //void set_cache_size(int m) { lru.lru_set_max(m); } + /** + * Don't call this with in==NULL, use get_or_create for that + */ Dentry* link(Dir *dir, const string& name, Inode *in) { Dentry *dn = new Dentry; dn->name = name; @@ -955,13 +958,14 @@ protected: //cout << "link dir " << dir->parent_inode->ino << " '" << name << "' -> inode " << in->ino << endl; dir->dentries[dn->name] = dn; - // link to inode - dn->inode = in; - assert(in->dn == 0); - in->dn = dn; - in->get(); - - if (in->dir) dn->get(); // dir -> dn pin + if (in) { // link to inode + dn->inode = in; + assert(in->dn == 0); + in->dn = dn; + in->get(); + + if (in->dir) dn->get(); // dir -> dn pin + } lru.lru_insert_mid(dn); // mid or top? return dn; @@ -1178,6 +1182,7 @@ private: int _sync_fs(); MClientRequest* make_request_from_Meta(MetaRequest * request); + int get_or_create(Inode *dir, const string& name, Dentry **pdn); public: int mount(); -- 2.39.5