summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r--Kernel/FileSystem/BlockBasedFileSystem.cpp32
-rw-r--r--Kernel/FileSystem/BlockBasedFileSystem.h8
-rw-r--r--Kernel/FileSystem/Ext2FileSystem.cpp16
-rw-r--r--Kernel/FileSystem/Ext2FileSystem.h2
-rw-r--r--Kernel/FileSystem/ISO9660FileSystem.cpp19
5 files changed, 34 insertions, 43 deletions
diff --git a/Kernel/FileSystem/BlockBasedFileSystem.cpp b/Kernel/FileSystem/BlockBasedFileSystem.cpp
index 92b25609d5..e02b3211a0 100644
--- a/Kernel/FileSystem/BlockBasedFileSystem.cpp
+++ b/Kernel/FileSystem/BlockBasedFileSystem.cpp
@@ -169,44 +169,40 @@ ErrorOr<void> BlockBasedFileSystem::write_block(BlockIndex index, const UserOrKe
});
}
-bool BlockBasedFileSystem::raw_read(BlockIndex index, UserOrKernelBuffer& buffer)
+ErrorOr<void> BlockBasedFileSystem::raw_read(BlockIndex index, UserOrKernelBuffer& buffer)
{
auto base_offset = index.value() * m_logical_block_size;
- auto nread = file_description().read(buffer, base_offset, m_logical_block_size);
- VERIFY(!nread.is_error());
- VERIFY(nread.value() == m_logical_block_size);
- return true;
+ auto nread = TRY(file_description().read(buffer, base_offset, m_logical_block_size));
+ VERIFY(nread == m_logical_block_size);
+ return {};
}
-bool BlockBasedFileSystem::raw_write(BlockIndex index, const UserOrKernelBuffer& buffer)
+ErrorOr<void> BlockBasedFileSystem::raw_write(BlockIndex index, const UserOrKernelBuffer& buffer)
{
auto base_offset = index.value() * m_logical_block_size;
- auto nwritten = file_description().write(base_offset, buffer, m_logical_block_size);
- VERIFY(!nwritten.is_error());
- VERIFY(nwritten.value() == m_logical_block_size);
- return true;
+ auto nwritten = TRY(file_description().write(base_offset, buffer, m_logical_block_size));
+ VERIFY(nwritten == m_logical_block_size);
+ return {};
}
-bool BlockBasedFileSystem::raw_read_blocks(BlockIndex index, size_t count, UserOrKernelBuffer& buffer)
+ErrorOr<void> BlockBasedFileSystem::raw_read_blocks(BlockIndex index, size_t count, UserOrKernelBuffer& buffer)
{
auto current = buffer;
for (auto block = index.value(); block < (index.value() + count); block++) {
- if (!raw_read(BlockIndex { block }, current))
- return false;
+ TRY(raw_read(BlockIndex { block }, current));
current = current.offset(logical_block_size());
}
- return true;
+ return {};
}
-bool BlockBasedFileSystem::raw_write_blocks(BlockIndex index, size_t count, const UserOrKernelBuffer& buffer)
+ErrorOr<void> BlockBasedFileSystem::raw_write_blocks(BlockIndex index, size_t count, const UserOrKernelBuffer& buffer)
{
auto current = buffer;
for (auto block = index.value(); block < (index.value() + count); block++) {
- if (!raw_write(block, current))
- return false;
+ TRY(raw_write(block, current));
current = current.offset(logical_block_size());
}
- return true;
+ return {};
}
ErrorOr<void> BlockBasedFileSystem::write_blocks(BlockIndex index, unsigned count, const UserOrKernelBuffer& data, bool allow_cache)
diff --git a/Kernel/FileSystem/BlockBasedFileSystem.h b/Kernel/FileSystem/BlockBasedFileSystem.h
index cc0008dd64..f1cfa29818 100644
--- a/Kernel/FileSystem/BlockBasedFileSystem.h
+++ b/Kernel/FileSystem/BlockBasedFileSystem.h
@@ -29,11 +29,11 @@ protected:
ErrorOr<void> read_block(BlockIndex, UserOrKernelBuffer*, size_t count, size_t offset = 0, bool allow_cache = true) const;
ErrorOr<void> read_blocks(BlockIndex, unsigned count, UserOrKernelBuffer&, bool allow_cache = true) const;
- bool raw_read(BlockIndex, UserOrKernelBuffer&);
- bool raw_write(BlockIndex, const UserOrKernelBuffer&);
+ ErrorOr<void> raw_read(BlockIndex, UserOrKernelBuffer&);
+ ErrorOr<void> raw_write(BlockIndex, const UserOrKernelBuffer&);
- bool raw_read_blocks(BlockIndex index, size_t count, UserOrKernelBuffer&);
- bool raw_write_blocks(BlockIndex index, size_t count, const UserOrKernelBuffer&);
+ ErrorOr<void> raw_read_blocks(BlockIndex index, size_t count, UserOrKernelBuffer&);
+ ErrorOr<void> raw_write_blocks(BlockIndex index, size_t count, const UserOrKernelBuffer&);
ErrorOr<void> write_block(BlockIndex, const UserOrKernelBuffer&, size_t count, size_t offset = 0, bool allow_cache = true);
ErrorOr<void> write_blocks(BlockIndex, unsigned count, const UserOrKernelBuffer&, bool allow_cache = true);
diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp
index ef9612f2aa..a1e50ed1ff 100644
--- a/Kernel/FileSystem/Ext2FileSystem.cpp
+++ b/Kernel/FileSystem/Ext2FileSystem.cpp
@@ -63,14 +63,12 @@ Ext2FS::~Ext2FS()
{
}
-bool Ext2FS::flush_super_block()
+ErrorOr<void> Ext2FS::flush_super_block()
{
MutexLocker locker(m_lock);
VERIFY((sizeof(ext2_super_block) % logical_block_size()) == 0);
auto super_block_buffer = UserOrKernelBuffer::for_kernel_buffer((u8*)&m_super_block);
- bool success = raw_write_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), super_block_buffer);
- VERIFY(success);
- return true;
+ return raw_write_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), super_block_buffer);
}
const ext2_group_desc& Ext2FS::group_descriptor(GroupIndex group_index) const
@@ -87,8 +85,7 @@ ErrorOr<void> Ext2FS::initialize()
VERIFY((sizeof(ext2_super_block) % logical_block_size()) == 0);
auto super_block_buffer = UserOrKernelBuffer::for_kernel_buffer((u8*)&m_super_block);
- bool success = raw_read_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), super_block_buffer);
- VERIFY(success);
+ TRY(raw_read_blocks(2, (sizeof(ext2_super_block) / logical_block_size()), super_block_buffer));
auto const& super_block = this->super_block();
if constexpr (EXT2_DEBUG) {
@@ -679,7 +676,12 @@ void Ext2FS::flush_writes()
{
MutexLocker locker(m_lock);
if (m_super_block_dirty) {
- flush_super_block();
+ auto result = flush_super_block();
+ if (result.is_error()) {
+ dbgln("Ext2FS[{}]::flush_writes(): Failed to write superblock: {}", fsid(), result.error());
+ // FIXME: We should handle this error.
+ VERIFY_NOT_REACHED();
+ }
m_super_block_dirty = false;
}
if (m_block_group_descriptors_dirty) {
diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h
index 7f13e9658f..4dd6ad904b 100644
--- a/Kernel/FileSystem/Ext2FileSystem.h
+++ b/Kernel/FileSystem/Ext2FileSystem.h
@@ -122,7 +122,7 @@ private:
ErrorOr<void> write_ext2_inode(InodeIndex, ext2_inode const&);
bool find_block_containing_inode(InodeIndex, BlockIndex& block_index, unsigned& offset) const;
- bool flush_super_block();
+ ErrorOr<void> flush_super_block();
virtual StringView class_name() const override { return "Ext2FS"sv; }
virtual Ext2FSInode& root_inode() override;
diff --git a/Kernel/FileSystem/ISO9660FileSystem.cpp b/Kernel/FileSystem/ISO9660FileSystem.cpp
index ee208e9f3d..316209e6de 100644
--- a/Kernel/FileSystem/ISO9660FileSystem.cpp
+++ b/Kernel/FileSystem/ISO9660FileSystem.cpp
@@ -234,10 +234,10 @@ ErrorOr<void> ISO9660FS::parse_volume_set()
auto current_block_index = first_data_area_block;
while (true) {
- bool result = raw_read(BlockIndex { current_block_index }, block_buffer);
- if (!result) {
- dbgln_if(ISO9660_DEBUG, "Failed to read volume descriptor from ISO file");
- return EIO;
+ auto result = raw_read(BlockIndex { current_block_index }, block_buffer);
+ if (result.is_error()) {
+ dbgln_if(ISO9660_DEBUG, "Failed to read volume descriptor from ISO file: {}", result.error());
+ return result;
}
auto const* header = reinterpret_cast<ISO::VolumeDescriptorHeader const*>(block->data());
@@ -387,11 +387,7 @@ ErrorOr<NonnullRefPtr<ISO9660FS::DirectoryEntry>> ISO9660FS::directory_entry_for
auto blocks = TRY(KBuffer::try_create_with_size(data_length, Memory::Region::Access::Read | Memory::Region::Access::Write, "ISO9660FS: Directory traversal buffer"));
auto blocks_buffer = UserOrKernelBuffer::for_kernel_buffer(blocks->data());
- auto did_read = raw_read_blocks(BlockBasedFileSystem::BlockIndex { extent_location }, data_length / logical_block_size(), blocks_buffer);
- if (!did_read) {
- return EIO;
- }
-
+ TRY(raw_read_blocks(BlockBasedFileSystem::BlockIndex { extent_location }, data_length / logical_block_size(), blocks_buffer));
auto entry = TRY(DirectoryEntry::try_create(extent_location, data_length, move(blocks)));
m_directory_entry_cache.set(key, entry);
@@ -428,10 +424,7 @@ ErrorOr<size_t> ISO9660Inode::read_bytes(off_t offset, size_t size, UserOrKernel
auto buffer_offset = buffer.offset(nread);
dbgln_if(ISO9660_VERY_DEBUG, "ISO9660Inode::read_bytes: Reading {} bytes into buffer offset {}/{}, logical block index: {}", bytes_to_read, nread, total_bytes, current_block_index.value());
- if (bool result = const_cast<ISO9660FS&>(fs()).raw_read(current_block_index, block_buffer); !result) {
- return EIO;
- }
-
+ TRY(const_cast<ISO9660FS&>(fs()).raw_read(current_block_index, block_buffer));
TRY(buffer_offset.write(block->data() + initial_offset, bytes_to_read));
nread += bytes_to_read;