Inode.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <AK/NonnullRefPtrVector.h>
  2. #include <AK/StringBuilder.h>
  3. #include <Kernel/FileSystem/Inode.h>
  4. #include <Kernel/Net/LocalSocket.h>
  5. #include <Kernel/VM/VMObject.h>
  6. HashTable<Inode*>& all_inodes()
  7. {
  8. static HashTable<Inode*>* s_inode_set;
  9. if (!s_inode_set)
  10. s_inode_set = new HashTable<Inode*>();
  11. return *s_inode_set;
  12. }
  13. void Inode::sync()
  14. {
  15. NonnullRefPtrVector<Inode, 32> inodes;
  16. {
  17. InterruptDisabler disabler;
  18. for (auto* inode : all_inodes()) {
  19. if (inode->is_metadata_dirty())
  20. inodes.append(*inode);
  21. }
  22. }
  23. for (auto& inode : inodes) {
  24. ASSERT(inode.is_metadata_dirty());
  25. inode.flush_metadata();
  26. }
  27. }
  28. ByteBuffer Inode::read_entire(FileDescription* descriptor) const
  29. {
  30. size_t initial_size = metadata().size ? metadata().size : 4096;
  31. StringBuilder builder(initial_size);
  32. ssize_t nread;
  33. u8 buffer[4096];
  34. off_t offset = 0;
  35. for (;;) {
  36. nread = read_bytes(offset, sizeof(buffer), buffer, descriptor);
  37. ASSERT(nread <= (ssize_t)sizeof(buffer));
  38. if (nread <= 0)
  39. break;
  40. builder.append((const char*)buffer, nread);
  41. offset += nread;
  42. }
  43. if (nread < 0) {
  44. kprintf("Inode::read_entire: ERROR: %d\n", nread);
  45. return nullptr;
  46. }
  47. return builder.to_byte_buffer();
  48. }
  49. unsigned Inode::fsid() const
  50. {
  51. return m_fs.fsid();
  52. }
  53. Inode::Inode(FS& fs, unsigned index)
  54. : m_fs(fs)
  55. , m_index(index)
  56. {
  57. all_inodes().set(this);
  58. }
  59. Inode::~Inode()
  60. {
  61. all_inodes().remove(this);
  62. }
  63. void Inode::will_be_destroyed()
  64. {
  65. if (m_metadata_dirty)
  66. flush_metadata();
  67. }
  68. void Inode::inode_contents_changed(off_t offset, ssize_t size, const u8* data)
  69. {
  70. if (m_vmo)
  71. m_vmo->inode_contents_changed({}, offset, size, data);
  72. }
  73. void Inode::inode_size_changed(size_t old_size, size_t new_size)
  74. {
  75. if (m_vmo)
  76. m_vmo->inode_size_changed({}, old_size, new_size);
  77. }
  78. int Inode::set_atime(time_t)
  79. {
  80. return -ENOTIMPL;
  81. }
  82. int Inode::set_ctime(time_t)
  83. {
  84. return -ENOTIMPL;
  85. }
  86. int Inode::set_mtime(time_t)
  87. {
  88. return -ENOTIMPL;
  89. }
  90. int Inode::increment_link_count()
  91. {
  92. return -ENOTIMPL;
  93. }
  94. int Inode::decrement_link_count()
  95. {
  96. return -ENOTIMPL;
  97. }
  98. void Inode::set_vmo(VMObject& vmo)
  99. {
  100. m_vmo = vmo.make_weak_ptr();
  101. }
  102. bool Inode::bind_socket(LocalSocket& socket)
  103. {
  104. ASSERT(!m_socket);
  105. m_socket = socket;
  106. return true;
  107. }
  108. bool Inode::unbind_socket()
  109. {
  110. ASSERT(m_socket);
  111. m_socket = nullptr;
  112. return true;
  113. }