initial code repo
[stor4nfv.git] / src / ceph / src / client / Fh.h
diff --git a/src/ceph/src/client/Fh.h b/src/ceph/src/client/Fh.h
new file mode 100644 (file)
index 0000000..33733a5
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef CEPH_CLIENT_FH_H
+#define CEPH_CLIENT_FH_H
+
+#include "common/Readahead.h"
+#include "include/types.h"
+#include "InodeRef.h"
+#include "UserPerm.h"
+
+class Cond;
+class ceph_lock_state_t;
+class Inode;
+
+// file handle for any open file state
+
+struct Fh {
+  InodeRef  inode;
+  int      _ref;
+  loff_t    pos;
+  int       mds;        // have to talk to mds we opened with (for now)
+  int       mode;       // the mode i opened the file with
+
+  int flags;
+  bool pos_locked;           // pos is currently in use
+  list<Cond*> pos_waiters;   // waiters for pos
+
+  UserPerm actor_perms; // perms I opened the file with
+
+  Readahead readahead;
+
+  // file lock
+  ceph_lock_state_t *fcntl_locks;
+  ceph_lock_state_t *flock_locks;
+
+  // IO error encountered by any writeback on this Inode while
+  // this Fh existed (i.e. an fsync on another Fh will still show
+  // up as an async_err here because it could have been the same
+  // bytes we wrote via this Fh).
+  int async_err = {0};
+
+  int take_async_err()
+  {
+      int e = async_err;
+      async_err = 0;
+      return e;
+  }
+  
+  Fh(Inode *in);
+  ~Fh();
+  void get() { ++_ref; }
+  int put() { return --_ref; }
+};
+
+
+#endif