Kernel: Split ext2 implementation to multiple files
This commit is contained in:
@@ -1,225 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/String.h>
|
||||
#include <BAN/StringView.h>
|
||||
#include <kernel/Storage/StorageDevice.h>
|
||||
#include <kernel/FS/FileSystem.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
namespace Ext2
|
||||
{
|
||||
|
||||
struct Superblock
|
||||
{
|
||||
uint32_t inodes_count;
|
||||
uint32_t blocks_count;
|
||||
uint32_t r_blocks_count;
|
||||
uint32_t free_blocks_count;
|
||||
uint32_t free_inodes_count;
|
||||
uint32_t first_data_block;
|
||||
uint32_t log_block_size;
|
||||
uint32_t log_frag_size;
|
||||
uint32_t blocks_per_group;
|
||||
uint32_t frags_per_group;
|
||||
uint32_t inodes_per_group;
|
||||
uint32_t mtime;
|
||||
uint32_t wtime;
|
||||
uint16_t mnt_count;
|
||||
uint16_t max_mnt_count;
|
||||
uint16_t magic;
|
||||
uint16_t state;
|
||||
uint16_t errors;
|
||||
uint16_t minor_rev_level;
|
||||
uint32_t lastcheck;
|
||||
uint32_t checkinterval;
|
||||
uint32_t creator_os;
|
||||
uint32_t rev_level;
|
||||
uint16_t def_resuid;
|
||||
uint16_t def_resgid;
|
||||
|
||||
// -- EXT2_DYNAMIC_REV Specific --
|
||||
uint8_t __extension_start[0];
|
||||
uint32_t first_ino;
|
||||
uint16_t inode_size;
|
||||
uint16_t block_group_nr;
|
||||
uint32_t feature_compat;
|
||||
uint32_t feature_incompat;
|
||||
uint32_t feature_ro_compat;
|
||||
uint8_t uuid[16];
|
||||
uint8_t volume_name[16];
|
||||
char last_mounted[64];
|
||||
uint32_t algo_bitmap;
|
||||
|
||||
// -- Performance Hints --
|
||||
uint8_t s_prealloc_blocks;
|
||||
uint8_t s_prealloc_dir_blocks;
|
||||
uint16_t __alignment;
|
||||
|
||||
// -- Journaling Support --
|
||||
uint8_t journal_uuid[16];
|
||||
uint32_t journal_inum;
|
||||
uint32_t journal_dev;
|
||||
uint32_t last_orphan;
|
||||
|
||||
// -- Directory Indexing Support --
|
||||
uint32_t hash_seed[4];
|
||||
uint8_t def_hash_version;
|
||||
uint8_t __padding[3];
|
||||
|
||||
// -- Other options --
|
||||
uint32_t default_mount_options;
|
||||
uint32_t first_meta_bg;
|
||||
};
|
||||
|
||||
struct BlockGroupDescriptor
|
||||
{
|
||||
uint32_t block_bitmap;
|
||||
uint32_t inode_bitmap;
|
||||
uint32_t inode_table;
|
||||
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
|
||||
{
|
||||
uint16_t mode;
|
||||
uint16_t uid;
|
||||
uint32_t size;
|
||||
uint32_t atime;
|
||||
uint32_t ctime;
|
||||
uint32_t mtime;
|
||||
uint32_t dtime;
|
||||
uint16_t gid;
|
||||
uint16_t links_count;
|
||||
uint32_t blocks;
|
||||
uint32_t flags;
|
||||
uint32_t osd1;
|
||||
uint32_t block[15];
|
||||
uint32_t generation;
|
||||
uint32_t file_acl;
|
||||
uint32_t dir_acl;
|
||||
uint32_t faddr;
|
||||
uint32_t osd2[3];
|
||||
};
|
||||
|
||||
struct LinkedDirectoryEntry
|
||||
{
|
||||
uint32_t inode;
|
||||
uint16_t rec_len;
|
||||
uint8_t name_len;
|
||||
uint8_t file_type;
|
||||
char name[0];
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
class Ext2FS;
|
||||
|
||||
class Ext2Inode final : public Inode
|
||||
{
|
||||
public:
|
||||
virtual ino_t ino() const override { return m_ino; };
|
||||
virtual Mode mode() const override { return { m_inode.mode }; }
|
||||
virtual nlink_t nlink() const override { return m_inode.links_count; }
|
||||
virtual uid_t uid() const override { return m_inode.uid; }
|
||||
virtual gid_t gid() const override { return m_inode.gid; }
|
||||
virtual off_t size() const override { return m_inode.size; }
|
||||
virtual timespec atime() const override { return timespec { .tv_sec = m_inode.atime, .tv_nsec = 0 }; }
|
||||
virtual timespec mtime() const override { return timespec { .tv_sec = m_inode.mtime, .tv_nsec = 0 }; }
|
||||
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::ErrorOr<BAN::String> link_target() override;
|
||||
|
||||
virtual BAN::ErrorOr<void> directory_read_next_entries(off_t, DirectoryEntryList*, size_t) override;
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> directory_find_inode(BAN::StringView) override;
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
virtual BAN::ErrorOr<size_t> write(size_t, const void*, size_t) override;
|
||||
virtual BAN::ErrorOr<void> truncate(size_t) override;
|
||||
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t, uid_t, gid_t) override;
|
||||
|
||||
private:
|
||||
BAN::ErrorOr<void> for_data_block_index(uint32_t, const BAN::Function<void(uint32_t&)>&, bool allocate);
|
||||
|
||||
BAN::ErrorOr<uint32_t> data_block_index(uint32_t);
|
||||
BAN::ErrorOr<uint32_t> allocate_new_block();
|
||||
BAN::ErrorOr<void> sync();
|
||||
|
||||
uint32_t block_group() const;
|
||||
|
||||
private:
|
||||
Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t ino)
|
||||
: m_fs(fs)
|
||||
, m_inode(inode)
|
||||
, m_ino(ino)
|
||||
{}
|
||||
static BAN::ErrorOr<BAN::RefPtr<Inode>> create(Ext2FS&, uint32_t);
|
||||
|
||||
private:
|
||||
Ext2FS& m_fs;
|
||||
Ext2::Inode m_inode;
|
||||
const uint32_t m_ino;
|
||||
|
||||
friend class Ext2FS;
|
||||
friend class BAN::RefPtr<Ext2Inode>;
|
||||
};
|
||||
|
||||
class Ext2FS final : public FileSystem
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<Ext2FS*> create(Partition&);
|
||||
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return m_root_inode; }
|
||||
|
||||
private:
|
||||
Ext2FS(Partition& partition)
|
||||
: m_partition(partition)
|
||||
{}
|
||||
|
||||
BAN::ErrorOr<void> initialize_superblock();
|
||||
BAN::ErrorOr<void> initialize_root_inode();
|
||||
|
||||
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);
|
||||
|
||||
void read_block(uint32_t, BAN::Span<uint8_t>);
|
||||
void write_block(uint32_t, BAN::Span<const uint8_t>);
|
||||
void sync_superblock();
|
||||
|
||||
BAN::ErrorOr<uint32_t> reserve_free_block(uint32_t primary_bgd);
|
||||
|
||||
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:
|
||||
Partition& m_partition;
|
||||
|
||||
BAN::RefPtr<Inode> m_root_inode;
|
||||
BAN::Vector<uint32_t> m_superblock_backups;
|
||||
|
||||
Ext2::Superblock m_superblock;
|
||||
|
||||
friend class Ext2Inode;
|
||||
};
|
||||
|
||||
}
|
||||
262
kernel/include/kernel/FS/Ext2/Definitions.h
Normal file
262
kernel/include/kernel/FS/Ext2/Definitions.h
Normal file
@@ -0,0 +1,262 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace Kernel::Ext2
|
||||
{
|
||||
|
||||
struct Superblock
|
||||
{
|
||||
uint32_t inodes_count;
|
||||
uint32_t blocks_count;
|
||||
uint32_t r_blocks_count;
|
||||
uint32_t free_blocks_count;
|
||||
uint32_t free_inodes_count;
|
||||
uint32_t first_data_block;
|
||||
uint32_t log_block_size;
|
||||
uint32_t log_frag_size;
|
||||
uint32_t blocks_per_group;
|
||||
uint32_t frags_per_group;
|
||||
uint32_t inodes_per_group;
|
||||
uint32_t mtime;
|
||||
uint32_t wtime;
|
||||
uint16_t mnt_count;
|
||||
uint16_t max_mnt_count;
|
||||
uint16_t magic;
|
||||
uint16_t state;
|
||||
uint16_t errors;
|
||||
uint16_t minor_rev_level;
|
||||
uint32_t lastcheck;
|
||||
uint32_t checkinterval;
|
||||
uint32_t creator_os;
|
||||
uint32_t rev_level;
|
||||
uint16_t def_resuid;
|
||||
uint16_t def_resgid;
|
||||
|
||||
// -- EXT2_DYNAMIC_REV Specific --
|
||||
uint8_t __extension_start[0];
|
||||
uint32_t first_ino;
|
||||
uint16_t inode_size;
|
||||
uint16_t block_group_nr;
|
||||
uint32_t feature_compat;
|
||||
uint32_t feature_incompat;
|
||||
uint32_t feature_ro_compat;
|
||||
uint8_t uuid[16];
|
||||
uint8_t volume_name[16];
|
||||
char last_mounted[64];
|
||||
uint32_t algo_bitmap;
|
||||
|
||||
// -- Performance Hints --
|
||||
uint8_t s_prealloc_blocks;
|
||||
uint8_t s_prealloc_dir_blocks;
|
||||
uint16_t __alignment;
|
||||
|
||||
// -- Journaling Support --
|
||||
uint8_t journal_uuid[16];
|
||||
uint32_t journal_inum;
|
||||
uint32_t journal_dev;
|
||||
uint32_t last_orphan;
|
||||
|
||||
// -- Directory Indexing Support --
|
||||
uint32_t hash_seed[4];
|
||||
uint8_t def_hash_version;
|
||||
uint8_t __padding[3];
|
||||
|
||||
// -- Other options --
|
||||
uint32_t default_mount_options;
|
||||
uint32_t first_meta_bg;
|
||||
};
|
||||
|
||||
struct BlockGroupDescriptor
|
||||
{
|
||||
uint32_t block_bitmap;
|
||||
uint32_t inode_bitmap;
|
||||
uint32_t inode_table;
|
||||
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
|
||||
{
|
||||
uint16_t mode;
|
||||
uint16_t uid;
|
||||
uint32_t size;
|
||||
uint32_t atime;
|
||||
uint32_t ctime;
|
||||
uint32_t mtime;
|
||||
uint32_t dtime;
|
||||
uint16_t gid;
|
||||
uint16_t links_count;
|
||||
uint32_t blocks;
|
||||
uint32_t flags;
|
||||
uint32_t osd1;
|
||||
uint32_t block[15];
|
||||
uint32_t generation;
|
||||
uint32_t file_acl;
|
||||
uint32_t dir_acl;
|
||||
uint32_t faddr;
|
||||
uint32_t osd2[3];
|
||||
};
|
||||
|
||||
struct LinkedDirectoryEntry
|
||||
{
|
||||
uint32_t inode;
|
||||
uint16_t rec_len;
|
||||
uint8_t name_len;
|
||||
uint8_t file_type;
|
||||
char name[0];
|
||||
};
|
||||
|
||||
namespace Enum
|
||||
{
|
||||
|
||||
constexpr uint16_t SUPER_MAGIC = 0xEF53;
|
||||
|
||||
enum State
|
||||
{
|
||||
VALID_FS = 1,
|
||||
ERROR_FS = 2,
|
||||
};
|
||||
|
||||
enum Errors
|
||||
{
|
||||
ERRORS_CONTINUE = 1,
|
||||
ERRORS_RO = 2,
|
||||
ERRORS_PANIC = 3,
|
||||
};
|
||||
|
||||
enum CreatorOS
|
||||
{
|
||||
OS_LINUX = 0,
|
||||
OS_HURD = 1,
|
||||
OS_MASIX = 2,
|
||||
OS_FREEBSD = 3,
|
||||
OS_LITES = 4,
|
||||
};
|
||||
|
||||
enum RevLevel
|
||||
{
|
||||
GOOD_OLD_REV = 0,
|
||||
DYNAMIC_REV = 1,
|
||||
};
|
||||
|
||||
enum Rev0Constant
|
||||
{
|
||||
GOOD_OLD_FIRST_INO = 11,
|
||||
GOOD_OLD_INODE_SIZE = 128,
|
||||
};
|
||||
|
||||
enum FeatureCompat
|
||||
{
|
||||
FEATURE_COMPAT_DIR_PREALLOC = 0x0001,
|
||||
FEATURE_COMPAT_IMAGIC_INODES = 0x0002,
|
||||
FEATURE_COMPAT_HAS_JOURNAL = 0x0004,
|
||||
FEATURE_COMPAT_EXT_ATTR = 0x0008,
|
||||
FEATURE_COMPAT_RESIZE_INO = 0x0010,
|
||||
FEATURE_COMPAT_DIR_INDEX = 0x0020,
|
||||
};
|
||||
|
||||
enum FeaturesIncompat
|
||||
{
|
||||
FEATURE_INCOMPAT_COMPRESSION = 0x0001,
|
||||
FEATURE_INCOMPAT_FILETYPE = 0x0002,
|
||||
FEATURE_INCOMPAT_RECOVER = 0x0004,
|
||||
FEATURE_INCOMPAT_JOURNAL_DEV = 0x0008,
|
||||
FEATURE_INCOMPAT_META_BG = 0x0010,
|
||||
};
|
||||
|
||||
enum FeaturesRoCompat
|
||||
{
|
||||
FEATURE_RO_COMPAT_SPARSE_SUPER = 0x0001,
|
||||
FEATURE_RO_COMPAT_LARGE_FILE = 0x0002,
|
||||
FEATURE_RO_COMPAT_BTREE_DIR = 0x0004,
|
||||
};
|
||||
|
||||
enum AlgoBitmap
|
||||
{
|
||||
LZV1_ALG = 0,
|
||||
LZRW3A_ALG = 1,
|
||||
GZIP_ALG = 2,
|
||||
BZIP2_ALG = 3,
|
||||
LZO_ALG = 4,
|
||||
};
|
||||
|
||||
enum ReservedInodes
|
||||
{
|
||||
BAD_INO = 1,
|
||||
ROOT_INO = 2,
|
||||
ACL_IDX_INO = 3,
|
||||
ACL_DATA_INO = 4,
|
||||
BOOT_LOADER_INO = 5,
|
||||
UNDEL_DIR_INO = 6,
|
||||
};
|
||||
|
||||
enum InodeMode
|
||||
{
|
||||
// -- file format --
|
||||
IFSOCK = 0xC000,
|
||||
IFLNK = 0xA000,
|
||||
IFREG = 0x8000,
|
||||
IFBLK = 0x6000,
|
||||
IFDIR = 0x4000,
|
||||
IFCHR = 0x2000,
|
||||
IFIFO = 0x1000,
|
||||
|
||||
// -- process execution user/group override --
|
||||
ISUID = 0x0800,
|
||||
ISGID = 0x0400,
|
||||
ISVTX = 0x0200,
|
||||
|
||||
// -- access rights --
|
||||
IRUSR = 0x0100,
|
||||
IWUSR = 0x0080,
|
||||
IXUSR = 0x0040,
|
||||
IRGRP = 0x0020,
|
||||
IWGRP = 0x0010,
|
||||
IXGRP = 0x0008,
|
||||
IROTH = 0x0004,
|
||||
IWOTH = 0x0002,
|
||||
IXOTH = 0x0001,
|
||||
};
|
||||
|
||||
enum InodeFlags
|
||||
{
|
||||
SECRM_FL = 0x00000001,
|
||||
UNRM_FL = 0x00000002,
|
||||
COMPR_FL = 0x00000004,
|
||||
SYNC_FL = 0x00000008,
|
||||
IMMUTABLE_FL = 0x00000010,
|
||||
APPEND_FL = 0x00000020,
|
||||
NODUMP_FL = 0x00000040,
|
||||
NOATIME_FL = 0x00000080,
|
||||
// -- Reserved for compression usage --
|
||||
DIRTY_FL = 0x00000100,
|
||||
COMPRBLK_FL = 0x00000200,
|
||||
NOCOMPR_FL = 0x00000400,
|
||||
ECOMPR_FL = 0x00000800,
|
||||
// -- End of compression flags --
|
||||
BTREE_FL = 0x00001000,
|
||||
INDEX_FL = 0x00001000,
|
||||
IMAGIC_FL = 0x00002000,
|
||||
JOURNAL_DATA_FL = 0x00004000,
|
||||
RESERVED_FL = 0x80000000,
|
||||
};
|
||||
|
||||
enum FileType
|
||||
{
|
||||
UNKNOWN = 0,
|
||||
REG_FILE = 1,
|
||||
DIR = 2,
|
||||
CHRDEV = 3,
|
||||
BLKDEV = 4,
|
||||
FIFO = 5,
|
||||
SOCK = 6,
|
||||
SYMLINK = 7,
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
58
kernel/include/kernel/FS/Ext2/FileSystem.h
Normal file
58
kernel/include/kernel/FS/Ext2/FileSystem.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#pragma once
|
||||
|
||||
#include <kernel/Storage/StorageDevice.h>
|
||||
#include <kernel/FS/FileSystem.h>
|
||||
#include <kernel/FS/Ext2/Inode.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Ext2FS final : public FileSystem
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<Ext2FS*> create(Partition&);
|
||||
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return m_root_inode; }
|
||||
|
||||
private:
|
||||
Ext2FS(Partition& partition)
|
||||
: m_partition(partition)
|
||||
{}
|
||||
|
||||
BAN::ErrorOr<void> initialize_superblock();
|
||||
BAN::ErrorOr<void> initialize_root_inode();
|
||||
|
||||
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);
|
||||
|
||||
void read_block(uint32_t, BAN::Span<uint8_t>);
|
||||
void write_block(uint32_t, BAN::Span<const uint8_t>);
|
||||
void sync_superblock();
|
||||
|
||||
BAN::ErrorOr<uint32_t> reserve_free_block(uint32_t primary_bgd);
|
||||
|
||||
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:
|
||||
Partition& m_partition;
|
||||
|
||||
BAN::RefPtr<Inode> m_root_inode;
|
||||
BAN::Vector<uint32_t> m_superblock_backups;
|
||||
|
||||
Ext2::Superblock m_superblock;
|
||||
|
||||
friend class Ext2Inode;
|
||||
};
|
||||
|
||||
}
|
||||
67
kernel/include/kernel/FS/Ext2/Inode.h
Normal file
67
kernel/include/kernel/FS/Ext2/Inode.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/String.h>
|
||||
#include <BAN/StringView.h>
|
||||
#include <kernel/FS/Ext2/Definitions.h>
|
||||
#include <kernel/FS/Inode.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Ext2FS;
|
||||
|
||||
class Ext2Inode final : public Inode
|
||||
{
|
||||
public:
|
||||
virtual ino_t ino() const override { return m_ino; };
|
||||
virtual Mode mode() const override { return { m_inode.mode }; }
|
||||
virtual nlink_t nlink() const override { return m_inode.links_count; }
|
||||
virtual uid_t uid() const override { return m_inode.uid; }
|
||||
virtual gid_t gid() const override { return m_inode.gid; }
|
||||
virtual off_t size() const override { return m_inode.size; }
|
||||
virtual timespec atime() const override { return timespec { .tv_sec = m_inode.atime, .tv_nsec = 0 }; }
|
||||
virtual timespec mtime() const override { return timespec { .tv_sec = m_inode.mtime, .tv_nsec = 0 }; }
|
||||
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::ErrorOr<BAN::String> link_target() override;
|
||||
|
||||
virtual BAN::ErrorOr<void> directory_read_next_entries(off_t, DirectoryEntryList*, size_t) override;
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> directory_find_inode(BAN::StringView) override;
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
virtual BAN::ErrorOr<size_t> write(size_t, const void*, size_t) override;
|
||||
virtual BAN::ErrorOr<void> truncate(size_t) override;
|
||||
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t, uid_t, gid_t) override;
|
||||
|
||||
private:
|
||||
BAN::ErrorOr<void> for_data_block_index(uint32_t, const BAN::Function<void(uint32_t&)>&, bool allocate);
|
||||
|
||||
BAN::ErrorOr<uint32_t> data_block_index(uint32_t);
|
||||
BAN::ErrorOr<uint32_t> allocate_new_block();
|
||||
BAN::ErrorOr<void> sync();
|
||||
|
||||
uint32_t block_group() const;
|
||||
|
||||
private:
|
||||
Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t ino)
|
||||
: m_fs(fs)
|
||||
, m_inode(inode)
|
||||
, m_ino(ino)
|
||||
{}
|
||||
static BAN::ErrorOr<BAN::RefPtr<Inode>> create(Ext2FS&, uint32_t);
|
||||
|
||||
private:
|
||||
Ext2FS& m_fs;
|
||||
Ext2::Inode m_inode;
|
||||
const uint32_t m_ino;
|
||||
|
||||
friend class Ext2FS;
|
||||
friend class BAN::RefPtr<Ext2Inode>;
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user