Kernel: Add possibiliity to create empty files on Ext2
Big rewrite for Ext2 for more easy and optimized code
This commit is contained in:
@@ -81,6 +81,8 @@ namespace Kernel
|
||||
uint16_t free_blocks_count;
|
||||
uint16_t free_inodes_count;
|
||||
uint16_t used_dirs_count;
|
||||
uint8_t __padding[2];
|
||||
uint8_t __reserved[12];
|
||||
};
|
||||
|
||||
struct Inode
|
||||
@@ -121,16 +123,18 @@ namespace Kernel
|
||||
class Ext2Inode : public Inode
|
||||
{
|
||||
public:
|
||||
virtual uint16_t uid() const override { return m_inode.uid; }
|
||||
virtual uint16_t gid() const override { return m_inode.gid; }
|
||||
virtual uint32_t size() const override { return m_inode.size; }
|
||||
virtual uid_t uid() const override { return m_inode.uid; }
|
||||
virtual gid_t gid() const override { return m_inode.gid; }
|
||||
virtual size_t size() const override { return m_inode.size; }
|
||||
|
||||
virtual Mode mode() const override { return { .mode = m_inode.mode }; }
|
||||
virtual mode_t mode() const override { return m_inode.mode; }
|
||||
|
||||
virtual BAN::StringView name() const override { return m_name; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override;
|
||||
|
||||
virtual Type type() const override { return Type::Ext2; }
|
||||
virtual bool operator==(const Inode& other) const override;
|
||||
|
||||
@@ -177,14 +181,23 @@ namespace Kernel
|
||||
BAN::ErrorOr<void> initialize_superblock();
|
||||
BAN::ErrorOr<void> initialize_root_inode();
|
||||
|
||||
BAN::ErrorOr<Ext2::Inode> read_inode(uint32_t);
|
||||
BAN::ErrorOr<uint32_t> create_inode(const Ext2::Inode&);
|
||||
BAN::ErrorOr<void> delete_inode(uint32_t);
|
||||
BAN::ErrorOr<void> resize_inode(uint32_t, size_t);
|
||||
|
||||
BAN::ErrorOr<BAN::Vector<uint8_t>> read_block(uint32_t);
|
||||
BAN::ErrorOr<void> write_block(uint32_t, BAN::Span<const uint8_t>);
|
||||
|
||||
BAN::ErrorOr<Ext2::BlockGroupDescriptor> read_block_group_descriptor(uint32_t);
|
||||
|
||||
const Ext2::Superblock& superblock() const { return m_superblock; }
|
||||
|
||||
struct BlockLocation
|
||||
{
|
||||
uint32_t block;
|
||||
uint32_t offset;
|
||||
};
|
||||
BAN::ErrorOr<BlockLocation> locate_inode(uint32_t);
|
||||
BlockLocation locate_block_group_descriptior(uint32_t);
|
||||
|
||||
uint32_t block_size() const { return 1024 << superblock().log_block_size; }
|
||||
|
||||
private:
|
||||
|
||||
@@ -4,34 +4,32 @@
|
||||
#include <BAN/String.h>
|
||||
#include <BAN/Vector.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Inode : public BAN::RefCounted<Inode>
|
||||
{
|
||||
public:
|
||||
union Mode
|
||||
enum Mode : mode_t
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint16_t IXOTH : 1; // 0x0001
|
||||
uint16_t IWOTH : 1; // 0x0002
|
||||
uint16_t IROTH : 1; // 0x0004
|
||||
uint16_t IXGRP : 1; // 0x0008
|
||||
uint16_t IWGRP : 1; // 0x0010
|
||||
uint16_t IRGRP : 1; // 0x0020
|
||||
uint16_t IXUSR : 1; // 0x0040
|
||||
uint16_t IWUSR : 1; // 0x0080
|
||||
uint16_t IRUSR : 1; // 0x0100
|
||||
uint16_t ISVTX : 1; // 0x0200
|
||||
uint16_t ISGID : 1; // 0x0400
|
||||
uint16_t ISUID : 1; // 0x0800
|
||||
uint16_t IFIFO : 1; // 0x1000
|
||||
uint16_t IFCHR : 1; // 0x2000
|
||||
uint16_t IFDIR : 1; // 0x4000
|
||||
uint16_t IFREG : 1; // 0x8000
|
||||
};
|
||||
uint16_t mode;
|
||||
IXOTH = 0x0001,
|
||||
IWOTH = 0x0002,
|
||||
IROTH = 0x0004,
|
||||
IXGRP = 0x0008,
|
||||
IWGRP = 0x0010,
|
||||
IRGRP = 0x0020,
|
||||
IXUSR = 0x0040,
|
||||
IWUSR = 0x0080,
|
||||
IRUSR = 0x0100,
|
||||
ISVTX = 0x0200,
|
||||
ISGID = 0x0400,
|
||||
ISUID = 0x0800,
|
||||
IFIFO = 0x1000,
|
||||
IFCHR = 0x2000,
|
||||
IFDIR = 0x4000,
|
||||
IFREG = 0x8000,
|
||||
};
|
||||
|
||||
enum class Type
|
||||
@@ -42,14 +40,14 @@ namespace Kernel
|
||||
public:
|
||||
virtual ~Inode() {}
|
||||
|
||||
bool ifdir() const { return mode().IFDIR; }
|
||||
bool ifreg() const { return mode().IFREG; }
|
||||
bool ifdir() const { return mode() & Mode::IFDIR; }
|
||||
bool ifreg() const { return mode() & Mode::IFREG; }
|
||||
|
||||
virtual uint16_t uid() const = 0;
|
||||
virtual uint16_t gid() const = 0;
|
||||
virtual uint32_t size() const = 0;
|
||||
virtual uid_t uid() const = 0;
|
||||
virtual gid_t gid() const = 0;
|
||||
virtual size_t size() const = 0;
|
||||
|
||||
virtual Mode mode() const = 0;
|
||||
virtual mode_t mode() const = 0;
|
||||
|
||||
virtual BAN::StringView name() const = 0;
|
||||
|
||||
@@ -58,6 +56,8 @@ namespace Kernel
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) = 0;
|
||||
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) = 0;
|
||||
|
||||
virtual Type type() const = 0;
|
||||
virtual bool operator==(const Inode&) const = 0;
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace Kernel
|
||||
BAN::ErrorOr<int> open(BAN::StringView, int);
|
||||
BAN::ErrorOr<void> close(int);
|
||||
BAN::ErrorOr<size_t> read(int, void*, size_t);
|
||||
BAN::ErrorOr<void> creat(BAN::StringView, mode_t);
|
||||
|
||||
BAN::StringView working_directory() const { return m_working_directory; }
|
||||
BAN::ErrorOr<void> set_working_directory(BAN::StringView);
|
||||
|
||||
Reference in New Issue
Block a user