Kernel: Add possibiliity to create empty files on Ext2

Big rewrite for Ext2 for more easy and optimized code
This commit is contained in:
Bananymous
2023-03-23 22:26:06 +02:00
parent 1be8b2f514
commit 75c4f35e85
6 changed files with 250 additions and 95 deletions

View File

@@ -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:

View File

@@ -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;

View File

@@ -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);