From 6102f0788a4204b76d177595bd48eda06fcfb9d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 24 Jul 2009 09:19:24 +0000 Subject: [PATCH] * file_cache_set_size() now clears the last page of its cache if needed. This fixes #4106 for good. * Also removed a bit of dead code in that function. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31732 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/cache/file_cache.cpp | 28 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/system/kernel/cache/file_cache.cpp b/src/system/kernel/cache/file_cache.cpp index 55e14ffec1..29edf7c33a 100644 --- a/src/system/kernel/cache/file_cache.cpp +++ b/src/system/kernel/cache/file_cache.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -1197,17 +1197,25 @@ file_cache_set_size(void *_cacheRef, off_t newSize) if (ref == NULL) return B_OK; - AutoLocker _(ref->cache); + VMCache* cache = ref->cache; + AutoLocker _(cache); - off_t offset = ref->cache->virtual_end; - off_t size = newSize; - if (offset > newSize) { - size = offset - newSize; - offset = newSize; - } else - size = newSize - offset; + off_t oldSize = cache->virtual_end; + status_t status = cache->Resize(newSize); + if (status == B_OK && newSize < oldSize) { + // We may have a new partial page at the end of the cache that must be + // cleared. + uint32 partialBytes = newSize % B_PAGE_SIZE; + if (partialBytes != 0) { + vm_page *page = cache->LookupPage(newSize - partialBytes); + if (page != NULL) { + vm_memset_physical(page->physical_page_number * B_PAGE_SIZE + + partialBytes, 0, B_PAGE_SIZE - partialBytes); + } + } + } - return ref->cache->Resize(newSize); + return status; }