From 65dd9d5ad3024d843c47073175546a509e12b336 Mon Sep 17 00:00:00 2001 From: Liav A Date: Mon, 6 Apr 2020 16:50:24 +0300 Subject: [PATCH] Kernel: Ensure we flush the entire ext2 superblock --- Kernel/FileSystem/Ext2FileSystem.cpp | 6 ++++-- Kernel/FileSystem/FileBackedFileSystem.cpp | 19 +++++++++++++++++++ Kernel/FileSystem/FileBackedFileSystem.h | 3 +++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 7b36144640..77a7d6bef9 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -81,7 +81,8 @@ Ext2FS::~Ext2FS() bool Ext2FS::flush_super_block() { LOCKER(m_lock); - bool success = raw_write(2, (const u8*)&m_super_block); + ASSERT((sizeof(ext2_super_block) % logical_block_size()) == 0); + bool success = raw_write_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), (const u8*)&m_super_block); ASSERT(success); return true; } @@ -96,7 +97,8 @@ const ext2_group_desc& Ext2FS::group_descriptor(GroupIndex group_index) const bool Ext2FS::initialize() { LOCKER(m_lock); - bool success = raw_read(2, (u8*)&m_super_block); + ASSERT((sizeof(ext2_super_block) % logical_block_size()) == 0); + bool success = raw_read_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), (u8*)&m_super_block); ASSERT(success); auto& super_block = this->super_block(); diff --git a/Kernel/FileSystem/FileBackedFileSystem.cpp b/Kernel/FileSystem/FileBackedFileSystem.cpp index a3d30b90c9..3ee5c09a51 100644 --- a/Kernel/FileSystem/FileBackedFileSystem.cpp +++ b/Kernel/FileSystem/FileBackedFileSystem.cpp @@ -168,6 +168,25 @@ bool FileBackedFS::raw_write(unsigned index, const u8* buffer) return true; } +bool FileBackedFS::raw_read_blocks(unsigned index, size_t count, u8* buffer) +{ + for (unsigned block = index; block < (index + count); block++) { + if (!raw_read(block, buffer)) + return false; + buffer += logical_block_size(); + } + return true; +} +bool FileBackedFS::raw_write_blocks(unsigned index, size_t count, const u8* buffer) +{ + for (unsigned block = index; block < (index + count); block++) { + if (!raw_write(block, buffer)) + return false; + buffer += logical_block_size(); + } + return true; +} + bool FileBackedFS::write_blocks(unsigned index, unsigned count, const u8* data, FileDescription* description) { ASSERT(m_logical_block_size); diff --git a/Kernel/FileSystem/FileBackedFileSystem.h b/Kernel/FileSystem/FileBackedFileSystem.h index ac2fa9fca3..498a35595e 100644 --- a/Kernel/FileSystem/FileBackedFileSystem.h +++ b/Kernel/FileSystem/FileBackedFileSystem.h @@ -58,6 +58,9 @@ protected: bool raw_read(unsigned index, u8* buffer); bool raw_write(unsigned index, const u8* buffer); + bool raw_read_blocks(unsigned index, size_t count, u8* buffer); + bool raw_write_blocks(unsigned index, size_t count, const u8* buffer); + bool write_block(unsigned index, const u8*, FileDescription* = nullptr); bool write_blocks(unsigned index, unsigned count, const u8*, FileDescription* = nullptr);