From 738615d6785d7965f0668a42bc3b5fd19f5809aa Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 7 Feb 2025 13:50:19 -0500 Subject: [PATCH] kernel/file_cache: Use CObjectDeleter to unreserve pages. There are error paths out of this method that may not have properly unreserved pages, so use a CObjectDeleter so that all possible cases are covered. --- src/system/kernel/cache/file_cache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/cache/file_cache.cpp b/src/system/kernel/cache/file_cache.cpp index c7267d1a98..7d25293536 100644 --- a/src/system/kernel/cache/file_cache.cpp +++ b/src/system/kernel/cache/file_cache.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -755,14 +756,14 @@ cache_io(void* _cacheRef, void* cookie, off_t offset, addr_t buffer, + B_PAGE_SIZE - 1) >> PAGE_SHIFT); vm_page_reservation reservation; reserve_pages(ref, &reservation, lastReservedPages, doWrite); + CObjectDeleter + pagesUnreserver(&reservation); AutoLocker locker(cache); // Now that we have the lock, make sure the situation didn't change. if ((pageOffset + offset) >= cache->virtual_end) { locker.Unlock(); - vm_page_unreserve_pages(&reservation); - *_size = 0; return B_OK; } @@ -874,7 +875,6 @@ cache_io(void* _cacheRef, void* cookie, off_t offset, addr_t buffer, if (bytesLeft <= bytesInPage) { // we've read the last page, so we're done! locker.Unlock(); - vm_page_unreserve_pages(&reservation); return B_OK; }