From waddlesplash <waddlesplash@xxxxxxxxx>:
waddlesplash has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2855 ;)
Change subject: kernel/file_cache: Fix writing zeros in the cache_io case.
......................................................................
kernel/file_cache: Fix writing zeros in the cache_io case.
---
M src/system/kernel/cache/file_cache.cpp
1 file changed, 40 insertions(+), 46 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/55/2855/1
diff --git a/src/system/kernel/cache/file_cache.cpp
b/src/system/kernel/cache/file_cache.cpp
index eaa78ac..74105ea 100644
--- a/src/system/kernel/cache/file_cache.cpp
+++ b/src/system/kernel/cache/file_cache.cpp
@@ -629,6 +629,42 @@
static status_t
+write_zeros_to_file(struct vnode* vnode, void* cookie, off_t offset,
+ size_t* _size)
+{
+ size_t size = *_size;
+ while (size > 0) {
+ generic_size_t length = min_c(size, kZeroVecSize);
+ generic_io_vec* vecs = sZeroVecs;
+ generic_io_vec vec;
+ size_t count = kZeroVecCount;
+ if (length != kZeroVecSize) {
+ 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(vnode, cookie, offset,
+ vecs, count, B_PHYSICAL_IO_REQUEST, &length);
+ if (error != B_OK)
+ return error;
+ if (length == 0)
+ break;
+
+ offset += length;
+ size -= length;
+ }
+ return B_OK;
+}
+
+
+static status_t
write_to_file(file_cache_ref* ref, void* cookie, off_t offset, int32
pageOffset,
addr_t buffer, size_t bufferSize, bool useBuffer,
vm_page_reservation* reservation, size_t reservePages)
@@ -640,18 +676,8 @@
status_t status = B_OK;
if (!useBuffer) {
- while (bufferSize > 0) {
- generic_size_t written = min_c(bufferSize,
kZeroVecSize);
- status = vfs_write_pages(ref->vnode, cookie, offset +
pageOffset,
- sZeroVecs, kZeroVecCount,
B_PHYSICAL_IO_REQUEST, &written);
- if (status != B_OK)
- return status;
- if (written == 0)
- return B_ERROR;
-
- bufferSize -= written;
- pageOffset += written;
- }
+ status = write_zeros_to_file(ref->vnode, cookie, offset +
pageOffset,
+ &bufferSize);
} else {
generic_io_vec vec;
vec.base = buffer;
@@ -1312,7 +1338,6 @@
if (ref->disabled_count > 0) {
// Caching is disabled -- write directly to the file.
-
if (buffer != NULL) {
generic_io_vec vec;
vec.base = (addr_t)buffer;
@@ -1322,40 +1347,9 @@
1, 0, &size);
*_size = size;
return error;
+ } else {
+ return write_zeros_to_file(ref->vnode, cookie, offset,
_size);
}
-
- // NULL buffer -- use a dummy buffer to write zeroes
- size_t size = *_size;
- while (size > 0) {
- generic_size_t length = min_c(size, kZeroVecSize);
- 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,
- vecs, count, B_PHYSICAL_IO_REQUEST, &length);
- if (error != B_OK)
- return error;
- if (length == 0)
- break;
-
- offset += length;
- size -= length;
- }
-
- *_size -= size;
- return B_OK;
}
status_t status = cache_io(ref, cookie, offset,
--
To view, visit https://review.haiku-os.org/c/haiku/+/2855
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I00c6566764a20e6ec5e8c99b0ebb2e304a5191ee
Gerrit-Change-Number: 2855
Gerrit-PatchSet: 1
Gerrit-Owner: waddlesplash <waddlesplash@xxxxxxxxx>
Gerrit-MessageType: newchange