git: 9front

Download patch

ref: 890261c2cb61659dbf00e439afde6c259cf0ab20
parent: bd0cfbf36ea4c688811b642eebedcfeeb541bfbc
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Nov 18 07:53:31 EST 2012

hjfs: eleminate seek syscalls

reduce syscalls by using pread/pwrite instead
of seek/read/write.

--- a/sys/src/cmd/hjfs/dev.c
+++ b/sys/src/cmd/hjfs/dev.c
@@ -30,20 +30,27 @@
 			b->error = Einval;
 			goto reply;
 		}
-		seek(d->fd, b->off * BLOCK, 0);
 		b->error = nil;
 		if(b->op & BWRITE){
 			memset(buf, 0, sizeof(buf));
 			pack(b, buf);
-			if(write(d->fd, buf, BLOCK) < BLOCK){
+			if(pwrite(d->fd, buf, BLOCK, b->off*BLOCK) < BLOCK){
 				dprint("hjfs: write: %r\n");
 				b->error = Eio;
 			}
 		}else{
-			if(readn(d->fd, buf, BLOCK) < 0){
-				dprint("hjfs: read: %r\n");
+			int n, m;
+
+			for(n = 0; n < BLOCK; n += m){
+				m = pread(d->fd, buf+n, BLOCK-n, b->off*BLOCK+n);
+				if(m < 0)
+					dprint("hjfs: read: %r\n");
+				if(m <= 0)
+					break;
+			}
+			if(n < BLOCK)
 				b->error = Eio;
-			}else
+			else
 				unpack(b, buf);
 		}
 	reply:
--