commit afaa1397f3b6fd24329c21a871f40f01bb70f130 from: Russ Cox date: Tue Dec 23 20:39:06 2008 UTC venti: disk i/o fixes and tweaks commit - 3b06b757665bbec4bf2617e7e0ed0db8e96eeada commit + afaa1397f3b6fd24329c21a871f40f01bb70f130 blob - 2c52b59b33d3dbff2de3ee6c9e374507137c7f46 blob + 98439b32ace011e57fa3e8a6066a899c7d490142 --- src/cmd/venti/srv/part.c +++ 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, vo 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, vo 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, vo dst = tmp; offset = offset-delta; op = "read"; + count1 = blocksize; goto Error; } } @@ -323,6 +328,7 @@ prwb(char *name, int fd, int isread, u64int offset, vo 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, vo 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, vo 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", 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;