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);
auto cached_block_data = KBuffer::try_create_with_size(DiskCache::EntryCount * block_size());
if (!cached_block_data)
return false;
return ENOMEM;
auto entries_data = KBuffer::try_create_with_size(DiskCache::EntryCount * sizeof(CacheEntry));
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()));
if (!disk_cache)
return false;
return ENOMEM;
m_cache.with_exclusive([&](auto& 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)

View file

@ -16,7 +16,7 @@ public:
TYPEDEF_DISTINCT_ORDERED_ID(u64, BlockIndex);
virtual ~BlockBasedFileSystem() override;
virtual bool initialize() override;
virtual KResult initialize() override;
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()

View file

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

View file

@ -27,17 +27,19 @@ DevPtsFS::~DevPtsFS()
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.mode = 0040555;
m_root_inode->m_metadata.uid = 0;
m_root_inode->m_metadata.gid = 0;
m_root_inode->m_metadata.size = 0;
m_root_inode->m_metadata.mtime = mepoch;
return true;
return KSuccess;
}
static unsigned inode_index_to_pty_index(InodeIndex inode_index)

View file

@ -22,7 +22,7 @@ public:
virtual ~DevPtsFS() override;
static NonnullRefPtr<DevPtsFS> create();
virtual bool initialize() override;
virtual KResult initialize() override;
virtual StringView class_name() const override { return "DevPtsFS"sv; }
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];
}
bool Ext2FS::initialize()
KResult Ext2FS::initialize()
{
MutexLocker locker(m_lock);
@ -99,8 +99,10 @@ bool Ext2FS::initialize()
if constexpr (EXT2_DEBUG) {
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)
return false;
if (super_block.s_magic != EXT2_SUPER_MAGIC) {
dmesgln("Ext2FS: Bad super block magic");
return EINVAL;
}
if constexpr (EXT2_DEBUG) {
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));
// Note: This depends on the block size being available.
auto baseclass_result = BlockBasedFileSystem::initialize();
if (!baseclass_result)
return baseclass_result;
if (auto result = BlockBasedFileSystem::initialize(); result.is_error())
return result;
VERIFY(block_size() <= (int)max_block_size);
@ -127,7 +128,7 @@ bool Ext2FS::initialize()
if (m_block_group_count == 0) {
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());
@ -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");
if (!m_cached_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());
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());
return false;
return result;
}
if constexpr (EXT2_DEBUG) {
@ -154,10 +154,10 @@ bool Ext2FS::initialize()
m_root_inode = static_ptr_cast<Ext2FSInode>(get_inode({ fsid(), EXT2_ROOT_INO }));
if (!m_root_inode) {
dbgln("Ext2FS: failed to acquire root inode");
return false;
return EINVAL;
}
return true;
return KSuccess;
}
Ext2FSInode& Ext2FS::root_inode()

View file

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

View file

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

View file

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

View file

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

View file

@ -195,7 +195,7 @@ private:
bool m_have_been_built { false };
};
bool Plan9FS::initialize()
KResult Plan9FS::initialize()
{
ensure_thread();
@ -204,7 +204,7 @@ bool Plan9FS::initialize()
auto result = post_message_and_wait_for_a_reply(version_message);
if (result.is_error())
return false;
return result;
u32 msize;
StringView remote_protocol_version;
@ -227,11 +227,13 @@ bool Plan9FS::initialize()
result = post_message_and_wait_for_a_reply(attach_message);
if (result.is_error()) {
dbgln("Attaching failed");
return false;
return result;
}
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

View file

@ -22,7 +22,7 @@ public:
virtual ~Plan9FS() override;
static NonnullRefPtr<Plan9FS> create(FileDescription&);
virtual bool initialize() override;
virtual KResult initialize() override;
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()

View file

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

View file

@ -62,7 +62,7 @@ public:
virtual ~SysFS() override;
static NonnullRefPtr<SysFS> create();
virtual bool initialize() override;
virtual KResult initialize() override;
virtual StringView class_name() const override { return "SysFS"sv; }
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);
return !m_root_inode.is_null();
if (!m_root_inode)
return ENOMEM;
return KSuccess;
}
Inode& TmpFS::root_inode()

View file

@ -20,7 +20,7 @@ class TmpFS final : public FileSystem {
public:
virtual ~TmpFS() override;
static RefPtr<TmpFS> create();
virtual bool initialize() override;
virtual KResult initialize() override;
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");
}
auto e2fs = Ext2FS::create(FileDescription::create(boot_device_description.release_nonnull()).value());
if (!e2fs->initialize()) {
PANIC("StorageManagement: Couldn't open root filesystem");
if (auto result = e2fs->initialize(); result.is_error()) {
PANIC("StorageManagement: Couldn't open root filesystem: {}", result);
}
return e2fs;
}

View file

@ -121,9 +121,9 @@ KResultOr<FlatPtr> Process::sys$mount(Userspace<const Syscall::SC_mount_params*>
if (!fs)
return ENOMEM;
if (!fs->initialize()) {
if (auto result = fs->initialize(); result.is_error()) {
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);