From db8fb4fdf024dbe77db8cc7d56296e35d9974584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 21 Jul 2009 10:17:57 +0000 Subject: [PATCH] * The file cache must clear partial pages as well, since they can be mapped directly via mmap(). * This fixes bug #4106. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31669 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/cache/file_cache.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/cache/file_cache.cpp b/src/system/kernel/cache/file_cache.cpp index d7039c189c..55e14ffec1 100644 --- a/src/system/kernel/cache/file_cache.cpp +++ b/src/system/kernel/cache/file_cache.cpp @@ -336,6 +336,7 @@ read_into_cache(file_cache_ref *ref, void *cookie, off_t offset, uint32 vecCount = 0; size_t numBytes = PAGE_ALIGN(pageOffset + bufferSize); + size_t bytesUntouched = numBytes; vm_page *pages[MAX_IO_VECS]; ConditionVariable busyConditions[MAX_IO_VECS]; int32 pageIndex = 0; @@ -363,7 +364,7 @@ read_into_cache(file_cache_ref *ref, void *cookie, off_t offset, // read file into reserved pages status_t status = vfs_read_pages(ref->vnode, cookie, offset, vecs, vecCount, B_PHYSICAL_IO_REQUEST, &numBytes); - if (status < B_OK) { + if (status != B_OK) { // reading failed, free allocated pages dprintf("file_cache: read pages failed: %s\n", strerror(status)); @@ -379,6 +380,20 @@ read_into_cache(file_cache_ref *ref, void *cookie, off_t offset, return status; } + // Clear out any leftovers that were not touched by the above read - we're + // doing this here so that not every file system/device has to implement + // this + bytesUntouched -= numBytes; + + for (int32 i = vecCount; i-- > 0 && bytesUntouched != 0; ) { + size_t length = min_c(bytesUntouched, vecs[i].iov_len); + + addr_t address = (addr_t)vecs[i].iov_base + vecs[i].iov_len - length; + vm_memset_physical(address, 0, length); + + bytesUntouched -= length; + } + // copy the pages if needed and unmap them again for (int32 i = 0; i < pageIndex; i++) {