Commit Diff


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;