diff options
Diffstat (limited to 'dev/kernel/FSKit')
| -rw-r--r-- | dev/kernel/FSKit/Ext2+IFS.h (renamed from dev/kernel/FSKit/Ext2IFS.h) | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/dev/kernel/FSKit/Ext2IFS.h b/dev/kernel/FSKit/Ext2+IFS.h index 2550cfea..d73ae43c 100644 --- a/dev/kernel/FSKit/Ext2IFS.h +++ b/dev/kernel/FSKit/Ext2+IFS.h @@ -8,33 +8,32 @@ #include <NeKit/KernelPanic.h> #include <NeKit/Utils.h> -namespace Ext2 { - +namespace Kernel::Ext2 { /// @brief Context for an EXT2 filesystem on a given drive -struct Context { +struct Ext2Context { Kernel::DriveTrait* drive{nullptr}; EXT2_SUPER_BLOCK* superblock{nullptr}; /// @brief context with a drive - explicit Context(Kernel::DriveTrait* drv) : drive(drv) {} + Ext2Context(Kernel::DriveTrait* drv) : drive(drv) {} /// @brief Clean up - ~Context() { + ~Ext2Context() { if (superblock) { Kernel::mm_free_ptr(superblock); superblock = nullptr; } } - Context(const Context&) = delete; - Context& operator=(const Context&) = delete; + Ext2Context(const Ext2Context&) = delete; + Ext2Context& operator=(const Ext2Context&) = delete; - Context(Context&& other) noexcept : drive(other.drive), superblock(other.superblock) { + Ext2Context(Ext2Context&& other) noexcept : drive(other.drive), superblock(other.superblock) { other.drive = nullptr; other.superblock = nullptr; } - Context& operator=(Context&& other) noexcept { + Ext2Context& operator=(Ext2Context&& other) noexcept { if (this != &other) { if (superblock) { Kernel::mm_free_ptr(superblock); @@ -47,12 +46,18 @@ struct Context { return *this; } - inline Kernel::UInt32 BlockSize() const { + Kernel::SizeT LeakBlockSize() const { if (!superblock) return kExt2FSBlockSizeBase; return kExt2FSBlockSizeBase << superblock->fLogBlockSize; } + + BOOL operator bool() { return superblock != nullptr; } }; +/// ======================================================================= /// +/// IFS FUNCTIONS +/// ======================================================================= /// + inline bool ext2_read_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, void* buffer, Kernel::UInt32 size) { if (!drv || !buffer) return false; @@ -62,6 +67,7 @@ inline bool ext2_read_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, void* b pkt.fPacketSize = size; pkt.fPacketLba = lba; drv->fInput(pkt); + return pkt.fPacketGood; } @@ -77,14 +83,14 @@ inline bool ext2_write_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, const return pkt.fPacketGood; } -// Load superblock -inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Context* ctx) { +inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Ext2Context* ctx) { if (!ctx || !ctx->drive) return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorInvalidData); auto buf = Kernel::mm_alloc_ptr(sizeof(EXT2_SUPER_BLOCK), true, false); if (!buf) return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorHeapOutOfMemory); Kernel::UInt32 blockLba = kExt2FSSuperblockOffset / ctx->drive->fSectorSz; + if (!ext2_read_block(ctx->drive, blockLba, buf, sizeof(EXT2_SUPER_BLOCK))) { Kernel::mm_free_ptr(buf); return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorDisk); @@ -101,7 +107,7 @@ inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Context* ctx) { } // Load inode -inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Context* ctx, Kernel::UInt32 inodeNumber) { +inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Ext2Context* ctx, Kernel::UInt32 inodeNumber) { if (!ctx || !ctx->superblock) return Kernel::ErrorOr<Ext2Node*>(Kernel::kErrorInvalidData); auto nodePtr = Kernel::mm_alloc_ptr(sizeof(Ext2Node), true, false); @@ -127,9 +133,8 @@ inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Context* ctx, Kernel::UInt32 i return Kernel::ErrorOr<Ext2Node*>(ext2Node); } -inline Kernel::UInt32 inode_offset(const Context* ctx, Kernel::UInt32 inodeNumber) { +inline Kernel::UInt32 inode_offset(const Ext2Context* ctx, Kernel::UInt32 inodeNumber) { if (!ctx || !ctx->superblock) return 0; return ((inodeNumber - 1) % ctx->superblock->fInodesPerGroup) * ctx->superblock->fInodeSize; } - -} // namespace Ext2 +} // namespace Kernel::Ext2 |
