[haiku-commits] Change in haiku[master]: kernel/file_cache: Fix writing zeros in the cache_io case.

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 31 May 2020 19:39:16 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: kernel/file_cache: Fix writing zeros in the cache_io case. - Gerrit