tventi: disk i/o fixes and tweaks - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit afaa1397f3b6fd24329c21a871f40f01bb70f130
parent 3b06b757665bbec4bf2617e7e0ed0db8e96eeada
Author: Russ Cox 
Date:   Tue, 23 Dec 2008 12:39:06 -0800

venti: disk i/o fixes and tweaks

Diffstat:
  M src/cmd/venti/srv/part.c            |      25 +++++++++++++++++--------

1 file changed, 17 insertions(+), 8 deletions(-)
---
diff --git a/src/cmd/venti/srv/part.c b/src/cmd/venti/srv/part.c
t@@ -141,10 +141,13 @@ initpart(char *name, int mode)
         }
         if(dir->length == 0){
                 free(dir);
-                freepart(part);
-                seterr(EOk, "can't determine size of partition %s", file);
-                free(file);
-                return nil;
+                dir = dirstat(file);
+                if(dir == nil || dir->length == 0) {
+                        freepart(part);
+                        seterr(EOk, "can't determine size of partition %s", file);
+                        free(file);
+                        return nil;
+                }
         }
         if(dir->length < hi || dir->length < lo){
                 freepart(part);
t@@ -159,7 +162,7 @@ initpart(char *name, int mode)
 #ifdef CANBLOCKSIZE
         {
                 struct statfs sfs;
-                if(fstatfs(part->fd, &sfs) >= 0)
+                if(fstatfs(part->fd, &sfs) >= 0 && sfs.f_bsize > 512)
                         part->fsblocksize = sfs.f_bsize;
         }
 #endif
t@@ -229,7 +232,7 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
         char *op;
         u8int *buf, *freetmp, *dst;
         u32int icount, opsize;
-        int r;
+        int r, count1;
 
 
 #ifndef PLAN9PORT
t@@ -286,6 +289,7 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
                         dst = tmp;
                         offset = offset-delta;
                         op = "read";
+                        count1 = blocksize;
                         goto Error;
                 }
                 c = min(count, blocksize-delta);
t@@ -298,6 +302,7 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
                                 dst = tmp;
                                 offset = offset-delta;
                                 op = "read";
+                                count1 = blocksize;
                                 goto Error;
                         }
                 }
t@@ -323,6 +328,7 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
                 if(isread){
                         if((r=pread(fd, dst, opsize, offset))<=0 || r%blocksize){
                                 op = "read";
+                                count1 = opsize;
                                 goto Error;
                         }
                         if(dst == tmp){
t@@ -335,6 +341,7 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
                                 memmove(dst, buf, blocksize);
                         }
                         if((r=pwrite(fd, dst, opsize, offset))<=0 || r%blocksize){
+                                count1 = opsize;
                                 op = "write";
                                 goto Error;
                         }
t@@ -362,14 +369,16 @@ prwb(char *name, int fd, int isread, u64int offset, void *vbuf, u32int count, u3
 print("FAILED isread=%d r=%d count=%d blocksize=%d\n", isread, r, count, blocksize);
                         dst = tmp;
                         op = "read";
+                        count1 = blocksize;
                         goto Error;
                 }
                 if(isread)
                         memmove(buf, tmp, count);
                 else{
                         memmove(tmp, buf, count);
-                        if(pwrite(fd, tmp, opsize, offset) != blocksize){
+                        if(pwrite(fd, tmp, blocksize, offset) != blocksize){
                                 dst = tmp;
+                                count1 = blocksize;
                                 op = "write";
                                 goto Error;
                         }
t@@ -382,7 +391,7 @@ print("FAILED isread=%d r=%d count=%d blocksize=%d\n", isread, r, count, blocksi
 
 Error:
         seterr(EAdmin, "%s %s offset 0x%llux count %ud buf %p returned %d: %r",
-                op, name, offset, opsize, dst, r);
+                op, name, offset, count1, dst, r);
         if(freetmp)
                 free(freetmp);
         return -1;