From acd8c8dba4537277044a7e5a5574c58548467d8e Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 16 Apr 2023 18:48:38 +0200 Subject: [PATCH] Kernel: Add `Inode::read_until_filled_or_end` The existing `read_entire` is quite slow due to allocating and copying multiple times, but it is simultaneously quite hard to get rid of in a single step. As a replacement, add a new function that reads as much as possible directly into a user-provided buffer. --- Kernel/FileSystem/Inode.cpp | 15 +++++++++++++++ Kernel/FileSystem/Inode.h | 1 + 2 files changed, 16 insertions(+) diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index afe3959725..ec60311822 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -118,6 +118,21 @@ ErrorOr Inode::read_bytes(off_t offset, size_t length, UserOrKernelBuffe return read_bytes_locked(offset, length, buffer, open_description); } +ErrorOr Inode::read_until_filled_or_end(off_t offset, size_t length, UserOrKernelBuffer buffer, OpenFileDescription* open_description) const +{ + auto remaining_length = length; + + while (remaining_length > 0) { + auto filled_bytes = TRY(read_bytes(offset, remaining_length, buffer, open_description)); + if (filled_bytes == 0) + break; + offset += filled_bytes; + remaining_length -= filled_bytes; + } + + return length - remaining_length; +} + ErrorOr Inode::update_timestamps([[maybe_unused]] Optional