initial code repo
[stor4nfv.git] / src / ceph / src / client / ClientSnapRealm.h
diff --git a/src/ceph/src/client/ClientSnapRealm.h b/src/ceph/src/client/ClientSnapRealm.h
new file mode 100644 (file)
index 0000000..ccb129d
--- /dev/null
@@ -0,0 +1,60 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_CLIENT_SNAPREALM_H
+#define CEPH_CLIENT_SNAPREALM_H
+
+#include "include/types.h"
+#include "common/snap_types.h"
+#include "include/xlist.h"
+
+struct Inode;
+
+struct SnapRealm {
+  inodeno_t ino;
+  int nref;
+  snapid_t created;
+  snapid_t seq;
+  
+  inodeno_t parent;
+  snapid_t parent_since;
+  vector<snapid_t> prior_parent_snaps;  // snaps prior to parent_since
+  vector<snapid_t> my_snaps;
+
+  SnapRealm *pparent;
+  set<SnapRealm*> pchildren;
+
+private:
+  SnapContext cached_snap_context;  // my_snaps + parent snaps + past_parent_snaps
+  friend ostream& operator<<(ostream& out, const SnapRealm& r);
+
+public:
+  xlist<Inode*> inodes_with_caps;
+
+  explicit SnapRealm(inodeno_t i) :
+    ino(i), nref(0), created(0), seq(0),
+    pparent(NULL) { }
+
+  void build_snap_context();
+  void invalidate_cache() {
+    cached_snap_context.clear();
+  }
+
+  const SnapContext& get_snap_context() {
+    if (cached_snap_context.seq == 0)
+      build_snap_context();
+    return cached_snap_context;
+  }
+
+  void dump(Formatter *f) const;
+};
+
+inline ostream& operator<<(ostream& out, const SnapRealm& r) {
+  return out << "snaprealm(" << r.ino << " nref=" << r.nref << " c=" << r.created << " seq=" << r.seq
+            << " parent=" << r.parent
+            << " my_snaps=" << r.my_snaps
+            << " cached_snapc=" << r.cached_snap_context
+            << ")";
+}
+
+#endif