initial code repo
[stor4nfv.git] / src / ceph / src / client / Dentry.h
diff --git a/src/ceph/src/client/Dentry.h b/src/ceph/src/client/Dentry.h
new file mode 100644 (file)
index 0000000..c218195
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef CEPH_CLIENT_DENTRY_H
+#define CEPH_CLIENT_DENTRY_H
+
+#include "include/lru.h"
+#include "include/xlist.h"
+
+#include "mds/mdstypes.h"
+#include "InodeRef.h"
+
+class Dir;
+struct Inode;
+
+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;
+
+  /*
+   * ref==1 -> cached, unused
+   * ref >1 -> pinned in lru
+   */
+  void get() {
+    assert(ref > 0);
+    if (++ref == 2)
+      lru_pin();
+    //cout << "dentry.get on " << this << " " << name << " now " << ref << std::endl;
+  }
+  void put() {
+    assert(ref > 0);
+    if (--ref == 1)
+      lru_unpin();
+    //cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
+    if (ref == 0)
+      delete this;
+  }
+
+  void dump(Formatter *f) const;
+
+  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);
+  }
+};
+
+
+
+
+
+#endif