1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:38:11 +00:00

Kernel: Make FileSystem::initialize() return KResult

This forced me to also come up with error codes for a bunch of
situations where we'd previously just panic the kernel.
This commit is contained in:
Andreas Kling 2021-08-14 14:02:47 +02:00
parent 46b93174fc
commit d30d776ca4
21 changed files with 61 additions and 58 deletions

View file

@ -114,26 +114,26 @@ BlockBasedFileSystem::~BlockBasedFileSystem()
{ {
} }
bool BlockBasedFileSystem::initialize() KResult BlockBasedFileSystem::initialize()
{ {
VERIFY(block_size() != 0); VERIFY(block_size() != 0);
auto cached_block_data = KBuffer::try_create_with_size(DiskCache::EntryCount * block_size()); auto cached_block_data = KBuffer::try_create_with_size(DiskCache::EntryCount * block_size());
if (!cached_block_data) if (!cached_block_data)
return false; return ENOMEM;
auto entries_data = KBuffer::try_create_with_size(DiskCache::EntryCount * sizeof(CacheEntry)); auto entries_data = KBuffer::try_create_with_size(DiskCache::EntryCount * sizeof(CacheEntry));
if (!entries_data) if (!entries_data)
return false; return ENOMEM;
auto disk_cache = adopt_own_if_nonnull(new (nothrow) DiskCache(*this, cached_block_data.release_nonnull(), entries_data.release_nonnull())); auto disk_cache = adopt_own_if_nonnull(new (nothrow) DiskCache(*this, cached_block_data.release_nonnull(), entries_data.release_nonnull()));
if (!disk_cache) if (!disk_cache)
return false; return ENOMEM;
m_cache.with_exclusive([&](auto& cache) { m_cache.with_exclusive([&](auto& cache) {
cache = move(disk_cache); cache = move(disk_cache);
}); });
return true; return KSuccess;
} }
KResult BlockBasedFileSystem::write_block(BlockIndex index, const UserOrKernelBuffer& data, size_t count, size_t offset, bool allow_cache) KResult BlockBasedFileSystem::write_block(BlockIndex index, const UserOrKernelBuffer& data, size_t count, size_t offset, bool allow_cache)

View file

@ -16,7 +16,7 @@ public:
TYPEDEF_DISTINCT_ORDERED_ID(u64, BlockIndex); TYPEDEF_DISTINCT_ORDERED_ID(u64, BlockIndex);
virtual ~BlockBasedFileSystem() override; virtual ~BlockBasedFileSystem() override;
virtual bool initialize() override; virtual KResult initialize() override;
u64 logical_block_size() const { return m_logical_block_size; }; u64 logical_block_size() const { return m_logical_block_size; };

View file

@ -56,9 +56,9 @@ DevFS::~DevFS()
{ {
} }
bool DevFS::initialize() KResult DevFS::initialize()
{ {
return true; return KSuccess;
} }
Inode& DevFS::root_inode() Inode& DevFS::root_inode()

View file

@ -22,7 +22,7 @@ public:
virtual ~DevFS() override; virtual ~DevFS() override;
static NonnullRefPtr<DevFS> create(); static NonnullRefPtr<DevFS> create();
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "DevFS"sv; } virtual StringView class_name() const override { return "DevFS"sv; }
void notify_new_device(Device&); void notify_new_device(Device&);

View file

@ -27,17 +27,19 @@ DevPtsFS::~DevPtsFS()
static Singleton<HashTable<unsigned>> s_ptys; static Singleton<HashTable<unsigned>> s_ptys;
bool DevPtsFS::initialize() KResult DevPtsFS::initialize()
{ {
m_root_inode = adopt_ref(*new DevPtsFSInode(*this, 1, nullptr)); m_root_inode = adopt_ref_if_nonnull(new (nothrow) DevPtsFSInode(*this, 1, nullptr));
if (!m_root_inode)
return ENOMEM;
m_root_inode->m_metadata.inode = { fsid(), 1 }; m_root_inode->m_metadata.inode = { fsid(), 1 };
m_root_inode->m_metadata.mode = 0040555; m_root_inode->m_metadata.mode = 0040555;
m_root_inode->m_metadata.uid = 0; m_root_inode->m_metadata.uid = 0;
m_root_inode->m_metadata.gid = 0; m_root_inode->m_metadata.gid = 0;
m_root_inode->m_metadata.size = 0; m_root_inode->m_metadata.size = 0;
m_root_inode->m_metadata.mtime = mepoch; m_root_inode->m_metadata.mtime = mepoch;
return KSuccess;
return true;
} }
static unsigned inode_index_to_pty_index(InodeIndex inode_index) static unsigned inode_index_to_pty_index(InodeIndex inode_index)

View file

@ -22,7 +22,7 @@ public:
virtual ~DevPtsFS() override; virtual ~DevPtsFS() override;
static NonnullRefPtr<DevPtsFS> create(); static NonnullRefPtr<DevPtsFS> create();
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "DevPtsFS"sv; } virtual StringView class_name() const override { return "DevPtsFS"sv; }
virtual Inode& root_inode() override; virtual Inode& root_inode() override;

View file

@ -86,7 +86,7 @@ const ext2_group_desc& Ext2FS::group_descriptor(GroupIndex group_index) const
return block_group_descriptors()[group_index.value() - 1]; return block_group_descriptors()[group_index.value() - 1];
} }
bool Ext2FS::initialize() KResult Ext2FS::initialize()
{ {
MutexLocker locker(m_lock); MutexLocker locker(m_lock);
@ -99,8 +99,10 @@ bool Ext2FS::initialize()
if constexpr (EXT2_DEBUG) { if constexpr (EXT2_DEBUG) {
dmesgln("Ext2FS: super block magic: {:04x} (super block size: {})", super_block.s_magic, sizeof(ext2_super_block)); dmesgln("Ext2FS: super block magic: {:04x} (super block size: {})", super_block.s_magic, sizeof(ext2_super_block));
} }
if (super_block.s_magic != EXT2_SUPER_MAGIC) if (super_block.s_magic != EXT2_SUPER_MAGIC) {
return false; dmesgln("Ext2FS: Bad super block magic");
return EINVAL;
}
if constexpr (EXT2_DEBUG) { if constexpr (EXT2_DEBUG) {
dmesgln("Ext2FS: {} inodes, {} blocks", super_block.s_inodes_count, super_block.s_blocks_count); dmesgln("Ext2FS: {} inodes, {} blocks", super_block.s_inodes_count, super_block.s_blocks_count);
@ -117,9 +119,8 @@ bool Ext2FS::initialize()
set_fragment_size(EXT2_FRAG_SIZE(&super_block)); set_fragment_size(EXT2_FRAG_SIZE(&super_block));
// Note: This depends on the block size being available. // Note: This depends on the block size being available.
auto baseclass_result = BlockBasedFileSystem::initialize(); if (auto result = BlockBasedFileSystem::initialize(); result.is_error())
if (!baseclass_result) return result;
return baseclass_result;
VERIFY(block_size() <= (int)max_block_size); VERIFY(block_size() <= (int)max_block_size);
@ -127,7 +128,7 @@ bool Ext2FS::initialize()
if (m_block_group_count == 0) { if (m_block_group_count == 0) {
dmesgln("Ext2FS: no block groups :("); dmesgln("Ext2FS: no block groups :(");
return false; return EINVAL;
} }
auto blocks_to_read = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size()); auto blocks_to_read = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size());
@ -135,13 +136,12 @@ bool Ext2FS::initialize()
m_cached_group_descriptor_table = KBuffer::try_create_with_size(block_size() * blocks_to_read, Memory::Region::Access::ReadWrite, "Ext2FS: Block group descriptors"); m_cached_group_descriptor_table = KBuffer::try_create_with_size(block_size() * blocks_to_read, Memory::Region::Access::ReadWrite, "Ext2FS: Block group descriptors");
if (!m_cached_group_descriptor_table) { if (!m_cached_group_descriptor_table) {
dbgln("Ext2FS: Failed to allocate memory for group descriptor table"); dbgln("Ext2FS: Failed to allocate memory for group descriptor table");
return false; return ENOMEM;
} }
auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table->data()); auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table->data());
if (auto result = read_blocks(first_block_of_bgdt, blocks_to_read, buffer); result.is_error()) { if (auto result = read_blocks(first_block_of_bgdt, blocks_to_read, buffer); result.is_error()) {
// FIXME: Propagate the error
dbgln("Ext2FS: initialize had error: {}", result.error()); dbgln("Ext2FS: initialize had error: {}", result.error());
return false; return result;
} }
if constexpr (EXT2_DEBUG) { if constexpr (EXT2_DEBUG) {
@ -154,10 +154,10 @@ bool Ext2FS::initialize()
m_root_inode = static_ptr_cast<Ext2FSInode>(get_inode({ fsid(), EXT2_ROOT_INO })); m_root_inode = static_ptr_cast<Ext2FSInode>(get_inode({ fsid(), EXT2_ROOT_INO }));
if (!m_root_inode) { if (!m_root_inode) {
dbgln("Ext2FS: failed to acquire root inode"); dbgln("Ext2FS: failed to acquire root inode");
return false; return EINVAL;
} }
return true; return KSuccess;
} }
Ext2FSInode& Ext2FS::root_inode() Ext2FSInode& Ext2FS::root_inode()

View file

@ -92,7 +92,7 @@ public:
static NonnullRefPtr<Ext2FS> create(FileDescription&); static NonnullRefPtr<Ext2FS> create(FileDescription&);
virtual ~Ext2FS() override; virtual ~Ext2FS() override;
virtual bool initialize() override; virtual KResult initialize() override;
virtual unsigned total_block_count() const override; virtual unsigned total_block_count() const override;
virtual unsigned free_block_count() const override; virtual unsigned free_block_count() const override;

View file

@ -31,7 +31,7 @@ public:
static void sync(); static void sync();
static void lock_all(); static void lock_all();
virtual bool initialize() = 0; virtual KResult initialize() = 0;
virtual StringView class_name() const = 0; virtual StringView class_name() const = 0;
virtual Inode& root_inode() = 0; virtual Inode& root_inode() = 0;
virtual bool supports_watchers() const { return false; } virtual bool supports_watchers() const { return false; }

View file

@ -202,18 +202,15 @@ ISO9660FS::~ISO9660FS()
{ {
} }
bool ISO9660FS::initialize() KResult ISO9660FS::initialize()
{ {
if (!BlockBasedFileSystem::initialize()) if (auto result = BlockBasedFileSystem::initialize(); result.is_error())
return false; return result;
if (auto result = parse_volume_set(); result.is_error())
// FIXME: Fix the FileSystem::initialize contract to be able to return a return result;
// KResult. if (auto result = create_root_inode(); result.is_error())
if (parse_volume_set().is_error()) return result;
return false; return KSuccess;
if (create_root_inode().is_error())
return false;
return true;
} }
Inode& ISO9660FS::root_inode() Inode& ISO9660FS::root_inode()

View file

@ -312,7 +312,7 @@ public:
static KResultOr<NonnullRefPtr<ISO9660FS>> try_create(FileDescription&); static KResultOr<NonnullRefPtr<ISO9660FS>> try_create(FileDescription&);
virtual ~ISO9660FS() override; virtual ~ISO9660FS() override;
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "ISO9660FS"; } virtual StringView class_name() const override { return "ISO9660FS"; }
virtual Inode& root_inode() override; virtual Inode& root_inode() override;

View file

@ -195,7 +195,7 @@ private:
bool m_have_been_built { false }; bool m_have_been_built { false };
}; };
bool Plan9FS::initialize() KResult Plan9FS::initialize()
{ {
ensure_thread(); ensure_thread();
@ -204,7 +204,7 @@ bool Plan9FS::initialize()
auto result = post_message_and_wait_for_a_reply(version_message); auto result = post_message_and_wait_for_a_reply(version_message);
if (result.is_error()) if (result.is_error())
return false; return result;
u32 msize; u32 msize;
StringView remote_protocol_version; StringView remote_protocol_version;
@ -227,11 +227,13 @@ bool Plan9FS::initialize()
result = post_message_and_wait_for_a_reply(attach_message); result = post_message_and_wait_for_a_reply(attach_message);
if (result.is_error()) { if (result.is_error()) {
dbgln("Attaching failed"); dbgln("Attaching failed");
return false; return result;
} }
m_root_inode = Plan9FSInode::create(*this, root_fid); m_root_inode = Plan9FSInode::create(*this, root_fid);
return true; if (!m_root_inode)
return ENOMEM;
return KSuccess;
} }
Plan9FS::ProtocolVersion Plan9FS::parse_protocol_version(const StringView& s) const Plan9FS::ProtocolVersion Plan9FS::parse_protocol_version(const StringView& s) const

View file

@ -22,7 +22,7 @@ public:
virtual ~Plan9FS() override; virtual ~Plan9FS() override;
static NonnullRefPtr<Plan9FS> create(FileDescription&); static NonnullRefPtr<Plan9FS> create(FileDescription&);
virtual bool initialize() override; virtual KResult initialize() override;
virtual bool supports_watchers() const override { return false; } virtual bool supports_watchers() const override { return false; }

View file

@ -51,9 +51,9 @@ ProcFS::~ProcFS()
{ {
} }
bool ProcFS::initialize() KResult ProcFS::initialize()
{ {
return true; return KSuccess;
} }
Inode& ProcFS::root_inode() Inode& ProcFS::root_inode()

View file

@ -30,7 +30,7 @@ public:
virtual ~ProcFS() override; virtual ~ProcFS() override;
static RefPtr<ProcFS> create(); static RefPtr<ProcFS> create();
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "ProcFS"sv; } virtual StringView class_name() const override { return "ProcFS"sv; }
virtual Inode& root_inode() override; virtual Inode& root_inode() override;

View file

@ -75,9 +75,9 @@ SysFS::~SysFS()
{ {
} }
bool SysFS::initialize() KResult SysFS::initialize()
{ {
return true; return KSuccess;
} }
Inode& SysFS::root_inode() Inode& SysFS::root_inode()

View file

@ -62,7 +62,7 @@ public:
virtual ~SysFS() override; virtual ~SysFS() override;
static NonnullRefPtr<SysFS> create(); static NonnullRefPtr<SysFS> create();
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "SysFS"sv; } virtual StringView class_name() const override { return "SysFS"sv; }
virtual Inode& root_inode() override; virtual Inode& root_inode() override;

View file

@ -23,10 +23,12 @@ TmpFS::~TmpFS()
{ {
} }
bool TmpFS::initialize() KResult TmpFS::initialize()
{ {
m_root_inode = TmpFSInode::create_root(*this); m_root_inode = TmpFSInode::create_root(*this);
return !m_root_inode.is_null(); if (!m_root_inode)
return ENOMEM;
return KSuccess;
} }
Inode& TmpFS::root_inode() Inode& TmpFS::root_inode()

View file

@ -20,7 +20,7 @@ class TmpFS final : public FileSystem {
public: public:
virtual ~TmpFS() override; virtual ~TmpFS() override;
static RefPtr<TmpFS> create(); static RefPtr<TmpFS> create();
virtual bool initialize() override; virtual KResult initialize() override;
virtual StringView class_name() const override { return "TmpFS"sv; } virtual StringView class_name() const override { return "TmpFS"sv; }

View file

@ -183,8 +183,8 @@ NonnullRefPtr<FileSystem> StorageManagement::root_filesystem() const
PANIC("StorageManagement: Couldn't find a suitable device to boot from"); PANIC("StorageManagement: Couldn't find a suitable device to boot from");
} }
auto e2fs = Ext2FS::create(FileDescription::create(boot_device_description.release_nonnull()).value()); auto e2fs = Ext2FS::create(FileDescription::create(boot_device_description.release_nonnull()).value());
if (!e2fs->initialize()) { if (auto result = e2fs->initialize(); result.is_error()) {
PANIC("StorageManagement: Couldn't open root filesystem"); PANIC("StorageManagement: Couldn't open root filesystem: {}", result);
} }
return e2fs; return e2fs;
} }

View file

@ -121,9 +121,9 @@ KResultOr<FlatPtr> Process::sys$mount(Userspace<const Syscall::SC_mount_params*>
if (!fs) if (!fs)
return ENOMEM; return ENOMEM;
if (!fs->initialize()) { if (auto result = fs->initialize(); result.is_error()) {
dbgln("mount: failed to initialize {} filesystem, fd={}", fs_type, source_fd); dbgln("mount: failed to initialize {} filesystem, fd={}", fs_type, source_fd);
return ENODEV; return result;
} }
auto result = VirtualFileSystem::the().mount(fs.release_nonnull(), target_custody, params.flags); auto result = VirtualFileSystem::the().mount(fs.release_nonnull(), target_custody, params.flags);