dentry.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. #include <list>
  3. #include <string>
  4. #include <types/hash.hpp>
  5. #include <types/path.hpp>
  6. #include <kernel/async/lock.hpp>
  7. #include <kernel/vfs/inode.hpp>
  8. namespace fs {
  9. static constexpr unsigned long D_PRESENT = 1 << 0;
  10. static constexpr unsigned long D_DIRECTORY = 1 << 1;
  11. static constexpr unsigned long D_LOADED = 1 << 2;
  12. static constexpr unsigned long D_MOUNTPOINT = 1 << 3;
  13. struct dentry {
  14. struct dcache* cache;
  15. vfs* fs;
  16. struct inode* inode;
  17. struct dentry* parent;
  18. // list head
  19. struct dentry* prev;
  20. struct dentry* next;
  21. unsigned long flags;
  22. types::hash_t hash;
  23. // TODO: use atomic
  24. std::size_t refcount;
  25. std::string name;
  26. };
  27. struct dentry_deleter {
  28. void operator()(struct dentry* dentry) const;
  29. };
  30. using dentry_pointer = std::unique_ptr<struct dentry, dentry_deleter>;
  31. struct dcache {
  32. struct dentry** arr;
  33. int hash_bits;
  34. std::size_t size;
  35. };
  36. std::pair<struct dentry*, int> d_find(struct dentry* parent,
  37. types::string_view name);
  38. std::string d_path(const struct dentry* dentry, const struct dentry* root);
  39. dentry_pointer d_get(const dentry_pointer& dp);
  40. struct dentry* d_get(struct dentry* dentry);
  41. struct dentry* d_put(struct dentry* dentry);
  42. void dcache_init(struct dcache* cache, int hash_bits);
  43. void dcache_drop(struct dcache* cache);
  44. struct dentry* dcache_alloc(struct dcache* cache);
  45. void dcache_init_root(struct dcache* cache, struct dentry* root);
  46. } // namespace fs