commit:     34258478c8b3a535f9f4a4666f2cbb38aecff054
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 19 19:32:52 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Dec 19 19:32:52 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=34258478

Optimize open handler

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 steve.cxx | 60 +++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index 46b2fba..433c25b 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -404,6 +404,16 @@ static void steve_open(fuse_req_t req, struct 
fuse_file_info *fi)
        static_assert(sizeof(fi->fh) >= sizeof(context->pid));
        fi->fh = context->pid;
 
+       auto process_it = state->processes.find(fi->fh);
+       if (process_it != state->processes.end()) {
+               if (state->verbose)
+                       std::print(stderr, "Device open again by PID {}\n", 
fi->fh);
+               assert(process_it->second.pid_fd != -1);
+               assert(process_it->second.pidfd_event);
+               fuse_reply_open(req, fi);
+               return;
+       }
+
        std::string cmdline;
        std::string path = std::format("/proc/{}/cmdline", fi->fh);
        if (FILE *cmdline_file = fopen(path.c_str(), "r")) {
@@ -419,41 +429,37 @@ static void steve_open(fuse_req_t req, struct 
fuse_file_info *fi)
        }
 
        if (state->verbose) {
-               if (cmdline[0]) {
+               if (!cmdline.empty()) {
                        std::print(stderr, "Device open by PID {} ({})\n", 
fi->fh, cmdline);
                } else
                        std::print(stderr, "Device open by PID {} (process name 
unknown)\n", fi->fh);
        }
 
-       if (state->processes.find(fi->fh) != state->processes.end()) {
-               assert(state->processes[fi->fh].pid_fd != -1);
-               assert(state->processes[fi->fh].pidfd_event);
-       } else {
-               int pid_fd = syscall(SYS_pidfd_open, context->pid, 0);
-               if (pid_fd == -1) {
-                       perror("unable to open pidfd, rejecting to open");
-                       fuse_reply_err(req, EIO);
-                       return;
-               }
-
-               event_ptr pidfd_event{event_new(state->evb, pid_fd, 
EV_READ|EV_PERSIST, steve_handle_pidfd, state), event_free};
-               if (!pidfd_event) {
-                       std::print(stderr, "unable to allocate event for 
pidfd");
-                       close(pid_fd);
-                       fuse_reply_err(req, EIO);
-                       return;
-               }
-               if (event_add(pidfd_event.get(), nullptr) == -1) {
-                       std::print(stderr, "failed to enable pidfd handler");
-                       close(pid_fd);
-                       fuse_reply_err(req, EIO);
-                       return;
-               }
+       int pid_fd = syscall(SYS_pidfd_open, context->pid, 0);
+       if (pid_fd == -1) {
+               std::print(stderr, "Unable to open pidfd for PID {}, rejecting 
to open: {}\n",
+                       fi->fh, strerror(errno));
+               fuse_reply_err(req, EIO);
+               return;
+       }
 
-               state->processes[fi->fh].pid_fd = pid_fd;
-               state->processes[fi->fh].pidfd_event = std::move(pidfd_event);
+       event_ptr pidfd_event{event_new(state->evb, pid_fd, EV_READ|EV_PERSIST, 
steve_handle_pidfd, state), event_free};
+       if (!pidfd_event) {
+               std::print(stderr, "Unable to allocate pidfd event for PID 
{}\n", fi->fh);
+               close(pid_fd);
+               fuse_reply_err(req, EIO);
+               return;
+       }
+       if (event_add(pidfd_event.get(), nullptr) == -1) {
+               std::print(stderr, "Unable to enable pidfd event for PID {}\n", 
fi->fh);
+               close(pid_fd);
+               fuse_reply_err(req, EIO);
+               return;
        }
 
+       steve_process *process = &state->processes[fi->fh];
+       process->pid_fd = pid_fd;
+       process->pidfd_event = std::move(pidfd_event);
        fuse_reply_open(req, fi);
 }
 

Reply via email to