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.
This commit is contained in:
Augustin Cavalier
2025-02-07 13:50:19 -05:00
parent 4f8eaff87f
commit 738615d678
+3 -3
View File
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <string.h>
#include <AutoDeleter.h>
#include <KernelExport.h>
#include <fs_cache.h>
@@ -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<vm_page_reservation, void, vm_page_unreserve_pages>
pagesUnreserver(&reservation);
AutoLocker<VMCache> 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;
}