mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-18 15:32:56 +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:
parent
46b93174fc
commit
d30d776ca4
|
@ -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)
|
||||
|
|
|
@ -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; };
|
||||
|
||||
|
|
|
@ -56,9 +56,9 @@ DevFS::~DevFS()
|
|||
{
|
||||
}
|
||||
|
||||
bool DevFS::initialize()
|
||||
KResult DevFS::initialize()
|
||||
{
|
||||
return true;
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
Inode& DevFS::root_inode()
|
||||
|
|
|
@ -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&);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -51,9 +51,9 @@ ProcFS::~ProcFS()
|
|||
{
|
||||
}
|
||||
|
||||
bool ProcFS::initialize()
|
||||
KResult ProcFS::initialize()
|
||||
{
|
||||
return true;
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
Inode& ProcFS::root_inode()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -75,9 +75,9 @@ SysFS::~SysFS()
|
|||
{
|
||||
}
|
||||
|
||||
bool SysFS::initialize()
|
||||
KResult SysFS::initialize()
|
||||
{
|
||||
return true;
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
Inode& SysFS::root_inode()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue