git: 9front

Download patch

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;
 	}
--