1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 05:47:35 +00:00

Kernel: Use TRY() in ProcFS

This commit is contained in:
Andreas Kling 2021-09-05 19:01:38 +02:00
parent caaeae9607
commit 667a39df6b

View file

@ -52,11 +52,7 @@ ProcFS::~ProcFS()
KResult ProcFS::initialize() KResult ProcFS::initialize()
{ {
auto root_inode = ProcFSComponentRegistry::the().root_directory().to_inode(*this); m_root_inode = static_ptr_cast<ProcFSDirectoryInode>(TRY(ProcFSComponentRegistry::the().root_directory().to_inode(*this)));
if (root_inode.is_error())
return root_inode.error();
m_root_inode = static_ptr_cast<ProcFSDirectoryInode>(root_inode.release_value());
return KSuccess; return KSuccess;
} }
@ -207,16 +203,8 @@ KResult ProcFSDirectoryInode::traverse_as_directory(Function<bool(FileSystem::Di
KResultOr<NonnullRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name) KResultOr<NonnullRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
{ {
MutexLocker locker(procfs().m_lock); MutexLocker locker(procfs().m_lock);
auto maybe_component = m_associated_component->lookup(name); auto component = TRY(m_associated_component->lookup(name));
if (maybe_component.is_error()) return component->to_inode(procfs());
return maybe_component.error();
auto component = maybe_component.release_value();
auto maybe_inode = component->to_inode(procfs());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
} }
KResultOr<NonnullRefPtr<ProcFSLinkInode>> ProcFSLinkInode::try_create(const ProcFS& procfs, const ProcFSExposedComponent& component) KResultOr<NonnullRefPtr<ProcFSLinkInode>> ProcFSLinkInode::try_create(const ProcFS& procfs, const ProcFSExposedComponent& component)
@ -306,61 +294,24 @@ KResultOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView n
auto process = Process::from_pid(associated_pid()); auto process = Process::from_pid(associated_pid());
if (!process) if (!process)
return ESRCH; return ESRCH;
if (name == "fd") { if (name == "fd"sv)
auto maybe_inode = ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()); return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()));
if (maybe_inode.is_error()) if (name == "stacks"sv)
return maybe_inode.error(); return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()));
return maybe_inode.release_value(); if (name == "unveil"sv)
} return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Unveil, associated_pid()));
if (name == "stacks") { if (name == "pledge"sv)
auto maybe_inode = ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()); return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid()));
if (maybe_inode.is_error()) if (name == "fds"sv)
return maybe_inode.error(); return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions, associated_pid()));
return maybe_inode.release_value(); if (name == "exe"sv)
} return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid()));
if (name == "unveil") { if (name == "cwd"sv)
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Unveil, associated_pid()); return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink, associated_pid()));
if (maybe_inode.is_error()) if (name == "perf_events"sv)
return maybe_inode.error(); return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents, associated_pid()));
return maybe_inode.release_value(); if (name == "vm"sv)
} return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid()));
if (name == "pledge") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
if (name == "fds") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
if (name == "exe") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
if (name == "cwd") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
if (name == "perf_events") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
if (name == "vm") {
auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid());
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
return ENOENT; return ENOENT;
} }
@ -431,26 +382,14 @@ KResultOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringVie
auto process = Process::from_pid(associated_pid()); auto process = Process::from_pid(associated_pid());
if (!process) if (!process)
return ESRCH; return ESRCH;
RefPtr<Inode> inode;
switch (m_sub_directory_type) { switch (m_sub_directory_type) {
case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions: { case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions:
auto maybe_inode = process->lookup_file_descriptions_directory(procfs(), name); return process->lookup_file_descriptions_directory(procfs(), name);
if (maybe_inode.is_error()) case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
return maybe_inode.error(); return process->lookup_stacks_directory(procfs(), name);
return maybe_inode.release_value();
}
case SegmentedProcFSIndex::ProcessSubDirectory::Stacks: {
auto maybe_inode = process->lookup_stacks_directory(procfs(), name);
if (maybe_inode.is_error())
return maybe_inode.error();
return maybe_inode.release_value();
}
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
if (!inode)
return ENOENT;
return inode.release_nonnull();
} }
KResultOr<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid) KResultOr<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid)
@ -545,8 +484,7 @@ KResultOr<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t co
auto process = Process::from_pid(associated_pid()); auto process = Process::from_pid(associated_pid());
if (!process) if (!process)
return KResult(ESRCH); return KResult(ESRCH);
if (auto result = try_to_acquire_data(*process, builder); result.is_error()) TRY(try_to_acquire_data(*process, builder));
return result;
auto data_buffer = builder.build(); auto data_buffer = builder.build();
if (!data_buffer) if (!data_buffer)
return KResult(EFAULT); return KResult(EFAULT);
@ -591,13 +529,11 @@ KResult ProcFSProcessPropertyInode::try_to_acquire_data(Process& process, KBuffe
{ {
// FIXME: Verify process is already ref-counted // FIXME: Verify process is already ref-counted
if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions) { if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions) {
if (auto result = process.procfs_get_file_description_link(m_possible_data.property_index, builder); result.is_error()) TRY(process.procfs_get_file_description_link(m_possible_data.property_index, builder));
return result.error();
return KSuccess; return KSuccess;
} }
if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::Stacks) { if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::Stacks) {
if (auto result = process.procfs_get_thread_stack(m_possible_data.property_index, builder); result.is_error()) TRY(process.procfs_get_thread_stack(m_possible_data.property_index, builder));
return result.error();
return KSuccess; return KSuccess;
} }
@ -646,8 +582,7 @@ KResult ProcFSProcessPropertyInode::refresh_data(FileDescription& description)
return ENOMEM; return ENOMEM;
} }
KBufferBuilder builder; KBufferBuilder builder;
if (auto result = try_to_acquire_data(*process, builder); result.is_error()) TRY(try_to_acquire_data(*process, builder));
return result;
return build_from_cached_data(builder, static_cast<ProcFSInodeData&>(*cached_data)); return build_from_cached_data(builder, static_cast<ProcFSInodeData&>(*cached_data));
} }
} }