Inode.h 3.5 KB

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