From 0c629240a40d22454488ed7df239811b19b20c74 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 6 Dec 2024 13:10:11 +0100 Subject: [PATCH] Walk: open directories with io_uring --- src/Walk.cxx | 11 ++++++++--- src/Walk.hxx | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Walk.cxx b/src/Walk.cxx index a82ba2e..1511e02 100644 --- a/src/Walk.cxx +++ b/src/Walk.cxx @@ -9,6 +9,7 @@ #include "io/Open.hxx" #include "io/uring/CoOperation.hxx" #include "co/InvokeTask.hxx" +#include "co/Task.hxx" #include "util/DeleteDisposer.hxx" #include // for O_DIRECTORY @@ -76,7 +77,7 @@ Walk::StatItem::Run(Uring::Queue &uring_) while (walk.stat.size() > MAX_STAT) co_await walk.resume_stat; - walk.AddDirectory(*directory, std::move(name)); + co_await walk.AddDirectory(*directory, std::move(name)); } else if (S_ISREG(stx.stx_mode)) { walk.AddFile(*directory, std::move(name), FileTime{stx.stx_atime.tv_sec}, stx.stx_blocks * 512ULL); @@ -150,10 +151,14 @@ Walk::ScanDirectory(WalkDirectory &directory) } } -inline void +inline Co::Task Walk::AddDirectory(WalkDirectory &parent, std::string &&name) try { - WalkDirectoryRef directory{WalkDirectoryRef::Adopt{}, *new WalkDirectory(uring, parent, OpenPath(parent.fd, name.c_str(), O_DIRECTORY))}; + WalkDirectoryRef directory{ + WalkDirectoryRef::Adopt{}, + *new WalkDirectory(uring, parent, co_await Uring::CoOpen(uring, parent.fd, name.c_str(), O_PATH|O_DIRECTORY, 0)), + }; + ScanDirectory(*directory); } catch (...) { fmt::print(stderr, "Failed to scan directory: {}\n", std::current_exception()); diff --git a/src/Walk.hxx b/src/Walk.hxx index 614a999..e01fd67 100644 --- a/src/Walk.hxx +++ b/src/Walk.hxx @@ -13,6 +13,7 @@ class FileDescriptor; namespace Uring { class Queue; } +namespace Co { template class Task; } class WalkHandler; /** @@ -68,7 +69,7 @@ public: void Start(FileDescriptor root_fd); private: - void AddDirectory(WalkDirectory &parent, std::string &&name); + Co::Task AddDirectory(WalkDirectory &parent, std::string &&name); void AddFile(WalkDirectory &parent, std::string &&name, FileTime atime, uint_least64_t size);