Inode.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/FileSystem/Inode.h>
  8. #include <Kernel/FileSystem/OpenFileDescription.h>
  9. #include <Kernel/FileSystem/ProcFS/FileSystem.h>
  10. #include <Kernel/ProcessExposed.h>
  11. #include <Kernel/UnixTypes.h>
  12. namespace Kernel {
  13. class ProcFSExposedDirectory;
  14. class ProcFSExposedLink;
  15. class ProcFSInode final : public Inode {
  16. friend class ProcFS;
  17. public:
  18. enum class Type {
  19. GlobalLink,
  20. GlobalDirectory,
  21. FileDescriptionLink,
  22. ThreadStack,
  23. ProcessProperty,
  24. ChildProcessLink,
  25. ProcessDirectory,
  26. ProcessSubdirectory,
  27. };
  28. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_file_description_link_inode(ProcFS const&, unsigned, ProcessID);
  29. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_thread_stack_inode(ProcFS const&, ThreadID, ProcessID);
  30. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_pid_property_inode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
  31. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_child_process_link_inode(ProcFS const&, ProcessID, ProcessID);
  32. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_process_directory_inode(ProcFS const&, ProcessID);
  33. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_process_subdirectory_inode(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
  34. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_directory_inode(ProcFS const&, ProcFSExposedDirectory const&);
  35. static ErrorOr<NonnullLockRefPtr<ProcFSInode>> try_create_as_global_link_inode(ProcFS const&, ProcFSExposedLink const&);
  36. virtual ~ProcFSInode() override;
  37. private:
  38. // ProcFS PID property inode (/proc/PID/PROPERTY)
  39. ProcFSInode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
  40. // ProcFS Thread stack inode (/proc/PID/stacks/TID)
  41. ProcFSInode(ProcFS const&, ThreadID, ProcessID);
  42. // ProcFS File description link inode (/proc/PID/fd/FD)
  43. ProcFSInode(ProcFS const&, unsigned, ProcessID);
  44. // ProcFS Child process link inode (/proc/PID/children/CHILD_PID)
  45. ProcFSInode(ProcFS const&, ProcessID, ProcessID);
  46. // ProcFS Process directory inode (/proc/PID/)
  47. ProcFSInode(ProcFS const&, ProcessID);
  48. // ProcFS Process sub directory inode (/proc/PID/SUBDIRECTORY)
  49. ProcFSInode(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
  50. ProcFSInode(ProcFS const&, ProcFSExposedLink const&);
  51. ProcFSInode(ProcFS const&, ProcFSExposedDirectory const&);
  52. ProcFS& procfs() { return static_cast<ProcFS&>(Inode::fs()); }
  53. ProcFS const& procfs() const { return static_cast<ProcFS const&>(Inode::fs()); }
  54. // ^Inode
  55. virtual ErrorOr<void> attach(OpenFileDescription& description) override;
  56. virtual void did_seek(OpenFileDescription&, off_t) override;
  57. virtual ErrorOr<void> flush_metadata() override final;
  58. virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
  59. virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override final;
  60. virtual ErrorOr<void> remove_child(StringView name) override final;
  61. virtual ErrorOr<void> replace_child(StringView name, Inode& child) override final;
  62. virtual ErrorOr<void> chmod(mode_t) override final;
  63. virtual ErrorOr<void> chown(UserID, GroupID) override final;
  64. virtual InodeMetadata metadata() const override;
  65. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  66. virtual ErrorOr<size_t> read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
  67. virtual ErrorOr<size_t> write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override;
  68. virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override final;
  69. virtual ErrorOr<void> truncate(u64) override final;
  70. virtual ErrorOr<void> update_timestamps(Optional<Time> atime, Optional<Time> ctime, Optional<Time> mtime) override;
  71. ErrorOr<void> refresh_process_property_data(OpenFileDescription& description);
  72. ErrorOr<void> try_fetch_process_property_data(NonnullLockRefPtr<Process>, KBufferBuilder& builder) const;
  73. Type m_type;
  74. union {
  75. SegmentedProcFSIndex::MainProcessProperty property_type;
  76. unsigned property_index;
  77. } m_possible_data;
  78. Optional<SegmentedProcFSIndex::ProcessSubDirectory> const m_parent_subdirectory_type {};
  79. Optional<SegmentedProcFSIndex::ProcessSubDirectory> const m_subdirectory_type {};
  80. Optional<ProcessID> const m_associated_pid {};
  81. LockRefPtr<ProcFSExposedComponent> m_associated_component;
  82. mutable Mutex m_refresh_lock;
  83. };
  84. }