Inode.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include <AK/String.h>
  3. #include <AK/Function.h>
  4. #include <AK/InlineLinkedList.h>
  5. #include <AK/RefCounted.h>
  6. #include <AK/WeakPtr.h>
  7. #include <Kernel/FileSystem/FileSystem.h>
  8. #include <Kernel/FileSystem/InodeIdentifier.h>
  9. #include <Kernel/FileSystem/InodeMetadata.h>
  10. #include <Kernel/KResult.h>
  11. #include <Kernel/Lock.h>
  12. class FileDescription;
  13. class InodeVMObject;
  14. class InodeWatcher;
  15. class LocalSocket;
  16. class Inode : public RefCounted<Inode>
  17. , public Weakable<Inode>
  18. , public InlineLinkedListNode<Inode> {
  19. friend class VFS;
  20. friend class FS;
  21. public:
  22. virtual ~Inode();
  23. virtual void one_ref_left() {}
  24. FS& fs() { return m_fs; }
  25. const FS& fs() const { return m_fs; }
  26. unsigned fsid() const;
  27. unsigned index() const { return m_index; }
  28. size_t size() const { return metadata().size; }
  29. bool is_symlink() const { return metadata().is_symlink(); }
  30. bool is_directory() const { return metadata().is_directory(); }
  31. bool is_character_device() const { return metadata().is_character_device(); }
  32. mode_t mode() const { return metadata().mode; }
  33. InodeIdentifier identifier() const { return { fsid(), index() }; }
  34. virtual InodeMetadata metadata() const = 0;
  35. ByteBuffer read_entire(FileDescription* = nullptr) const;
  36. virtual ssize_t read_bytes(off_t, ssize_t, u8* buffer, FileDescription*) const = 0;
  37. virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) const = 0;
  38. virtual InodeIdentifier lookup(StringView name) = 0;
  39. virtual ssize_t write_bytes(off_t, ssize_t, const u8* data, FileDescription*) = 0;
  40. virtual KResult add_child(InodeIdentifier child_id, const StringView& name, mode_t) = 0;
  41. virtual KResult remove_child(const StringView& name) = 0;
  42. virtual size_t directory_entry_count() const = 0;
  43. virtual KResult chmod(mode_t) = 0;
  44. virtual KResult chown(uid_t, gid_t) = 0;
  45. virtual KResult truncate(off_t) { return KSuccess; }
  46. LocalSocket* socket() { return m_socket.ptr(); }
  47. const LocalSocket* socket() const { return m_socket.ptr(); }
  48. bool bind_socket(LocalSocket&);
  49. bool unbind_socket();
  50. bool is_metadata_dirty() const { return m_metadata_dirty; }
  51. virtual int set_atime(time_t);
  52. virtual int set_ctime(time_t);
  53. virtual int set_mtime(time_t);
  54. virtual int increment_link_count();
  55. virtual int decrement_link_count();
  56. virtual void flush_metadata() = 0;
  57. void will_be_destroyed();
  58. void set_vmobject(VMObject&);
  59. InodeVMObject* vmobject() { return m_vmobject.ptr(); }
  60. const InodeVMObject* vmobject() const { return m_vmobject.ptr(); }
  61. static void sync();
  62. bool has_watchers() const { return !m_watchers.is_empty(); }
  63. void register_watcher(Badge<InodeWatcher>, InodeWatcher&);
  64. void unregister_watcher(Badge<InodeWatcher>, InodeWatcher&);
  65. // For InlineLinkedListNode.
  66. Inode* m_next { nullptr };
  67. Inode* m_prev { nullptr };
  68. protected:
  69. Inode(FS& fs, unsigned index);
  70. void set_metadata_dirty(bool);
  71. void inode_contents_changed(off_t, ssize_t, const u8*);
  72. void inode_size_changed(size_t old_size, size_t new_size);
  73. mutable Lock m_lock { "Inode" };
  74. private:
  75. FS& m_fs;
  76. unsigned m_index { 0 };
  77. WeakPtr<InodeVMObject> m_vmobject;
  78. RefPtr<LocalSocket> m_socket;
  79. HashTable<InodeWatcher*> m_watchers;
  80. bool m_metadata_dirty { false };
  81. };