vfs.hpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. #include <kernel/vfs/inode.hpp>
  3. #include <kernel/vfs/dentry.hpp>
  4. #include <functional>
  5. #include <map>
  6. #include <stdint.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <types/hash_map.hpp>
  10. namespace fs {
  11. class vfs {
  12. public:
  13. public:
  14. using filldir_func = std::function<int(const char*, size_t, inode*, uint8_t)>;
  15. private:
  16. // TODO: use allocator designed for small objects
  17. using inode_list = std::map<ino_t, inode>;
  18. private:
  19. inode_list _inodes;
  20. types::hash_map<dentry*, dentry*> _mount_recover_list;
  21. protected:
  22. dentry _root;
  23. protected:
  24. inode* cache_inode(size_t size, ino_t ino, mode_t mode, uid_t uid, gid_t gid);
  25. void free_inode(ino_t ino);
  26. inode* get_inode(ino_t ino);
  27. void register_root_node(inode* root);
  28. int load_dentry(dentry* ent);
  29. public:
  30. vfs();
  31. vfs(const vfs&) = delete;
  32. vfs& operator=(const vfs&) = delete;
  33. vfs(vfs&&) = delete;
  34. vfs& operator=(vfs&&) = delete;
  35. constexpr dentry* root(void)
  36. {
  37. return &_root;
  38. }
  39. int mount(dentry* mnt, vfs* new_fs);
  40. // directory operations
  41. virtual int inode_mkfile(dentry* dir, const char* filename, mode_t mode);
  42. virtual int inode_mknode(dentry* dir, const char* filename, mode_t mode, dev_t sn);
  43. virtual int inode_rmfile(dentry* dir, const char* filename);
  44. virtual int inode_mkdir(dentry* dir, const char* dirname, mode_t mode);
  45. // metadata operation
  46. virtual int inode_statx(dentry* dent, statx* buf, unsigned int mask);
  47. virtual int inode_stat(dentry* dent, struct stat* stat);
  48. // file operations
  49. virtual size_t read(inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  50. virtual size_t write(inode* file, const char* buf, size_t offset, size_t n);
  51. virtual int dev_id(inode* file, dev_t& out_dev);
  52. virtual int truncate(inode* file, size_t size);
  53. // parameter 'length' in callback:
  54. // if 0, 'name' should be null terminated
  55. // else, 'name' size
  56. //
  57. // @return
  58. // return -1 if an error occurred
  59. // return 0 if no more entry available
  60. // otherwise, return bytes to be added to the offset
  61. virtual int readdir(inode* dir, size_t offset, const filldir_func& callback) = 0;
  62. };
  63. } // namespace fs