FileSystem.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. #include "InodeIdentifier.h"
  3. #include "InodeMetadata.h"
  4. #include "UnixTypes.h"
  5. #include <AK/String.h>
  6. #include <AK/ByteBuffer.h>
  7. #include <AK/Function.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/RefCounted.h>
  11. #include <AK/RefPtr.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. virtual KResult prepare_to_unmount() const { return KSuccess; }
  39. // FIXME: This data structure is very clunky and unpleasant. Replace it with something nicer.
  40. struct DirectoryEntry {
  41. DirectoryEntry(const char* name, InodeIdentifier, u8 file_type);
  42. DirectoryEntry(const char* name, int name_length, InodeIdentifier, u8 file_type);
  43. char name[256];
  44. int name_length { 0 };
  45. InodeIdentifier inode;
  46. u8 file_type { 0 };
  47. };
  48. virtual RefPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, off_t size, dev_t, int& error) = 0;
  49. virtual RefPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, mode_t, int& error) = 0;
  50. virtual RefPtr<Inode> get_inode(InodeIdentifier) const = 0;
  51. virtual void flush_writes() {}
  52. int block_size() const { return m_block_size; }
  53. virtual bool is_disk_backed() const { return false; }
  54. protected:
  55. FS();
  56. void set_block_size(int);
  57. mutable Lock m_lock { "FS" };
  58. private:
  59. unsigned m_fsid { 0 };
  60. int m_block_size { 0 };
  61. bool m_readonly { false };
  62. };
  63. inline FS* InodeIdentifier::fs()
  64. {
  65. return FS::from_fsid(m_fsid);
  66. }
  67. inline const FS* InodeIdentifier::fs() const
  68. {
  69. return FS::from_fsid(m_fsid);
  70. }
  71. inline bool InodeIdentifier::is_root_inode() const
  72. {
  73. return (*this) == fs()->root_inode();
  74. }
  75. namespace AK {
  76. template<>
  77. struct Traits<InodeIdentifier> : public GenericTraits<InodeIdentifier> {
  78. static unsigned hash(const InodeIdentifier& inode) { return pair_int_hash(inode.fsid(), inode.index()); }
  79. static void dump(const InodeIdentifier& inode) { kprintf("%02u:%08u", inode.fsid(), inode.index()); }
  80. };
  81. }