Kernel: Rewrite mounting code

This commit is contained in:
Bananymous
2023-03-29 21:34:48 +03:00
parent 10e0c90fde
commit ab3cdea548
14 changed files with 121 additions and 144 deletions

View File

@@ -134,27 +134,24 @@ namespace Kernel
virtual timespec ctime() const override { return timespec { .tv_sec = m_inode.ctime, .tv_nsec = 0 }; }
virtual blksize_t blksize() const override;
virtual blkcnt_t blocks() const override;
virtual dev_t dev() const override { return 0; }
virtual dev_t rdev() const override { return 0; }
virtual BAN::StringView name() const override { return m_name; }
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) override;
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries(size_t) override;
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode(BAN::StringView) override;
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override;
virtual InodeType type() const override { return InodeType::Ext2; }
virtual bool operator==(const Inode& other) const override;
protected:
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) override;
private:
BAN::ErrorOr<uint32_t> data_block_index(uint32_t);
uint32_t index() const { return m_index; }
private:
Ext2Inode(Ext2FS& fs, Ext2::Inode inode, BAN::StringView name, uint32_t index)
Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t index, BAN::StringView name)
: m_fs(fs)
, m_inode(inode)
, m_name(name)

View File

@@ -33,45 +33,35 @@ namespace Kernel
IFREG = 0x8000,
};
enum class InodeType
{
DeviceManager,
Device,
Ext2,
};
public:
virtual ~Inode() {}
bool ifdir() const { return mode() & Mode::IFDIR; }
bool ifreg() const { return mode() & Mode::IFREG; }
bool operator==(const Inode& other) const { return dev() == other.dev() && rdev() == other.rdev() && ino() == other.ino(); }
virtual ino_t ino() const = 0;
virtual mode_t mode() const = 0;
virtual nlink_t nlink() const = 0;
virtual uid_t uid() const = 0;
virtual gid_t gid() const = 0;
virtual off_t size() const = 0;
virtual timespec atime() const = 0;
virtual timespec atime() const = 0;
virtual timespec mtime() const = 0;
virtual timespec ctime() const = 0;
virtual blksize_t blksize() const = 0;
virtual blkcnt_t blocks() const = 0;
virtual dev_t dev() const = 0;
virtual dev_t rdev() const = 0;
virtual BAN::StringView name() const = 0;
BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode(BAN::StringView);
BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries(size_t);
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode(BAN::StringView) { if (!ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries(size_t) { if (!ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) = 0;
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) = 0;
virtual InodeType type() const = 0;
virtual bool operator==(const Inode&) const = 0;
protected:
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) = 0;
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) = 0;
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { if ( ifdir()) return BAN::Error::from_errno(EISDIR); ASSERT_NOT_REACHED(); }
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) { if (!ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
};
}

View File

@@ -30,10 +30,10 @@ namespace Kernel
struct MountPoint
{
BAN::RefPtr<Inode> inode;
File host;
FileSystem* target;
};
const BAN::Vector<MountPoint>& mount_points() const { return m_mount_points; }
MountPoint* mount_point_for_inode(BAN::RefPtr<Inode>);
private:
VirtualFileSystem() = default;