vfs.hpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. virtual int symlink(dentry* dir, const char* linkname, const char* target);
  46. // metadata operation
  47. virtual int inode_statx(dentry* dent, statx* buf, unsigned int mask);
  48. virtual int inode_stat(dentry* dent, struct stat* stat);
  49. // file operations
  50. virtual size_t read(inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  51. virtual size_t write(inode* file, const char* buf, size_t offset, size_t n);
  52. virtual int dev_id(inode* file, dev_t& out_dev);
  53. virtual int readlink(inode* file, char* buf, size_t buf_size);
  54. virtual int truncate(inode* file, size_t size);
  55. // parameter 'length' in callback:
  56. // if 0, 'name' should be null terminated
  57. // else, 'name' size
  58. //
  59. // @return
  60. // return -1 if an error occurred
  61. // return 0 if no more entry available
  62. // otherwise, return bytes to be added to the offset
  63. virtual int readdir(inode* dir, size_t offset, const filldir_func& callback) = 0;
  64. };
  65. } // namespace fs