Inode.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2020, Sergey Bugaev <bugaevc@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Atomic.h>
  8. #include <Kernel/FileSystem/Inode.h>
  9. #include <Kernel/FileSystem/Plan9FS/FileSystem.h>
  10. #include <Kernel/FileSystem/Plan9FS/Message.h>
  11. #include <Kernel/KBufferBuilder.h>
  12. namespace Kernel {
  13. class Plan9FSInode final : public Inode {
  14. friend class Plan9FS;
  15. public:
  16. virtual ~Plan9FSInode() override;
  17. u32 fid() const { return index().value(); }
  18. // ^Inode
  19. virtual InodeMetadata metadata() const override;
  20. virtual ErrorOr<void> flush_metadata() override;
  21. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  22. virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
  23. virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
  24. virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
  25. virtual ErrorOr<void> remove_child(StringView name) override;
  26. virtual ErrorOr<void> replace_child(StringView name, Inode& child) override;
  27. virtual ErrorOr<void> chmod(mode_t) override;
  28. virtual ErrorOr<void> chown(UserID, GroupID) override;
  29. virtual ErrorOr<void> truncate(u64) override;
  30. private:
  31. // ^Inode
  32. virtual ErrorOr<size_t> read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
  33. virtual ErrorOr<size_t> write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override;
  34. Plan9FSInode(Plan9FS&, u32 fid);
  35. static ErrorOr<NonnullLockRefPtr<Plan9FSInode>> try_create(Plan9FS&, u32 fid);
  36. enum class GetAttrMask : u64 {
  37. Mode = 0x1,
  38. NLink = 0x2,
  39. UID = 0x4,
  40. GID = 0x8,
  41. RDev = 0x10,
  42. ATime = 0x20,
  43. MTime = 0x40,
  44. CTime = 0x80,
  45. Ino = 0x100,
  46. Size = 0x200,
  47. Blocks = 0x400,
  48. BTime = 0x800,
  49. Gen = 0x1000,
  50. DataVersion = 0x2000,
  51. Basic = 0x7ff,
  52. All = 0x3fff
  53. };
  54. enum class SetAttrMask : u64 {
  55. Mode = 0x1,
  56. UID = 0x2,
  57. GID = 0x4,
  58. Size = 0x8,
  59. ATime = 0x10,
  60. MTime = 0x20,
  61. CTime = 0x40,
  62. ATimeSet = 0x80,
  63. MTimeSet = 0x100
  64. };
  65. // Mode in which the file is already open, using SerenityOS constants.
  66. int m_open_mode { 0 };
  67. ErrorOr<void> ensure_open_for_mode(int mode);
  68. Plan9FS& fs() { return reinterpret_cast<Plan9FS&>(Inode::fs()); }
  69. Plan9FS& fs() const
  70. {
  71. return const_cast<Plan9FS&>(reinterpret_cast<Plan9FS const&>(Inode::fs()));
  72. }
  73. };
  74. }