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

Kernel: Make Inode::lookup() return a KResultOr<NonnullRefPtr<Inode>>

This allows file systems to return arbitrary error codes instead of just
an Inode or not an Inode.
This commit is contained in:
Andreas Kling 2021-08-14 13:32:35 +02:00
parent 459115a59c
commit ef2720bcad
18 changed files with 83 additions and 72 deletions

View file

@ -93,7 +93,7 @@ KResult DevFSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEnt
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
RefPtr<Inode> DevFSInode::lookup(StringView) KResultOr<NonnullRefPtr<Inode>> DevFSInode::lookup(StringView)
{ {
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -206,15 +206,6 @@ InodeMetadata DevFSDirectoryInode::metadata() const
metadata.mtime = mepoch; metadata.mtime = mepoch;
return metadata; return metadata;
} }
KResult DevFSDirectoryInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const
{
return EINVAL;
}
RefPtr<Inode> DevFSDirectoryInode::lookup(StringView)
{
return nullptr;
}
DevFSRootDirectoryInode::DevFSRootDirectoryInode(DevFS& fs) DevFSRootDirectoryInode::DevFSRootDirectoryInode(DevFS& fs)
: DevFSDirectoryInode(fs) : DevFSDirectoryInode(fs)
@ -242,7 +233,8 @@ KResult DevFSRootDirectoryInode::traverse_as_directory(Function<bool(FileSystem:
} }
return KSuccess; return KSuccess;
} }
RefPtr<Inode> DevFSRootDirectoryInode::lookup(StringView name)
KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(fs().m_lock); MutexLocker locker(fs().m_lock);
for (auto& subdirectory : m_subdirectories) { for (auto& subdirectory : m_subdirectories) {
@ -259,7 +251,7 @@ RefPtr<Inode> DevFSRootDirectoryInode::lookup(StringView name)
return device_node; return device_node;
} }
} }
return nullptr; return ENOENT;
} }
KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(StringView name, mode_t mode, dev_t, uid_t, gid_t) KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(StringView name, mode_t mode, dev_t, uid_t, gid_t)
{ {
@ -395,10 +387,12 @@ KResult DevFSPtsDirectoryInode::traverse_as_directory(Function<bool(FileSystem::
callback({ "..", identifier(), 0 }); callback({ "..", identifier(), 0 });
return KSuccess; return KSuccess;
} }
RefPtr<Inode> DevFSPtsDirectoryInode::lookup(StringView)
KResultOr<NonnullRefPtr<Inode>> DevFSPtsDirectoryInode::lookup(StringView)
{ {
return nullptr; return ENOENT;
} }
DevFSPtsDirectoryInode::~DevFSPtsDirectoryInode() DevFSPtsDirectoryInode::~DevFSPtsDirectoryInode()
{ {
} }

View file

@ -55,7 +55,7 @@ protected:
DevFSInode(DevFS&); DevFSInode(DevFS&);
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
@ -119,8 +119,6 @@ protected:
DevFSDirectoryInode(DevFS&); DevFSDirectoryInode(DevFS&);
// ^Inode // ^Inode
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override;
NonnullRefPtrVector<DevFSDeviceInode> m_devices; NonnullRefPtrVector<DevFSDeviceInode> m_devices;
}; };
@ -136,7 +134,7 @@ public:
private: private:
explicit DevFSPtsDirectoryInode(DevFS&); explicit DevFSPtsDirectoryInode(DevFS&);
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
}; };
@ -151,7 +149,7 @@ private:
explicit DevFSRootDirectoryInode(DevFS&); explicit DevFSRootDirectoryInode(DevFS&);
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
NonnullRefPtrVector<DevFSDirectoryInode> m_subdirectories; NonnullRefPtrVector<DevFSDirectoryInode> m_subdirectories;

View file

@ -136,21 +136,24 @@ KResult DevPtsFSInode::traverse_as_directory(Function<bool(FileSystem::Directory
return KSuccess; return KSuccess;
} }
RefPtr<Inode> DevPtsFSInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
{ {
VERIFY(identifier().index() == 1); VERIFY(identifier().index() == 1);
if (name == "." || name == "..") if (name == "." || name == "..")
return this; return *this;
auto& fs = static_cast<DevPtsFS&>(this->fs()); auto& fs = static_cast<DevPtsFS&>(this->fs());
auto pty_index = name.to_uint(); auto pty_index = name.to_uint();
if (pty_index.has_value() && s_ptys->contains(pty_index.value())) { if (pty_index.has_value() && s_ptys->contains(pty_index.value())) {
return fs.get_inode({ fsid(), pty_index_to_inode_index(pty_index.value()) }); auto inode = fs.get_inode({ fsid(), pty_index_to_inode_index(pty_index.value()) });
if (!inode)
return ENOENT;
return inode.release_nonnull();
} }
return {}; return ENOENT;
} }
void DevPtsFSInode::flush_metadata() void DevPtsFSInode::flush_metadata()

View file

@ -50,7 +50,7 @@ private:
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;

View file

@ -1630,12 +1630,12 @@ KResult Ext2FSInode::populate_lookup_cache() const
return KSuccess; return KSuccess;
} }
RefPtr<Inode> Ext2FSInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> Ext2FSInode::lookup(StringView name)
{ {
VERIFY(is_directory()); VERIFY(is_directory());
dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): Looking up '{}'", identifier(), name); dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): Looking up '{}'", identifier(), name);
if (populate_lookup_cache().is_error()) if (auto result = populate_lookup_cache(); result.is_error())
return {}; return result;
InodeIndex inode_index; InodeIndex inode_index;
{ {
@ -1643,11 +1643,15 @@ RefPtr<Inode> Ext2FSInode::lookup(StringView name)
auto it = m_lookup_cache.find(name.hash(), [&](auto& entry) { return entry.key == name; }); auto it = m_lookup_cache.find(name.hash(), [&](auto& entry) { return entry.key == name; });
if (it == m_lookup_cache.end()) { if (it == m_lookup_cache.end()) {
dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): '{}' not found", identifier(), name); dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): '{}' not found", identifier(), name);
return {}; return ENOENT;
} }
inode_index = it->value; inode_index = it->value;
} }
return fs().get_inode({ fsid(), inode_index });
auto inode = fs().get_inode({ fsid(), inode_index });
if (!inode)
return ENOENT;
return inode.release_nonnull();
} }
void Ext2FSInode::one_ref_left() void Ext2FSInode::one_ref_left()

View file

@ -41,7 +41,7 @@ private:
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;

View file

@ -532,7 +532,7 @@ KResult ISO9660Inode::traverse_as_directory(Function<bool(FileSystem::DirectoryE
return KSuccess; return KSuccess;
} }
RefPtr<Inode> ISO9660Inode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> ISO9660Inode::lookup(StringView name)
{ {
auto& file_system = static_cast<ISO9660FS const&>(fs()); auto& file_system = static_cast<ISO9660FS const&>(fs());
RefPtr<Inode> inode; RefPtr<Inode> inode;
@ -558,11 +558,12 @@ RefPtr<Inode> ISO9660Inode::lookup(StringView name)
return RecursionDecision::Continue; return RecursionDecision::Continue;
}); });
if (traversal_result.is_error()) { if (traversal_result.is_error())
return {}; return traversal_result;
}
return inode; if (!inode)
return ENOENT;
return inode.release_nonnull();
} }
void ISO9660Inode::flush_metadata() void ISO9660Inode::flush_metadata()

View file

@ -351,7 +351,7 @@ public:
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;

View file

@ -53,7 +53,7 @@ public:
virtual void did_seek(FileDescription&, off_t) { } virtual void did_seek(FileDescription&, off_t) { }
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const = 0; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const = 0;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const = 0; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const = 0;
virtual RefPtr<Inode> lookup(StringView name) = 0; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) = 0;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) = 0; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) = 0;
virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0; virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0;

View file

@ -914,7 +914,7 @@ KResult Plan9FSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryE
} }
} }
RefPtr<Inode> Plan9FSInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> Plan9FSInode::lookup(StringView name)
{ {
u32 newfid = fs().allocate_fid(); u32 newfid = fs().allocate_fid();
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twalk }; Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twalk };
@ -922,7 +922,7 @@ RefPtr<Inode> Plan9FSInode::lookup(StringView name)
auto result = fs().post_message_and_wait_for_a_reply(message); auto result = fs().post_message_and_wait_for_a_reply(message);
if (result.is_error()) if (result.is_error())
return nullptr; return result;
return Plan9FSInode::create(fs(), newfid); return Plan9FSInode::create(fs(), newfid);
} }

View file

@ -159,7 +159,7 @@ public:
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
virtual KResult remove_child(const StringView& name) override; virtual KResult remove_child(const StringView& name) override;

View file

@ -146,7 +146,7 @@ KResult ProcFSGlobalInode::traverse_as_directory(Function<bool(FileSystem::Direc
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
RefPtr<Inode> ProcFSGlobalInode::lookup(StringView) KResultOr<NonnullRefPtr<Inode>> ProcFSGlobalInode::lookup(StringView)
{ {
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -200,12 +200,12 @@ KResult ProcFSDirectoryInode::traverse_as_directory(Function<bool(FileSystem::Di
return m_associated_component->traverse_as_directory(procfs().fsid(), move(callback)); return m_associated_component->traverse_as_directory(procfs().fsid(), move(callback));
} }
RefPtr<Inode> ProcFSDirectoryInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(procfs().m_lock); MutexLocker locker(procfs().m_lock);
auto component = m_associated_component->lookup(name); auto component = m_associated_component->lookup(name);
if (!component) if (!component)
return {}; return ENOMEM;
return component->to_inode(procfs()); return component->to_inode(procfs());
} }
@ -288,12 +288,12 @@ KResult ProcFSProcessDirectoryInode::traverse_as_directory(Function<bool(FileSys
return process->traverse_as_directory(procfs().fsid(), move(callback)); return process->traverse_as_directory(procfs().fsid(), move(callback));
} }
RefPtr<Inode> ProcFSProcessDirectoryInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(procfs().m_lock); MutexLocker locker(procfs().m_lock);
auto process = Process::from_pid(associated_pid()); auto process = Process::from_pid(associated_pid());
if (!process) if (!process)
return nullptr; return ESRCH;
if (name == "fd") if (name == "fd")
return ProcFSProcessSubDirectoryInode::create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()); return ProcFSProcessSubDirectoryInode::create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid());
if (name == "stacks") if (name == "stacks")
@ -314,7 +314,7 @@ RefPtr<Inode> ProcFSProcessDirectoryInode::lookup(StringView name)
return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid()); return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid());
if (name == "root") if (name == "root")
return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::RootLink, associated_pid()); return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::RootLink, associated_pid());
return nullptr; return ENOENT;
} }
NonnullRefPtr<ProcFSProcessSubDirectoryInode> ProcFSProcessSubDirectoryInode::create(const ProcFS& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) NonnullRefPtr<ProcFSProcessSubDirectoryInode> ProcFSProcessSubDirectoryInode::create(const ProcFS& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid)
@ -376,21 +376,26 @@ KResult ProcFSProcessSubDirectoryInode::traverse_as_directory(Function<bool(File
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
RefPtr<Inode> ProcFSProcessSubDirectoryInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(procfs().m_lock); MutexLocker locker(procfs().m_lock);
auto process = Process::from_pid(associated_pid()); auto process = Process::from_pid(associated_pid());
if (!process) if (!process)
return {}; return ESRCH;
RefPtr<Inode> inode;
switch (m_sub_directory_type) { switch (m_sub_directory_type) {
case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions: case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions:
return process->lookup_file_descriptions_directory(procfs(), name); inode = process->lookup_file_descriptions_directory(procfs(), name);
break;
case SegmentedProcFSIndex::ProcessSubDirectory::Stacks: case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
return process->lookup_stacks_directory(procfs(), name); inode = process->lookup_stacks_directory(procfs(), name);
break;
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
VERIFY_NOT_REACHED(); if (!inode)
return ENOENT;
return inode.release_nonnull();
} }
NonnullRefPtr<ProcFSProcessPropertyInode> ProcFSProcessPropertyInode::create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid) NonnullRefPtr<ProcFSProcessPropertyInode> ProcFSProcessPropertyInode::create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid)
@ -514,9 +519,9 @@ KResultOr<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t co
return nread; return nread;
} }
RefPtr<Inode> ProcFSProcessPropertyInode::lookup(StringView) KResultOr<NonnullRefPtr<Inode>> ProcFSProcessPropertyInode::lookup(StringView)
{ {
VERIFY_NOT_REACHED(); return EINVAL;
} }
static KResult build_from_cached_data(KBufferBuilder& builder, ProcFSInodeData& cached_data) static KResult build_from_cached_data(KBufferBuilder& builder, ProcFSInodeData& cached_data)

View file

@ -83,7 +83,7 @@ protected:
virtual void did_seek(FileDescription&, off_t) override final; virtual void did_seek(FileDescription&, off_t) override final;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView) override;
NonnullRefPtr<ProcFSExposedComponent> m_associated_component; NonnullRefPtr<ProcFSExposedComponent> m_associated_component;
}; };
@ -111,7 +111,7 @@ protected:
// ^Inode // ^Inode
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
}; };
class ProcFSProcessAssociatedInode : public ProcFSInode { class ProcFSProcessAssociatedInode : public ProcFSInode {
@ -142,7 +142,7 @@ private:
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
}; };
class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode { class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode {
@ -159,7 +159,7 @@ private:
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type; const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type;
}; };
@ -182,7 +182,7 @@ private:
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
virtual RefPtr<Inode> lookup(StringView name) override final; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override final;
KResult refresh_data(FileDescription& description); KResult refresh_data(FileDescription& description);
KResult try_to_acquire_data(Process& process, KBufferBuilder& builder) const; KResult try_to_acquire_data(Process& process, KBufferBuilder& builder) const;

View file

@ -106,7 +106,7 @@ KResult SysFSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEnt
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
RefPtr<Inode> SysFSInode::lookup(StringView) KResultOr<NonnullRefPtr<Inode>> SysFSInode::lookup(StringView)
{ {
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -195,12 +195,12 @@ KResult SysFSDirectoryInode::traverse_as_directory(Function<bool(FileSystem::Dir
return m_associated_component->traverse_as_directory(fs().fsid(), move(callback)); return m_associated_component->traverse_as_directory(fs().fsid(), move(callback));
} }
RefPtr<Inode> SysFSDirectoryInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> SysFSDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(fs().m_lock); MutexLocker locker(fs().m_lock);
auto component = m_associated_component->lookup(name); auto component = m_associated_component->lookup(name);
if (!component) if (!component)
return {}; return ENOENT;
return component->to_inode(fs()); return component->to_inode(fs());
} }

View file

@ -85,7 +85,7 @@ protected:
SysFSInode(SysFS const&, SysFSComponent const&); SysFSInode(SysFS const&, SysFSComponent const&);
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
@ -114,7 +114,7 @@ protected:
// ^Inode // ^Inode
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
}; };
} }

View file

@ -193,19 +193,24 @@ KResultOr<size_t> TmpFSInode::write_bytes(off_t offset, size_t size, const UserO
return size; return size;
} }
RefPtr<Inode> TmpFSInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> TmpFSInode::lookup(StringView name)
{ {
MutexLocker locker(m_inode_lock, Mutex::Mode::Shared); MutexLocker locker(m_inode_lock, Mutex::Mode::Shared);
VERIFY(is_directory()); VERIFY(is_directory());
if (name == ".") if (name == ".")
return this; return *this;
if (name == "..") if (name == "..") {
return fs().get_inode(m_parent); auto inode = fs().get_inode(m_parent);
// FIXME: If this cannot fail, we should probably VERIFY here instead.
if (!inode)
return ENOENT;
return inode.release_nonnull();
}
auto* child = find_child_by_name(name); auto* child = find_child_by_name(name);
if (!child) if (!child)
return {}; return ENOENT;
return child->inode; return child->inode;
} }

View file

@ -55,7 +55,7 @@ public:
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
virtual InodeMetadata metadata() const override; virtual InodeMetadata metadata() const override;
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override; virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<Inode> lookup(StringView name) override; virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
virtual void flush_metadata() override; virtual void flush_metadata() override;
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override; virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;

View file

@ -965,16 +965,17 @@ KResultOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(S
} }
// Okay, let's look up this part. // Okay, let's look up this part.
auto child_inode = parent.inode().lookup(part); auto child_or_error = parent.inode().lookup(part);
if (!child_inode) { if (child_or_error.is_error()) {
if (out_parent) { if (out_parent) {
// ENOENT with a non-null parent custody signals to caller that // ENOENT with a non-null parent custody signals to caller that
// we found the immediate parent of the file, but the file itself // we found the immediate parent of the file, but the file itself
// does not exist yet. // does not exist yet.
*out_parent = have_more_parts ? nullptr : &parent; *out_parent = have_more_parts ? nullptr : &parent;
} }
return ENOENT; return child_or_error.error();
} }
auto child_inode = child_or_error.release_value();
int mount_flags_for_child = parent.mount_flags(); int mount_flags_for_child = parent.mount_flags();