aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-12-23 12:39:06 -0800
committerRuss Cox <rsc@swtch.com>2008-12-23 12:39:06 -0800
commitafaa1397f3b6fd24329c21a871f40f01bb70f130 (patch)
tree8be071587d56b8b68131bff8adf59efa61247843 /src/cmd/venti
parent3b06b757665bbec4bf2617e7e0ed0db8e96eeada (diff)
downloadplan9port-afaa1397f3b6fd24329c21a871f40f01bb70f130.tar.gz
plan9port-afaa1397f3b6fd24329c21a871f40f01bb70f130.tar.bz2
plan9port-afaa1397f3b6fd24329c21a871f40f01bb70f130.zip
venti: disk i/o fixes and tweaks
Diffstat (limited to 'src/cmd/venti')
-rw-r--r--src/cmd/venti/srv/part.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/cmd/venti/srv/part.c b/src/cmd/venti/srv/part.c
index 2c52b59b..98439b32 100644
--- a/src/cmd/venti/srv/part.c
+++ b/src/cmd/venti/srv/part.c
@@ -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);
@@ -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
@@ -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
@@ -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);
@@ -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;
}
}
@@ -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){
@@ -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;
}
@@ -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;
}
@@ -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;