]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add _dentry_valid() helper support
authorXiubo Li <xiubli@redhat.com>
Mon, 19 Oct 2020 06:44:06 +0000 (02:44 -0400)
committerXiubo Li <xiubli@redhat.com>
Wed, 4 Nov 2020 07:59:30 +0000 (02:59 -0500)
Fixes: https://tracker.ceph.com/issues/43423
Signed-off-by: Xiubo Li <xiubli@redhat.com>
src/client/Client.cc
src/client/Client.h

index 0c60a4af1276022d61957cb8b190cbfbbf82cb60..c4c3fec2cf3a2754fb8af43abb7151569a24657f 100644 (file)
@@ -6588,6 +6588,25 @@ int Client::_do_lookup(Inode *dir, const string& name, int mask,
   return r;
 }
 
+bool Client::_dentry_valid(const Dentry *dn)
+{
+  ceph_assert(ceph_mutex_is_locked_by_me(client_lock));
+
+  // is dn lease valid?
+  utime_t now = ceph_clock_now();
+  if (dn->lease_mds >= 0 && dn->lease_ttl > now &&
+      mds_sessions.count(dn->lease_mds)) {
+    MetaSession &s = mds_sessions.at(dn->lease_mds);
+    if (s.cap_ttl > now && s.cap_gen == dn->lease_gen)
+      return true;
+
+    ldout(cct, 20) << " bad lease, cap_ttl " << s.cap_ttl << ", cap_gen " << s.cap_gen
+                   << " vs lease_gen " << dn->lease_gen << dendl;
+  }
+
+  return false;
+}
+
 int Client::_lookup(Inode *dir, const string& dname, int mask, InodeRef *target,
                    const UserPerm& perms)
 {
@@ -6647,21 +6666,11 @@ int Client::_lookup(Inode *dir, const string& dname, int mask, InodeRef *target,
             << dendl;
 
     if (!dn->inode || dn->inode->caps_issued_mask(mask, true)) {
-      // is dn lease valid?
-      utime_t now = ceph_clock_now();
-      if (dn->lease_mds >= 0 &&
-         dn->lease_ttl > now &&
-         mds_sessions.count(dn->lease_mds)) {
-       MetaSession &s = mds_sessions.at(dn->lease_mds);
-       if (s.cap_ttl > now &&
-           s.cap_gen == dn->lease_gen) {
-         // 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);
-         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;
+      if (_dentry_valid(dn)) {
+        // 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);
+          goto hit_dn;
       }
       // dir shared caps?
       if (dir->caps_issued_mask(CEPH_CAP_FILE_SHARED, true)) {
@@ -6713,19 +6722,9 @@ int Client::get_or_create(Inode *dir, const char* name,
   dir->open_dir();
   if (dir->dir->dentries.count(name)) {
     Dentry *dn = dir->dir->dentries[name];
-    
-    // is dn lease valid?
-    utime_t now = ceph_clock_now();
-    if (dn->inode &&
-       dn->lease_mds >= 0 &&
-       dn->lease_ttl > now &&
-       mds_sessions.count(dn->lease_mds)) {
-      MetaSession &s = mds_sessions.at(dn->lease_mds);
-      if (s.cap_ttl > now &&
-         s.cap_gen == dn->lease_gen) {
-       if (expect_null)
-         return -EEXIST;
-      }
+    if (_dentry_valid(dn)) {
+      if (expect_null)
+        return -EEXIST;
     }
     *pdn = dn;
   } else {
index 7e91ac23111c8d05e472ab6fbd8132f4a8d529c7..4d50bf9b7adb0157831bb8419a20f51de4e801b3 100644 (file)
@@ -1174,6 +1174,8 @@ private:
   int _read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl, bool *checkeof);
   int _read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl);
 
+  bool _dentry_valid(const Dentry *dn);
+
   // internal interface
   //   call these with client_lock held!
   int _do_lookup(Inode *dir, const string& name, int mask, InodeRef *target,