diff -Nru /n/sources/plan9/sys/src/cmd/vac/file.c /sys/src/cmd/vac/file.c --- /n/sources/plan9/sys/src/cmd/vac/file.c Thu Dec 15 19:01:34 2011 +++ /sys/src/cmd/vac/file.c Wed Aug 17 00:00:00 2016 @@ -2101,4 +2101,3 @@ return 1; return 0; } - diff -Nru /n/sources/plan9/sys/src/cmd/vac/vac.c /sys/src/cmd/vac/vac.c --- /n/sources/plan9/sys/src/cmd/vac/vac.c Mon Jan 4 23:24:04 2010 +++ /sys/src/cmd/vac/vac.c Wed Aug 17 00:00:00 2016 @@ -558,7 +558,7 @@ { vlong off; VacFile *f; - static char buf[8192]; + static char buf[16*1024]; int n; if((f = vacfilecreate(fp, name, 0666)) == nil){ @@ -712,4 +712,3 @@ fprint(2, "\n"); va_end(arg); } - diff -Nru /n/sources/plan9/sys/src/cmd/vac/vacfs.c /sys/src/cmd/vac/vacfs.c --- /n/sources/plan9/sys/src/cmd/vac/vacfs.c Mon Aug 6 20:28:02 2012 +++ /sys/src/cmd/vac/vacfs.c Wed Aug 17 00:00:00 2016 @@ -17,12 +17,12 @@ struct Fid { - short busy; - short open; - int fid; - char *user; - Qid qid; - VacFile *file; + char busy; + char open; + int fid; + char *user; + Qid qid; + VacFile *file; VacDirEnum *vde; Fid *next; }; @@ -42,7 +42,7 @@ int mfd[2]; int srvfd = -1; char *user; -uchar mdata[8192+IOHDRSZ]; +uchar mdata[16*1024+IOHDRSZ]; int messagesize = sizeof mdata; Fcall rhdr; Fcall thdr; @@ -492,10 +492,9 @@ { char *buf; vlong off; - int cnt; + int n, tot, cnt, zrds; VacFile *vf; char err[80]; - int n; if(!f->busy) return vtstrdup(Enotexist); @@ -512,8 +511,26 @@ return vtstrdup("symbolic link"); else if(vacfilegetmode(f->file)&ModeNamedPipe) return vtstrdup("named pipe"); - else - n = vacfileread(vf, buf, cnt, off); + else { + /* + * Empirically, we can get a short read if it attempts to + * cross a venti block boundary, so keep trying, so that + * our clients get expected behaviour. We might get a + * zero-length read before actual end of file; stop after a few. + */ + tot = n = zrds = 0; + while (tot < cnt && zrds < 10 && + (n = vacfileread(vf, buf + tot, cnt - tot, off + tot)) >= 0){ + tot += n; /* read some bytes, if not cnt-tot */ + if (n == 0) + zrds++; + else + zrds = 0; + } + if (tot > 0) /* read something? */ + n = tot; /* return that much */ + /* else first (& last) read was eof | error, so leave n alone */ + } if(n < 0) { rerrstr(err, sizeof err); return vtstrdup(err); @@ -785,4 +802,3 @@ vacfsclose(fs); vthangup(conn); } -