ref: fdb072ba76adbe5c6d4f351182cf5e7f222b6762
parent: 17e011ce566f658d550a97537db0db73dc08b9ca
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Jun 16 02:26:31 EDT 2013
make filesystem handling of read9pmsg() consistent
--- a/sys/src/cmd/9nfs/9p.c
+++ b/sys/src/cmd/9nfs/9p.c
@@ -44,6 +44,8 @@
clog("xmesg read error: %r\n");return -1;
}
+ if(n == 0)
+ goto again;
if(convM2S(s->data, n, &s->f) <= 0){ clog("xmesg bad convM2S %d %.2x %.2x %.2x %.2x\n",n, ((uchar*)s->data)[0], ((uchar*)s->data)[1],
--- a/sys/src/cmd/acme/fsys.c
+++ b/sys/src/cmd/acme/fsys.c
@@ -148,7 +148,8 @@
x = nil;
for(;;){buf = emalloc(messagesize+UTFmax); /* overflow for appending partial rune in xfidwrite */
- n = read9pmsg(sfd, buf, messagesize);
+ while((n = read9pmsg(sfd, buf, messagesize)) == 0 && !closing)
+ ;
if(n <= 0){if(closing)
break;
--- a/sys/src/cmd/aux/consolefs.c
+++ b/sys/src/cmd/aux/consolefs.c
@@ -681,8 +681,9 @@
}
free(d);
r = allocreq(fs, messagesize);
- n = read9pmsg(fs->fd, r->buf, messagesize);
- if(n <= 0)
+ while((n = read9pmsg(fs->fd, r->buf, messagesize)) == 0)
+ ;
+ if(n < 0)
fatal("unmounted"); if(convM2S(r->buf, n, &r->f) == 0){--- a/sys/src/cmd/aux/depend.c
+++ b/sys/src/cmd/aux/depend.c
@@ -365,9 +365,10 @@
for(;;){r = allocreq(messagesize);
qlock(&iolock);
- n = read9pmsg(fs->fd, r->buf, messagesize);
+ while((n = read9pmsg(fs->fd, r->buf, messagesize)) == 0)
+ ;
qunlock(&iolock);
- if(n <= 0)
+ if(n < 0)
fatal("read9pmsg error: %r"); if(convM2S(r->buf, n, &r->f) == 0){--- a/sys/src/cmd/cfs/cfs.c
+++ b/sys/src/cmd/cfs/cfs.c
@@ -808,8 +808,9 @@
char buf[128];
olen = p->len;
- p->len = read9pmsg(p->fd[0], datarcv, sizeof(datarcv));
- if(p->len <= 0){+ while((p->len = read9pmsg(p->fd[0], datarcv, sizeof(datarcv))) == 0)
+ ;
+ if(p->len < 0){snprint(buf, sizeof buf, "read9pmsg(%d)->%ld: %r",
p->fd[0], p->len);
error(buf);
--- a/sys/src/cmd/cpu.c
+++ b/sys/src/cmd/cpu.c
@@ -1090,11 +1090,13 @@
ncpunote = 0;
for(;;){n = read9pmsg(fd, buf, sizeof(buf));
- if(n <= 0){+ if(n < 0){if(dbg)
fprint(2, "read9pmsg(%d) returns %d: %r\n", fd, n);
break;
}
+ if(n == 0)
+ continue;
if(convM2S(buf, n, &f) <= BIT16SZ)
break;
if(dbg)
--- a/sys/src/cmd/exportfs/exportfs.c
+++ b/sys/src/cmd/exportfs/exportfs.c
@@ -388,8 +388,9 @@
if(r == 0)
fatal("Out of service buffers");- n = localread9pmsg(netfd, r->buf, messagesize, ini);
- if(n <= 0)
+ while((n = localread9pmsg(netfd, r->buf, messagesize, ini)) == 0)
+ ;
+ if(n < 0)
fatal(nil);
if(convM2S(r->buf, n, &r->work) == 0)
fatal("convM2S format error");--- a/sys/src/cmd/iostats/iostats.c
+++ b/sys/src/cmd/iostats/iostats.c
@@ -164,7 +164,8 @@
if(r == 0)
fatal("Out of service buffers");- n = read9pmsg(p[1], r->buf, sizeof(r->buf));
+ while((n = read9pmsg(p[1], r->buf, sizeof(r->buf))) == 0 && !done)
+ ;
if(done)
break;
if(n < 0)
--- a/sys/src/cmd/ip/ftpfs/ftpfs.c
+++ b/sys/src/cmd/ip/ftpfs/ftpfs.c
@@ -262,12 +262,14 @@
while(!dying){n = read9pmsg(mfd, mdata, messagesize);
- if(n <= 0){+ if(n < 0){errstr(buf, sizeof buf);
if(buf[0]=='\0' || strstr(buf, "hungup"))
exits(""); fatal("mount read: %s\n", buf);}
+ if(n == 0)
+ continue;
if(convM2S(mdata, n, &thdr) == 0)
continue;
--- a/sys/src/cmd/ndb/cs.c
+++ b/sys/src/cmd/ndb/cs.c
@@ -444,8 +444,10 @@
for(;;){n = read9pmsg(mfd[0], mdata, sizeof mdata);
- if(n<=0)
+ if(n < 0)
error("mount read");+ if(n == 0)
+ continue;
job = newjob();
if(convM2S(mdata, n, &job->request) != n){syslog(1, logfile, "format error %ux %ux %ux %ux %ux",
--- a/sys/src/cmd/ndb/dns.c
+++ b/sys/src/cmd/ndb/dns.c
@@ -430,8 +430,9 @@
while(!stop){ procsetname("%d %s/dns Twrites of %d 9p rpcs read; %d alarms",stats.qrecvd9p, mntpt, stats.qrecvd9prpc, stats.alarms);
- n = read9pmsg(mfd[0], mdata, sizeof mdata);
- if(n<=0){+ while((n = read9pmsg(mfd[0], mdata, sizeof mdata)) == 0)
+ ;
+ if(n < 0){ dnslog("error reading 9P from %s: %r", mntpt);sleep(2000); /* don't thrash after read error */
return;
--- a/sys/src/cmd/paqfs/paqfs.c
+++ b/sys/src/cmd/paqfs/paqfs.c
@@ -817,7 +817,7 @@
if(n < 0)
sysfatal("mount read");if(n == 0)
- break;
+ continue;
if(convM2S(mdata, n, &rhdr) == 0)
continue;
--- a/sys/src/cmd/plumb/fsys.c
+++ b/sys/src/cmd/plumb/fsys.c
@@ -237,12 +237,10 @@
if(buf == nil)
error("malloc failed: %r");qlock(&readlock);
- n = read9pmsg(srvfd, buf, messagesize);
- if(n <= 0){- if(n < 0)
- error("i/o error on server channel");+ while((n = read9pmsg(srvfd, buf, messagesize)) == 0)
+ ;
+ if(n < 0)
threadexitsall("unmounted");- }
if(readlock.head == nil) /* no other processes waiting to read; start one */
proccreate(fsysproc, nil, Stack);
qunlock(&readlock);
--- a/sys/src/cmd/rio/fsys.c
+++ b/sys/src/cmd/rio/fsys.c
@@ -194,8 +194,9 @@
x = nil;
for(;;){buf = emalloc(messagesize+UTFmax); /* UTFmax for appending partial rune in xfidwrite */
- n = read9pmsg(fs->sfd, buf, messagesize);
- if(n <= 0){+ while((n = read9pmsg(fs->sfd, buf, messagesize)) == 0)
+ yield();
+ if(n < 0){yield(); /* if threadexitsall'ing, will not return */
fprint(2, "rio: %d: read9pmsg: %d %r\n", getpid(), n);
errorshouldabort = 0;
--- a/sys/src/cmd/vac/vacfs.c
+++ b/sys/src/cmd/vac/vacfs.c
@@ -706,8 +706,10 @@
for(;;){n = read9pmsg(mfd[0], mdata, sizeof mdata);
- if(n <= 0)
+ if(n < 0)
break;
+ if(n == 0)
+ continue;
if(convM2Su(mdata, n, &rhdr, dotu) != n)
sysfatal("convM2S conversion error");--- a/sys/src/cmd/vnc/exportfs.c
+++ b/sys/src/cmd/vnc/exportfs.c
@@ -149,8 +149,9 @@
errdepth(ed);
q = smalloc(sizeof(Exq));
- n = read9pmsg(fs->io, q->buf, Maxrpc);
- if(n <= 0 || convM2S(q->buf, n, &q->rpc) != n)
+ while((n = read9pmsg(fs->io, q->buf, Maxrpc)) == 0)
+ ;
+ if(n < 0 || convM2S(q->buf, n, &q->rpc) != n)
goto bad;
if(exdebug)
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -59,7 +59,9 @@
Req *r;
qlock(&s->rlock);
- if((n = read9pmsg(s->infd, s->rbuf, s->msize)) <= 0){+ while((n = read9pmsg(s->infd, s->rbuf, s->msize)) == 0)
+ ;
+ if(n < 0){qunlock(&s->rlock);
return nil;
}
--
⑨