[haiku-commits] Change in haiku[master]: kernel/file_cache: Properly size I/O request vectors when writing zeros.

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

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: kernel/file_cache: Properly size I/O request vectors when writing zeros. - Gerrit