]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/client/Dentry.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / client / Dentry.h
index c2181956cbcd55b5504407d24021612b61380d77..ffbb5104b49b934741eaae155c1b9a43a0cbcbda 100644 (file)
@@ -5,58 +5,90 @@
 #include "include/xlist.h"
 
 #include "mds/mdstypes.h"
+#include "Inode.h"
 #include "InodeRef.h"
-
-class Dir;
-struct Inode;
+#include "Dir.h"
 
 class Dentry : public LRUObject {
- public:
-  string   name;                      // sort of lame
-  //const char *name;
-  Dir     *dir;
-  InodeRef inode;
-  int     ref;                       // 1 if there's a dir beneath me.
-  int64_t offset;
-  mds_rank_t lease_mds;
-  utime_t lease_ttl;
-  uint64_t lease_gen;
-  ceph_seq_t lease_seq;
-  int cap_shared_gen;
+public:
+  explicit Dentry(Dir *_dir, const std::string &_name) :
+    dir(_dir), name(_name), inode_xlist_link(this)
+  {
+    auto r = dir->dentries.insert(make_pair(name, this));
+    ceph_assert(r.second);
+    dir->num_null_dentries++;
+  }
+  ~Dentry() {
+    ceph_assert(ref == 0);
+    ceph_assert(dir == nullptr);
+  }
 
   /*
    * ref==1 -> cached, unused
    * ref >1 -> pinned in lru
    */
   void get() {
-    assert(ref > 0);
+    ceph_assert(ref > 0);
     if (++ref == 2)
       lru_pin();
     //cout << "dentry.get on " << this << " " << name << " now " << ref << std::endl;
   }
   void put() {
-    assert(ref > 0);
+    ceph_assert(ref > 0);
     if (--ref == 1)
       lru_unpin();
     //cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
     if (ref == 0)
       delete this;
   }
+  void link(InodeRef in) {
+    inode = in;
+    inode->dentries.push_back(&inode_xlist_link);
+    if (inode->is_dir()) {
+      if (inode->dir)
+        get(); // dir -> dn pin
+      if (inode->ll_ref)
+        get(); // ll_ref -> dn pin
+    }
+    dir->num_null_dentries--;
+  }
+  void unlink(void) {
+    if (inode->is_dir()) {
+      if (inode->dir)
+        put(); // dir -> dn pin
+      if (inode->ll_ref)
+        put(); // ll_ref -> dn pin
+    }
+    ceph_assert(inode_xlist_link.get_list() == &inode->dentries);
+    inode_xlist_link.remove_myself();
+    inode.reset();
+    dir->num_null_dentries++;
+  }
+  void detach(void) {
+    ceph_assert(!inode);
+    auto p = dir->dentries.find(name);
+    ceph_assert(p != dir->dentries.end());
+    dir->dentries.erase(p);
+    dir->num_null_dentries--;
+    dir = nullptr;
+  }
 
   void dump(Formatter *f) const;
+  friend std::ostream &operator<<(std::ostream &oss, const Dentry &Dentry);
+
+  Dir     *dir;
+  const string name;
+  InodeRef inode;
+  int     ref = 1; // 1 if there's a dir beneath me.
+  int64_t offset = 0;
+  mds_rank_t lease_mds = -1;
+  utime_t lease_ttl;
+  uint64_t lease_gen = 0;
+  ceph_seq_t lease_seq = 0;
+  int cap_shared_gen = 0;
 
-  Dentry() :
-    dir(0), ref(1), offset(0),
-    lease_mds(-1), lease_gen(0), lease_seq(0), cap_shared_gen(0)
-  { }
 private:
-  ~Dentry() {
-    assert(ref == 0);
-  }
+  xlist<Dentry *>::item inode_xlist_link;
 };
 
-
-
-
-
 #endif