[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