FileSystem.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include "InodeIdentifier.h"
  3. #include "InodeMetadata.h"
  4. #include "UnixTypes.h"
  5. #include <AK/AKString.h>
  6. #include <AK/ByteBuffer.h>
  7. #include <AK/Function.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/RefPtr.h>
  11. #include <AK/RefCounted.h>
  12. #include <AK/WeakPtr.h>
  13. #include <AK/kstdio.h>
  14. #include <Kernel/Devices/DiskDevice.h>
  15. #include <Kernel/KResult.h>
  16. #include <Kernel/Lock.h>
  17. static const u32 mepoch = 476763780;
  18. class Inode;
  19. class FileDescription;
  20. class LocalSocket;
  21. class VMObject;
  22. class FS : public RefCounted<FS> {
  23. friend class Inode;
  24. public:
  25. virtual ~FS();
  26. unsigned fsid() const { return m_fsid; }
  27. static FS* from_fsid(u32);
  28. static void sync();
  29. static void lock_all();
  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, u8 file_type);
  40. DirectoryEntry(const char* name, int name_length, InodeIdentifier, u8 file_type);
  41. char name[256];
  42. int name_length { 0 };
  43. InodeIdentifier inode;
  44. u8 file_type { 0 };
  45. };
  46. virtual RefPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, off_t size, dev_t, int& error) = 0;
  47. virtual RefPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, mode_t, int& error) = 0;
  48. virtual RefPtr<Inode> get_inode(InodeIdentifier) const = 0;
  49. virtual void flush_writes() {}
  50. protected:
  51. FS();
  52. mutable Lock m_lock { "FS" };
  53. private:
  54. unsigned m_fsid { 0 };
  55. bool m_readonly { false };
  56. };
  57. inline FS* InodeIdentifier::fs()
  58. {
  59. return FS::from_fsid(m_fsid);
  60. }
  61. inline const FS* InodeIdentifier::fs() const
  62. {
  63. return FS::from_fsid(m_fsid);
  64. }
  65. inline bool InodeIdentifier::is_root_inode() const
  66. {
  67. return (*this) == fs()->root_inode();
  68. }
  69. namespace AK {
  70. template<>
  71. struct Traits<InodeIdentifier> : public GenericTraits<InodeIdentifier> {
  72. static unsigned hash(const InodeIdentifier& inode) { return pair_int_hash(inode.fsid(), inode.index()); }
  73. static void dump(const InodeIdentifier& inode) { kprintf("%02u:%08u", inode.fsid(), inode.index()); }
  74. };
  75. }