FileSystem.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #pragma once
  2. #include "DiskDevice.h"
  3. #include "InodeIdentifier.h"
  4. #include "InodeMetadata.h"
  5. #include "Limits.h"
  6. #include "UnixTypes.h"
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/Retainable.h>
  11. #include <AK/RetainPtr.h>
  12. #include <AK/AKString.h>
  13. #include <AK/Function.h>
  14. #include <AK/kstdio.h>
  15. #include <Kernel/Lock.h>
  16. #include <AK/WeakPtr.h>
  17. #include <Kernel/KResult.h>
  18. static const dword mepoch = 476763780;
  19. class Inode;
  20. class FileDescriptor;
  21. class LocalSocket;
  22. class VMObject;
  23. class FS : public Retainable<FS> {
  24. friend class Inode;
  25. public:
  26. virtual ~FS();
  27. unsigned fsid() const { return m_fsid; }
  28. static FS* from_fsid(dword);
  29. static void sync();
  30. virtual bool initialize() = 0;
  31. virtual const char* class_name() const = 0;
  32. virtual InodeIdentifier root_inode() const = 0;
  33. bool is_readonly() const { return m_readonly; }
  34. virtual unsigned total_block_count() const { return 0; }
  35. virtual unsigned free_block_count() const { return 0; }
  36. virtual unsigned total_inode_count() const { return 0; }
  37. virtual unsigned free_inode_count() const { return 0; }
  38. struct DirectoryEntry {
  39. DirectoryEntry(const char* name, InodeIdentifier, byte file_type);
  40. DirectoryEntry(const char* name, size_t name_length, InodeIdentifier, byte file_type);
  41. char name[256];
  42. int name_length { 0 };
  43. InodeIdentifier inode;
  44. byte file_type { 0 };
  45. };
  46. virtual RetainPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, unsigned size, int& error) = 0;
  47. virtual RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, mode_t, int& error) = 0;
  48. virtual RetainPtr<Inode> get_inode(InodeIdentifier) const = 0;
  49. protected:
  50. FS();
  51. mutable Lock m_lock;
  52. private:
  53. unsigned m_fsid { 0 };
  54. bool m_readonly { false };
  55. };
  56. class Inode : public Retainable<Inode> {
  57. friend class VFS;
  58. friend class FS;
  59. public:
  60. virtual ~Inode();
  61. virtual void one_retain_left() { }
  62. FS& fs() { return m_fs; }
  63. const FS& fs() const { return m_fs; }
  64. unsigned fsid() const;
  65. unsigned index() const { return m_index; }
  66. size_t size() const { return metadata().size; }
  67. bool is_symlink() const { return metadata().is_symlink(); }
  68. bool is_directory() const { return metadata().is_directory(); }
  69. bool is_character_device() const { return metadata().is_character_device(); }
  70. mode_t mode() const { return metadata().mode; }
  71. InodeIdentifier identifier() const { return { fsid(), index() }; }
  72. virtual InodeMetadata metadata() const = 0;
  73. ByteBuffer read_entire(FileDescriptor* = nullptr) const;
  74. virtual ssize_t read_bytes(off_t, ssize_t, byte* buffer, FileDescriptor*) const = 0;
  75. virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) const = 0;
  76. virtual InodeIdentifier lookup(const String& name) = 0;
  77. virtual String reverse_lookup(InodeIdentifier) = 0;
  78. virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) = 0;
  79. virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) = 0;
  80. virtual KResult remove_child(const String& name) = 0;
  81. virtual RetainPtr<Inode> parent() const = 0;
  82. virtual size_t directory_entry_count() const = 0;
  83. virtual KResult chmod(mode_t) = 0;
  84. virtual KResult chown(uid_t, gid_t) = 0;
  85. virtual KResult truncate(int) { return KSuccess; }
  86. LocalSocket* socket() { return m_socket.ptr(); }
  87. const LocalSocket* socket() const { return m_socket.ptr(); }
  88. bool bind_socket(LocalSocket&);
  89. bool unbind_socket();
  90. bool is_metadata_dirty() const { return m_metadata_dirty; }
  91. virtual int set_atime(time_t);
  92. virtual int set_ctime(time_t);
  93. virtual int set_mtime(time_t);
  94. virtual int increment_link_count();
  95. virtual int decrement_link_count();
  96. virtual void flush_metadata() = 0;
  97. void will_be_destroyed();
  98. void set_vmo(VMObject&);
  99. VMObject* vmo() { return m_vmo.ptr(); }
  100. const VMObject* vmo() const { return m_vmo.ptr(); }
  101. protected:
  102. Inode(FS& fs, unsigned index);
  103. void set_metadata_dirty(bool b) { m_metadata_dirty = b; }
  104. void inode_contents_changed(off_t, ssize_t, const byte*);
  105. void inode_size_changed(size_t old_size, size_t new_size);
  106. mutable Lock m_lock;
  107. private:
  108. FS& m_fs;
  109. unsigned m_index { 0 };
  110. WeakPtr<VMObject> m_vmo;
  111. RetainPtr<LocalSocket> m_socket;
  112. bool m_metadata_dirty { false };
  113. };
  114. inline FS* InodeIdentifier::fs()
  115. {
  116. return FS::from_fsid(m_fsid);
  117. }
  118. inline const FS* InodeIdentifier::fs() const
  119. {
  120. return FS::from_fsid(m_fsid);
  121. }
  122. inline bool InodeIdentifier::is_root_inode() const
  123. {
  124. return (*this) == fs()->root_inode();
  125. }
  126. inline unsigned Inode::fsid() const
  127. {
  128. return m_fs.fsid();
  129. }
  130. namespace AK {
  131. template<>
  132. struct Traits<InodeIdentifier> {
  133. static unsigned hash(const InodeIdentifier& inode) { return pair_int_hash(inode.fsid(), inode.index()); }
  134. static void dump(const InodeIdentifier& inode) { kprintf("%02u:%08u", inode.fsid(), inode.index()); }
  135. };
  136. }