Kernel: Rewrite mounting code
This commit is contained in:
@@ -48,31 +48,12 @@ namespace Kernel
|
||||
void update();
|
||||
void add_device(Device*);
|
||||
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t mode() const override { return IFDIR | IRUSR | IWUSR | IXUSR | IRGRP | IXGRP | IROTH | IXOTH; }
|
||||
virtual nlink_t nlink() const override { return 0; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual blksize_t blksize() const override { return 0; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
|
||||
virtual BAN::StringView name() const override { return "device-manager"sv; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override { return BAN::Error::from_errno(EISDIR); }
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override { return BAN::Error::from_errno(EINVAL); };
|
||||
|
||||
virtual InodeType type() const override { return InodeType::DeviceManager; }
|
||||
virtual bool operator==(const Inode&) const override { return false; }
|
||||
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return this; }
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) override;
|
||||
virtual BAN::StringView name() const override { return "device-manager"; }
|
||||
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries(size_t) override;
|
||||
|
||||
private:
|
||||
DeviceManager() = default;
|
||||
@@ -82,6 +63,24 @@ namespace Kernel
|
||||
BAN::Vector<Device*> m_devices;
|
||||
|
||||
friend class BAN::RefPtr<DeviceManager>;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t mode() const override { return Mode::IFDIR | Mode::IRUSR | Mode::IWUSR | Mode::IXUSR | Mode::IRGRP | Mode::IXGRP | Mode::IROTH | Mode::IXOTH; }
|
||||
virtual nlink_t nlink() const override { return 0; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual blksize_t blksize() const override { return 0; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return 0x4935; }
|
||||
virtual dev_t rdev() const override { return 0x7854; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { ASSERT_NOT_REACHED(); }
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) { ASSERT_NOT_REACHED(); }
|
||||
};
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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(); }
|
||||
};
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -8,8 +8,27 @@ namespace Kernel::Input
|
||||
class PS2Device : public CharacterDevice
|
||||
{
|
||||
public:
|
||||
PS2Device(dev_t);
|
||||
virtual ~PS2Device() {}
|
||||
virtual void on_byte(uint8_t) = 0;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const { return m_ino; }
|
||||
virtual mode_t mode() const override { return Mode::IFCHR | Mode::IRUSR | Mode::IRGRP; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return m_time; }
|
||||
virtual timespec mtime() const override { return m_time; }
|
||||
virtual timespec ctime() const override { return m_time; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return m_dev; }
|
||||
|
||||
private:
|
||||
timespec m_time;
|
||||
ino_t m_ino;
|
||||
dev_t m_dev;
|
||||
};
|
||||
|
||||
class PS2Controller
|
||||
|
||||
@@ -26,14 +26,16 @@ namespace Kernel::Input
|
||||
};
|
||||
|
||||
public:
|
||||
static BAN::ErrorOr<PS2Keyboard*> create(PS2Controller&);
|
||||
static BAN::ErrorOr<PS2Keyboard*> create(PS2Controller&, dev_t);
|
||||
|
||||
virtual void on_byte(uint8_t) override;
|
||||
virtual void update() override;
|
||||
|
||||
private:
|
||||
PS2Keyboard(PS2Controller& controller)
|
||||
: m_controller(controller)
|
||||
PS2Keyboard(PS2Controller& controller, dev_t device)
|
||||
: PS2Device(device)
|
||||
, m_controller(controller)
|
||||
, m_name(BAN::String::formatted("input{}", device))
|
||||
{}
|
||||
BAN::ErrorOr<void> initialize();
|
||||
|
||||
@@ -58,30 +60,13 @@ namespace Kernel::Input
|
||||
|
||||
State m_state { State::Normal };
|
||||
|
||||
BAN::String m_name;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t mode() const override { return IFCHR | IRUSR | IRGRP; }
|
||||
virtual nlink_t nlink() const override { return 0; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual BAN::StringView name() const override { return m_name; }
|
||||
virtual blksize_t blksize() const override { return sizeof(KeyEvent); }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
|
||||
virtual BAN::StringView name() const override { return "input"sv; }
|
||||
|
||||
virtual dev_t rdev() const override { return 0x8594; }
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
|
||||
virtual InodeType type() const override { return InodeType::Device; }
|
||||
virtual bool operator==(const Inode&) const override { return false; }
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user