mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:18:11 +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:
parent
459115a59c
commit
ef2720bcad
18 changed files with 83 additions and 72 deletions
|
@ -93,7 +93,7 @@ KResult DevFSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEnt
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
RefPtr<Inode> DevFSInode::lookup(StringView)
|
||||
KResultOr<NonnullRefPtr<Inode>> DevFSInode::lookup(StringView)
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -206,15 +206,6 @@ InodeMetadata DevFSDirectoryInode::metadata() const
|
|||
metadata.mtime = mepoch;
|
||||
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)
|
||||
: DevFSDirectoryInode(fs)
|
||||
|
@ -242,7 +233,8 @@ KResult DevFSRootDirectoryInode::traverse_as_directory(Function<bool(FileSystem:
|
|||
}
|
||||
return KSuccess;
|
||||
}
|
||||
RefPtr<Inode> DevFSRootDirectoryInode::lookup(StringView name)
|
||||
|
||||
KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(fs().m_lock);
|
||||
for (auto& subdirectory : m_subdirectories) {
|
||||
|
@ -259,7 +251,7 @@ RefPtr<Inode> DevFSRootDirectoryInode::lookup(StringView name)
|
|||
return device_node;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
return ENOENT;
|
||||
}
|
||||
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 });
|
||||
return KSuccess;
|
||||
}
|
||||
RefPtr<Inode> DevFSPtsDirectoryInode::lookup(StringView)
|
||||
|
||||
KResultOr<NonnullRefPtr<Inode>> DevFSPtsDirectoryInode::lookup(StringView)
|
||||
{
|
||||
return nullptr;
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
DevFSPtsDirectoryInode::~DevFSPtsDirectoryInode()
|
||||
{
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ protected:
|
|||
DevFSInode(DevFS&);
|
||||
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 RefPtr<Inode> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() 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;
|
||||
|
@ -119,8 +119,6 @@ protected:
|
|||
DevFSDirectoryInode(DevFS&);
|
||||
// ^Inode
|
||||
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;
|
||||
};
|
||||
|
@ -136,7 +134,7 @@ public:
|
|||
private:
|
||||
explicit DevFSPtsDirectoryInode(DevFS&);
|
||||
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;
|
||||
};
|
||||
|
||||
|
@ -151,7 +149,7 @@ private:
|
|||
explicit DevFSRootDirectoryInode(DevFS&);
|
||||
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 RefPtr<Inode> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
|
||||
NonnullRefPtrVector<DevFSDirectoryInode> m_subdirectories;
|
||||
|
|
|
@ -136,21 +136,24 @@ KResult DevPtsFSInode::traverse_as_directory(Function<bool(FileSystem::Directory
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
RefPtr<Inode> DevPtsFSInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
|
||||
{
|
||||
VERIFY(identifier().index() == 1);
|
||||
|
||||
if (name == "." || name == "..")
|
||||
return this;
|
||||
return *this;
|
||||
|
||||
auto& fs = static_cast<DevPtsFS&>(this->fs());
|
||||
|
||||
auto pty_index = name.to_uint();
|
||||
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()
|
||||
|
|
|
@ -50,7 +50,7 @@ private:
|
|||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) 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;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() 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;
|
||||
|
|
|
@ -1630,12 +1630,12 @@ KResult Ext2FSInode::populate_lookup_cache() const
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
RefPtr<Inode> Ext2FSInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> Ext2FSInode::lookup(StringView name)
|
||||
{
|
||||
VERIFY(is_directory());
|
||||
dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): Looking up '{}'", identifier(), name);
|
||||
if (populate_lookup_cache().is_error())
|
||||
return {};
|
||||
if (auto result = populate_lookup_cache(); result.is_error())
|
||||
return result;
|
||||
|
||||
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; });
|
||||
if (it == m_lookup_cache.end()) {
|
||||
dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): '{}' not found", identifier(), name);
|
||||
return {};
|
||||
return ENOENT;
|
||||
}
|
||||
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()
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) 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;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() 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;
|
||||
|
|
|
@ -532,7 +532,7 @@ KResult ISO9660Inode::traverse_as_directory(Function<bool(FileSystem::DirectoryE
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
RefPtr<Inode> ISO9660Inode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> ISO9660Inode::lookup(StringView name)
|
||||
{
|
||||
auto& file_system = static_cast<ISO9660FS const&>(fs());
|
||||
RefPtr<Inode> inode;
|
||||
|
@ -558,11 +558,12 @@ RefPtr<Inode> ISO9660Inode::lookup(StringView name)
|
|||
return RecursionDecision::Continue;
|
||||
});
|
||||
|
||||
if (traversal_result.is_error()) {
|
||||
return {};
|
||||
}
|
||||
if (traversal_result.is_error())
|
||||
return traversal_result;
|
||||
|
||||
return inode;
|
||||
if (!inode)
|
||||
return ENOENT;
|
||||
return inode.release_nonnull();
|
||||
}
|
||||
|
||||
void ISO9660Inode::flush_metadata()
|
||||
|
|
|
@ -351,7 +351,7 @@ public:
|
|||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) 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;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() 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;
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
virtual void did_seek(FileDescription&, off_t) { }
|
||||
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 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<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;
|
||||
|
|
|
@ -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();
|
||||
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);
|
||||
|
||||
if (result.is_error())
|
||||
return nullptr;
|
||||
return result;
|
||||
|
||||
return Plan9FSInode::create(fs(), newfid);
|
||||
}
|
||||
|
|
|
@ -159,7 +159,7 @@ public:
|
|||
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 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 KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
|
|
@ -146,7 +146,7 @@ KResult ProcFSGlobalInode::traverse_as_directory(Function<bool(FileSystem::Direc
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
RefPtr<Inode> ProcFSGlobalInode::lookup(StringView)
|
||||
KResultOr<NonnullRefPtr<Inode>> ProcFSGlobalInode::lookup(StringView)
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
RefPtr<Inode> ProcFSDirectoryInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(procfs().m_lock);
|
||||
auto component = m_associated_component->lookup(name);
|
||||
if (!component)
|
||||
return {};
|
||||
return ENOMEM;
|
||||
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));
|
||||
}
|
||||
|
||||
RefPtr<Inode> ProcFSProcessDirectoryInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(procfs().m_lock);
|
||||
auto process = Process::from_pid(associated_pid());
|
||||
if (!process)
|
||||
return nullptr;
|
||||
return ESRCH;
|
||||
if (name == "fd")
|
||||
return ProcFSProcessSubDirectoryInode::create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid());
|
||||
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());
|
||||
if (name == "root")
|
||||
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)
|
||||
|
@ -376,21 +376,26 @@ KResult ProcFSProcessSubDirectoryInode::traverse_as_directory(Function<bool(File
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
RefPtr<Inode> ProcFSProcessSubDirectoryInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(procfs().m_lock);
|
||||
auto process = Process::from_pid(associated_pid());
|
||||
if (!process)
|
||||
return {};
|
||||
return ESRCH;
|
||||
RefPtr<Inode> inode;
|
||||
switch (m_sub_directory_type) {
|
||||
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:
|
||||
return process->lookup_stacks_directory(procfs(), name);
|
||||
inode = process->lookup_stacks_directory(procfs(), name);
|
||||
break;
|
||||
default:
|
||||
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)
|
||||
|
@ -514,9 +519,9 @@ KResultOr<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t co
|
|||
|
||||
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)
|
||||
|
|
|
@ -83,7 +83,7 @@ protected:
|
|||
virtual void did_seek(FileDescription&, off_t) override final;
|
||||
virtual InodeMetadata metadata() 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;
|
||||
};
|
||||
|
@ -111,7 +111,7 @@ protected:
|
|||
// ^Inode
|
||||
virtual InodeMetadata metadata() 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 {
|
||||
|
@ -142,7 +142,7 @@ private:
|
|||
virtual InodeMetadata metadata() 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 RefPtr<Inode> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
};
|
||||
|
||||
class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode {
|
||||
|
@ -159,7 +159,7 @@ private:
|
|||
virtual InodeMetadata metadata() 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 RefPtr<Inode> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
|
||||
const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type;
|
||||
};
|
||||
|
@ -182,7 +182,7 @@ private:
|
|||
virtual InodeMetadata metadata() 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 RefPtr<Inode> lookup(StringView name) override final;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override final;
|
||||
|
||||
KResult refresh_data(FileDescription& description);
|
||||
KResult try_to_acquire_data(Process& process, KBufferBuilder& builder) const;
|
||||
|
|
|
@ -106,7 +106,7 @@ KResult SysFSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEnt
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
RefPtr<Inode> SysFSInode::lookup(StringView)
|
||||
KResultOr<NonnullRefPtr<Inode>> SysFSInode::lookup(StringView)
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
RefPtr<Inode> SysFSDirectoryInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> SysFSDirectoryInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(fs().m_lock);
|
||||
auto component = m_associated_component->lookup(name);
|
||||
if (!component)
|
||||
return {};
|
||||
return ENOENT;
|
||||
return component->to_inode(fs());
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ protected:
|
|||
SysFSInode(SysFS const&, SysFSComponent const&);
|
||||
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 RefPtr<Inode> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
|
||||
|
@ -114,7 +114,7 @@ protected:
|
|||
// ^Inode
|
||||
virtual InodeMetadata metadata() 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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -193,19 +193,24 @@ KResultOr<size_t> TmpFSInode::write_bytes(off_t offset, size_t size, const UserO
|
|||
return size;
|
||||
}
|
||||
|
||||
RefPtr<Inode> TmpFSInode::lookup(StringView name)
|
||||
KResultOr<NonnullRefPtr<Inode>> TmpFSInode::lookup(StringView name)
|
||||
{
|
||||
MutexLocker locker(m_inode_lock, Mutex::Mode::Shared);
|
||||
VERIFY(is_directory());
|
||||
|
||||
if (name == ".")
|
||||
return this;
|
||||
if (name == "..")
|
||||
return fs().get_inode(m_parent);
|
||||
return *this;
|
||||
if (name == "..") {
|
||||
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);
|
||||
if (!child)
|
||||
return {};
|
||||
return ENOENT;
|
||||
return child->inode;
|
||||
}
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ public:
|
|||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) 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;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() 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;
|
||||
|
|
|
@ -965,16 +965,17 @@ KResultOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(S
|
|||
}
|
||||
|
||||
// Okay, let's look up this part.
|
||||
auto child_inode = parent.inode().lookup(part);
|
||||
if (!child_inode) {
|
||||
auto child_or_error = parent.inode().lookup(part);
|
||||
if (child_or_error.is_error()) {
|
||||
if (out_parent) {
|
||||
// ENOENT with a non-null parent custody signals to caller that
|
||||
// we found the immediate parent of the file, but the file itself
|
||||
// does not exist yet.
|
||||
*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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue