aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/CMakeLists.txt1
-rw-r--r--kernel/include/kernel/filesystem/device_file.hpp6
-rw-r--r--kernel/include/kernel/filesystem/device_inode.hpp7
-rw-r--r--kernel/include/kernel/filesystem/disk_file.hpp19
-rw-r--r--kernel/include/kernel/filesystem/ext2/ext2_file.hpp8
-rw-r--r--kernel/include/kernel/filesystem/ext2/ext2_inode.hpp9
-rw-r--r--kernel/include/kernel/filesystem/file.hpp8
-rw-r--r--kernel/include/kernel/filesystem/inode.hpp8
-rw-r--r--kernel/include/kernel/filesystem/inode_file.hpp9
-rw-r--r--kernel/src/filesystem/device_file.cpp25
-rw-r--r--kernel/src/filesystem/device_inode.cpp14
-rw-r--r--kernel/src/filesystem/ext2/ext2_inode.cpp15
-rw-r--r--kernel/src/filesystem/file.cpp20
-rw-r--r--kernel/src/filesystem/inode_file.cpp21
-rw-r--r--kernel/src/filesystem/vfs.cpp5
-rw-r--r--kernel/src/main.cpp5
16 files changed, 112 insertions, 68 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index e0b40be..ec0d4e2 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -27,6 +27,7 @@ add_executable("kernel"
"src/filesystem/custody.cpp"
"src/filesystem/device_file.cpp"
"src/filesystem/device_inode.cpp"
+ "src/filesystem/file.cpp"
"src/filesystem/file_descriptor_table.cpp"
"src/filesystem/filesystem.cpp"
"src/filesystem/inode_file.cpp"
diff --git a/kernel/include/kernel/filesystem/device_file.hpp b/kernel/include/kernel/filesystem/device_file.hpp
index ff803f8..22ddb49 100644
--- a/kernel/include/kernel/filesystem/device_file.hpp
+++ b/kernel/include/kernel/filesystem/device_file.hpp
@@ -11,9 +11,11 @@
namespace filesystem
{
+ struct inode;
+
struct device_file : file
{
- explicit device_file(kstd::shared_ptr<devices::device> const & device);
+ explicit device_file(kstd::shared_ptr<inode> const & inode);
auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
@@ -23,7 +25,7 @@ namespace filesystem
std::byte * scratch, void * buffer);
auto process_blocks(size_t offset, size_t size, void * buffer, block_op op) const -> size_t;
- kstd::shared_ptr<devices::device> m_device;
+ [[nodiscard]] auto device() const -> kstd::shared_ptr<devices::device> const &;
};
} // namespace filesystem
diff --git a/kernel/include/kernel/filesystem/device_inode.hpp b/kernel/include/kernel/filesystem/device_inode.hpp
index c38c75b..af2a51b 100644
--- a/kernel/include/kernel/filesystem/device_inode.hpp
+++ b/kernel/include/kernel/filesystem/device_inode.hpp
@@ -2,18 +2,21 @@
#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP
#include "kernel/devices/device.hpp"
-#include "kernel/filesystem/file.hpp"
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
namespace filesystem
{
+ struct file;
+
struct device_inode : inode
{
explicit device_inode(kstd::shared_ptr<devices::device> const & device);
- [[nodiscard]] auto open_file() const -> kstd::shared_ptr<file> override;
+ [[nodiscard]] auto open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<file> override;
+
+ [[nodiscard]] auto device() const -> kstd::shared_ptr<devices::device> const &;
private:
kstd::shared_ptr<devices::device> m_device{};
diff --git a/kernel/include/kernel/filesystem/disk_file.hpp b/kernel/include/kernel/filesystem/disk_file.hpp
deleted file mode 100644
index c6a7655..0000000
--- a/kernel/include/kernel/filesystem/disk_file.hpp
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef TEACH_OS_KERNEL_FILESYSTEM_DISK_FILE_HPP
-#define TEACH_OS_KERNEL_FILESYSTEM_DISK_FILE_HPP
-
-#include <kstd/memory>
-
-#include <cstddef>
-
-namespace filesystem
-{
- struct disk_file
- {
- virtual ~disk_file() = default;
-
- virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0;
- virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0;
- };
-} // namespace filesystem
-
-#endif \ No newline at end of file
diff --git a/kernel/include/kernel/filesystem/ext2/ext2_file.hpp b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp
index 371507d..e5357e3 100644
--- a/kernel/include/kernel/filesystem/ext2/ext2_file.hpp
+++ b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp
@@ -1,16 +1,14 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP
-#include "kernel/filesystem/disk_file.hpp"
-
#include <cstddef>
namespace filesystem::ext2
{
- struct ext2_file : disk_file
+ struct ext2_file
{
- auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
- auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
+ auto read(void * buffer, size_t offset, size_t size) const -> size_t;
+ auto write(void const * buffer, size_t offset, size_t size) -> size_t;
};
} // namespace filesystem::ext2
diff --git a/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp
index 7b5ff3f..b57d267 100644
--- a/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp
+++ b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp
@@ -1,7 +1,7 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP
-#include "kernel/filesystem/disk_file.hpp"
+#include "kernel/filesystem/ext2/ext2_file.hpp"
#include "kernel/filesystem/file.hpp"
#include "kernel/filesystem/inode.hpp"
@@ -11,12 +11,13 @@ namespace filesystem::ext2
{
struct ext2_inode : inode
{
- explicit ext2_inode(kstd::shared_ptr<disk_file> const & disk_file);
+ explicit ext2_inode();
- [[nodiscard]] auto open_file() const -> kstd::shared_ptr<file> override;
+ [[nodiscard]] auto open_file(kstd::shared_ptr<inode> const & self) const
+ -> kstd::shared_ptr<filesystem::file> override;
private:
- kstd::shared_ptr<disk_file> m_disk_file{};
+ kstd::shared_ptr<ext2_file> m_file{};
};
} // namespace filesystem::ext2
diff --git a/kernel/include/kernel/filesystem/file.hpp b/kernel/include/kernel/filesystem/file.hpp
index 5a41fab..522f078 100644
--- a/kernel/include/kernel/filesystem/file.hpp
+++ b/kernel/include/kernel/filesystem/file.hpp
@@ -1,16 +1,24 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP
+#include <kstd/memory>
+
#include <cstddef>
namespace filesystem
{
+ struct inode;
+
struct file
{
+ explicit file(kstd::shared_ptr<inode> const & inode);
virtual ~file() = default;
virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0;
virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0;
+
+ protected:
+ kstd::shared_ptr<inode> m_inode;
};
} // namespace filesystem
diff --git a/kernel/include/kernel/filesystem/inode.hpp b/kernel/include/kernel/filesystem/inode.hpp
index 79cbcf9..8c9f75e 100644
--- a/kernel/include/kernel/filesystem/inode.hpp
+++ b/kernel/include/kernel/filesystem/inode.hpp
@@ -1,12 +1,12 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP
-#include "kernel/filesystem/file.hpp"
-
#include <kstd/memory>
namespace filesystem
{
+ struct file;
+
struct inode
{
enum class inode_kind
@@ -20,12 +20,12 @@ namespace filesystem
virtual ~inode() = default;
+ [[nodiscard]] virtual auto open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<file> = 0;
+
[[nodiscard]] auto is_directory() const -> bool;
[[nodiscard]] auto is_regular() const -> bool;
[[nodiscard]] auto is_device() const -> bool;
- [[nodiscard]] virtual auto open_file() const -> kstd::shared_ptr<file> = 0;
-
private:
inode_kind m_kind{inode_kind::regular};
};
diff --git a/kernel/include/kernel/filesystem/inode_file.hpp b/kernel/include/kernel/filesystem/inode_file.hpp
index 3e2b954..f87b77c 100644
--- a/kernel/include/kernel/filesystem/inode_file.hpp
+++ b/kernel/include/kernel/filesystem/inode_file.hpp
@@ -1,8 +1,8 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP
-#include "kernel/filesystem/disk_file.hpp"
#include "kernel/filesystem/file.hpp"
+#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
@@ -10,15 +10,14 @@
namespace filesystem
{
+ struct inode;
+
struct inode_file : file
{
- explicit inode_file(kstd::shared_ptr<disk_file> const & disk_file);
+ explicit inode_file(kstd::shared_ptr<inode> const & inode);
auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
-
- private:
- kstd::shared_ptr<disk_file> m_disk_file;
};
} // namespace filesystem
diff --git a/kernel/src/filesystem/device_file.cpp b/kernel/src/filesystem/device_file.cpp
index 48ed20d..26c7511 100644
--- a/kernel/src/filesystem/device_file.cpp
+++ b/kernel/src/filesystem/device_file.cpp
@@ -4,6 +4,9 @@
#include "kernel/devices/block_device.hpp"
#include "kernel/devices/device.hpp"
+#include "kernel/filesystem/device_inode.hpp"
+#include "kernel/filesystem/file.hpp"
+#include "kernel/filesystem/inode.hpp"
#include <kstd/cstring>
#include <kstd/memory>
@@ -14,18 +17,18 @@
namespace filesystem
{
- device_file::device_file(kstd::shared_ptr<devices::device> const & device)
- : m_device(device)
+ device_file::device_file(kstd::shared_ptr<inode> const & inode)
+ : file(inode)
{
- if (!m_device)
+ if (!m_inode->is_device())
{
- kapi::system::panic("[FILESYSTEM] device_file constructed with null device.");
+ kapi::system::panic("[FILESYSTEM] device_file constructed with non-device inode.");
}
}
auto device_file::read(void * buffer, size_t offset, size_t size) const -> size_t
{
- if (m_device->is_block_device())
+ if (device()->is_block_device())
{
return process_blocks(offset, size, buffer,
[](size_t idx, size_t off, size_t len, size_t done, devices::block_device * device,
@@ -50,7 +53,7 @@ namespace filesystem
auto device_file::write(void const * buffer, size_t offset, size_t size) -> size_t
{
- if (m_device->is_block_device())
+ if (device()->is_block_device())
{
return process_blocks(offset, size, const_cast<void *>(buffer),
[](size_t idx, size_t off, size_t len, size_t done, devices::block_device * device,
@@ -78,7 +81,7 @@ namespace filesystem
{
if (buffer == nullptr)
{
- kapi::system::panic("[FILESYSTEM] device_file::write called with null buffer.");
+ kapi::system::panic("[FILESYSTEM] device_file::process_blocks called with null buffer.");
}
if (size == 0)
@@ -86,7 +89,7 @@ namespace filesystem
return 0;
}
- auto * block_dev = static_cast<devices::block_device *>(m_device.get());
+ auto * block_dev = static_cast<devices::block_device *>(device().get());
if (block_dev == nullptr)
{
kapi::system::panic("[FILESYSTEM] device_file: expected block_device.");
@@ -116,4 +119,10 @@ namespace filesystem
return processed;
}
+
+ auto device_file::device() const -> kstd::shared_ptr<devices::device> const &
+ {
+ auto inode = static_cast<device_inode *>(m_inode.get());
+ return inode->device();
+ }
} // namespace filesystem
diff --git a/kernel/src/filesystem/device_inode.cpp b/kernel/src/filesystem/device_inode.cpp
index 592637d..65dd9a3 100644
--- a/kernel/src/filesystem/device_inode.cpp
+++ b/kernel/src/filesystem/device_inode.cpp
@@ -21,8 +21,18 @@ namespace filesystem
}
}
- auto device_inode::open_file() const -> kstd::shared_ptr<file>
+ auto device_inode::open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<file>
{
- return kstd::make_shared<device_file>(m_device);
+ if (!self)
+ {
+ kapi::system::panic("[FILESYSTEM] device_inode::open_file called with null inode.");
+ }
+
+ return kstd::make_shared<device_file>(self);
+ }
+
+ auto device_inode::device() const -> kstd::shared_ptr<devices::device> const &
+ {
+ return m_device;
}
} // namespace filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/ext2/ext2_inode.cpp b/kernel/src/filesystem/ext2/ext2_inode.cpp
index 8131f43..0a1994b 100644
--- a/kernel/src/filesystem/ext2/ext2_inode.cpp
+++ b/kernel/src/filesystem/ext2/ext2_inode.cpp
@@ -1,6 +1,7 @@
#include "kernel/filesystem/ext2/ext2_inode.hpp"
-#include "kernel/filesystem/disk_file.hpp"
+#include "kapi/system.hpp"
+
#include "kernel/filesystem/file.hpp"
#include "kernel/filesystem/inode.hpp"
#include "kernel/filesystem/inode_file.hpp"
@@ -9,13 +10,17 @@
namespace filesystem::ext2
{
- ext2_inode::ext2_inode(kstd::shared_ptr<disk_file> const & disk_file)
+ ext2_inode::ext2_inode()
: inode(inode_kind::regular)
- , m_disk_file(disk_file)
{}
- auto ext2_inode::open_file() const -> kstd::shared_ptr<file>
+ auto ext2_inode::open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<filesystem::file>
{
- return kstd::make_shared<inode_file>(m_disk_file);
+ if (!self)
+ {
+ kapi::system::panic("[FILESYSTEM] ext2_inode::open_file called with null inode.");
+ }
+
+ return kstd::make_shared<inode_file>(self);
}
} // namespace filesystem::ext2 \ No newline at end of file
diff --git a/kernel/src/filesystem/file.cpp b/kernel/src/filesystem/file.cpp
new file mode 100644
index 0000000..a147863
--- /dev/null
+++ b/kernel/src/filesystem/file.cpp
@@ -0,0 +1,20 @@
+#include "kernel/filesystem/file.hpp"
+
+#include "kapi/system.hpp"
+
+#include "kernel/filesystem/inode.hpp"
+
+#include <kstd/memory>
+
+namespace filesystem
+{
+
+ file::file(kstd::shared_ptr<inode> const & inode)
+ : m_inode(inode)
+ {
+ if (!m_inode)
+ {
+ kapi::system::panic("[FILESYSTEM] file constructed with null inode.");
+ }
+ }
+} // namespace filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/inode_file.cpp b/kernel/src/filesystem/inode_file.cpp
index 9c351da..8b2fcba 100644
--- a/kernel/src/filesystem/inode_file.cpp
+++ b/kernel/src/filesystem/inode_file.cpp
@@ -2,7 +2,8 @@
#include "kapi/system.hpp"
-#include "kernel/filesystem/disk_file.hpp"
+#include "kernel/filesystem/file.hpp"
+#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
@@ -10,22 +11,24 @@
namespace filesystem
{
- inode_file::inode_file(kstd::shared_ptr<disk_file> const & disk_file)
- : m_disk_file(disk_file)
+ inode_file::inode_file(kstd::shared_ptr<inode> const & inode)
+ : file(inode)
{
- if (!m_disk_file)
+ if (m_inode->is_device())
{
- kapi::system::panic("[FILESYSTEM] inode_file constructed with null disk_file.");
+ kapi::system::panic("[FILESYSTEM] inode_file constructed with device inode.");
}
}
- auto inode_file::read(void * buffer, size_t offset, size_t size) const -> size_t
+ auto inode_file::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t
{
- return m_disk_file->read(buffer, offset, size);
+ // TODO BA-FS26
+ return 0;
}
- auto inode_file::write(void const * buffer, size_t offset, size_t size) -> size_t
+ auto inode_file::write(void const * /*buffer*/, size_t /*offset*/, size_t /*size*/) -> size_t
{
- return m_disk_file->write(buffer, offset, size);
+ // TODO BA-FS26
+ return 0;
}
} // namespace filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index ee5fd9b..5330b82 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -34,6 +34,7 @@ namespace filesystem
active_vfs.emplace(vfs{});
auto storage_mgmt = devices::storage::storage_management::get();
+ // TODO BA-FS26 fix mounting boot_device
if (auto boot_device = storage_mgmt.determine_boot_device())
{
active_vfs->m_root_fs = kstd::make_shared<ext2::ext2_filesystem>();
@@ -69,9 +70,9 @@ namespace filesystem
{
auto node = custody->get_inode();
- if (auto current_inode_file = node->open_file())
+ if (auto opened_file = node->open_file(node))
{
- return kstd::make_shared<open_file_description>(current_inode_file);
+ return kstd::make_shared<open_file_description>(opened_file);
}
kapi::system::panic("[FILESYSTEM] inode::open_file returned null file.");
diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp
index 31133a5..8d7308b 100644
--- a/kernel/src/main.cpp
+++ b/kernel/src/main.cpp
@@ -5,6 +5,7 @@
#include "kernel/devices/storage/storage_management.hpp"
#include "kernel/filesystem/device_file.hpp"
+#include "kernel/filesystem/device_inode.hpp"
#include "kernel/filesystem/file_descriptor_table.hpp"
#include "kernel/filesystem/open_file_description.hpp"
#include "kernel/filesystem/vfs.hpp"
@@ -25,7 +26,9 @@ auto test_file_description_manually() -> void
auto storage_mgmt = devices::storage::storage_management::get();
auto device = storage_mgmt.device_by_major_minor(1, 0);
- auto dev_file = kstd::make_shared<filesystem::device_file>(device);
+ auto dev_node = kstd::make_shared<filesystem::device_inode>(device);
+
+ auto dev_file = kstd::make_shared<filesystem::device_file>(dev_node);
auto ofd = kstd::make_shared<filesystem::open_file_description>(dev_file);
auto fd_index = fd_table.add_file(ofd);