[prev in list] [next in list] [prev in thread] [next in thread]
List: haiku-commits
Subject: [Haiku-commits] r30925 -
From: mmlr () mail ! berlios ! de
Date: 2009-05-30 14:39:16
Message-ID: 200905301439.n4UEdGvl023588 () sheep ! berlios ! de
[Download RAW message or body]
Author: mmlr
Date: 2009-05-30 16:39:14 +0200 (Sat, 30 May 2009)
New Revision: 30925
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=30925&view=rev
Modified:
haiku/trunk/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp
Log:
Only use read_pages() when we need to. Otherwise we bypass the cache of the
upper layer, degrading performance qutie a bit.
Modified: haiku/trunk/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp 2009-05-30 \
14:32:01 UTC (rev 30924)
+++ haiku/trunk/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp 2009-05-30 \
14:39:14 UTC (rev 30925) @@ -117,7 +117,7 @@
status_t Close(void *cookie);
status_t FreeCookie(void *cookie);
status_t Read(void *cookie, off_t position, void *buffer,
- size_t *length);
+ size_t *length, bool readPages);
status_t Write(void *cookie, off_t position,
const void *buffer, size_t *length);
status_t SetFlags(void *cookie, int flags);
@@ -448,7 +448,8 @@
status_t
-OverlayInode::Read(void *_cookie, off_t position, void *buffer, size_t *length)
+OverlayInode::Read(void *_cookie, off_t position, void *buffer, size_t *length,
+ bool readPages)
{
if (position >= fStat.st_size) {
*length = 0;
@@ -461,13 +462,19 @@
superCookie = ((open_cookie *)_cookie)->super_cookie;
size_t readLength = MIN(fOriginalNodeLength - position, *length);
+ status_t result = B_ERROR;
- iovec vector;
- vector.iov_base = buffer;
- vector.iov_len = readLength;
+ if (readPages) {
+ iovec vector;
+ vector.iov_base = buffer;
+ vector.iov_len = readLength;
- status_t result = fSuperVnode.ops->read_pages(SuperVolume(),
- &fSuperVnode, superCookie, position, &vector, 1, &readLength);
+ result = fSuperVnode.ops->read_pages(SuperVolume(),
+ &fSuperVnode, superCookie, position, &vector, 1, &readLength);
+ } else {
+ result = fSuperVnode.ops->read(SuperVolume(), &fSuperVnode,
+ superCookie, position, buffer, &readLength);
+ }
if (result != B_OK)
return result;
@@ -713,7 +720,7 @@
if (!S_ISLNK(fStat.st_mode))
return B_BAD_VALUE;
- return Read(NULL, 0, buffer, bufferSize);
+ return Read(NULL, 0, buffer, bufferSize, false);
}
if (fSuperVnode.ops->read_symlink == NULL)
@@ -1069,7 +1076,7 @@
for (size_t i = 0; i < count; i++) {
size_t transferBytes = MIN(vecs[i].iov_len, bytesLeft);
status_t result = node->Read(cookie, pos, vecs[i].iov_base,
- &transferBytes);
+ &transferBytes, true);
if (result != B_OK) {
*numBytes -= bytesLeft;
return result;
@@ -1333,7 +1340,7 @@
{
TRACE("read\n");
return ((OverlayInode *)vnode->private_node)->Read(cookie, pos, buffer,
- length);
+ length, false);
}
_______________________________________________
Haiku-commits mailing list
Haiku-commits@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/haiku-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic