Kernel: Ensure we flush the entire ext2 superblock

This commit is contained in:
Liav A 2020-04-06 16:50:24 +03:00 committed by Andreas Kling
parent 061badeaea
commit 65dd9d5ad3
Notes: sideshowbarker 2024-07-19 07:50:58 +09:00
3 changed files with 26 additions and 2 deletions

View File

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

View File

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

View File

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