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:
parent
46b93174fc
commit
d30d776ca4
21 changed files with 61 additions and 58 deletions
|
@ -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)
|
||||||
|
|
|
@ -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; };
|
||||||
|
|
||||||
|
|
|
@ -56,9 +56,9 @@ DevFS::~DevFS()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DevFS::initialize()
|
KResult DevFS::initialize()
|
||||||
{
|
{
|
||||||
return true;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Inode& DevFS::root_inode()
|
Inode& DevFS::root_inode()
|
||||||
|
|
|
@ -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&);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -51,9 +51,9 @@ ProcFS::~ProcFS()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProcFS::initialize()
|
KResult ProcFS::initialize()
|
||||||
{
|
{
|
||||||
return true;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Inode& ProcFS::root_inode()
|
Inode& ProcFS::root_inode()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -75,9 +75,9 @@ SysFS::~SysFS()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SysFS::initialize()
|
KResult SysFS::initialize()
|
||||||
{
|
{
|
||||||
return true;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Inode& SysFS::root_inode()
|
Inode& SysFS::root_inode()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue