From waddlesplash <waddlesplash@xxxxxxxxx>:
waddlesplash has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2727 ;)
Change subject: kernel/file_cache: Properly size I/O request vectors when
writing zeros.
......................................................................
kernel/file_cache: Properly size I/O request vectors when writing zeros.
Should fix #16039.
---
M src/system/kernel/cache/file_cache.cpp
1 file changed, 20 insertions(+), 7 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/27/2727/1
diff --git a/src/system/kernel/cache/file_cache.cpp
b/src/system/kernel/cache/file_cache.cpp
index 00957cc..4eb99f5 100644
--- a/src/system/kernel/cache/file_cache.cpp
+++ b/src/system/kernel/cache/file_cache.cpp
@@ -109,7 +109,7 @@
static const uint32 kZeroVecCount = 32;
static const size_t kZeroVecSize = kZeroVecCount * B_PAGE_SIZE;
-static phys_addr_t sZeroPage; // physical address
+static phys_addr_t sZeroPage;
static generic_io_vec sZeroVecs[kZeroVecCount];
@@ -1327,17 +1327,30 @@
// NULL buffer -- use a dummy buffer to write zeroes
size_t size = *_size;
while (size > 0) {
- size_t toWrite = min_c(size, kZeroVecSize);
- generic_size_t written = toWrite;
+ generic_size_t length = min_c(size, kZeroVecSize);
+ generic_io_vec* vecs = sZeroVecs, vec;
+ size_t count = kZeroVecCount;
+ if ((length % B_PAGE_SIZE) != 0) {
+ if (length > B_PAGE_SIZE) {
+ length = ROUNDDOWN(length, B_PAGE_SIZE);
+ count = length / B_PAGE_SIZE;
+ } else {
+ vec.base = sZeroPage;
+ vec.length = length;
+ vecs = &vec;
+ count = 1;
+ }
+ }
+
status_t error = vfs_write_pages(ref->vnode, cookie,
offset,
- sZeroVecs, kZeroVecCount,
B_PHYSICAL_IO_REQUEST, &written);
+ vecs, count, B_PHYSICAL_IO_REQUEST, &length);
if (error != B_OK)
return error;
- if (written == 0)
+ if (length == 0)
break;
- offset += written;
- size -= written;
+ offset += length;
+ size -= length;
}
*_size -= size;
--
To view, visit https://review.haiku-os.org/c/haiku/+/2727
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ifc5c79354979aaa7b27b09acc6d6450e21146e76
Gerrit-Change-Number: 2727
Gerrit-PatchSet: 1
Gerrit-Owner: waddlesplash <waddlesplash@xxxxxxxxx>
Gerrit-MessageType: newchange