kernel/file_cache: Properly size I/O request vectors when writing zeros.

Should fix #16039.

Change-Id: Ifc5c79354979aaa7b27b09acc6d6450e21146e76
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2727
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Augustin Cavalier
2020-05-21 01:41:41 +00:00
committed by waddlesplash
parent a742970be5
commit 8ba0b5eb9b
+21 -7
View File
@@ -109,7 +109,7 @@ static struct cache_module_info* sCacheModule;
static const uint32 kZeroVecCount = 32; static const uint32 kZeroVecCount = 32;
static const size_t kZeroVecSize = kZeroVecCount * B_PAGE_SIZE; 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]; static generic_io_vec sZeroVecs[kZeroVecCount];
@@ -1327,17 +1327,31 @@ file_cache_write(void* _cacheRef, void* cookie, off_t offset,
// NULL buffer -- use a dummy buffer to write zeroes // NULL buffer -- use a dummy buffer to write zeroes
size_t size = *_size; size_t size = *_size;
while (size > 0) { while (size > 0) {
size_t toWrite = min_c(size, kZeroVecSize); generic_size_t length = min_c(size, kZeroVecSize);
generic_size_t written = toWrite; generic_io_vec* vecs = sZeroVecs;
generic_io_vec 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, 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) if (error != B_OK)
return error; return error;
if (written == 0) if (length == 0)
break; break;
offset += written; offset += length;
size -= written; size -= length;
} }
*_size -= size; *_size -= size;