~kris/9p

9hist

daea032cda793d2290ff3c68fd2aac6439f4bedd — David du Colombier 33 years ago 4cca2ff
Plan 9 from Bell Labs 1993-03-17
1 files changed, 14 insertions(+), 10 deletions(-)

M port/sysfile.c
M port/sysfile.c => port/sysfile.c +14 -10
@@ 232,24 232,26 @@ unionread(Chan *c, void *va, long n)
	Pgrp *pg;

	pg = u->p->pgrp;
	rlock(&pg->ns);
	qlock(&pg->nsh);

	for(;;) {
		if(waserror()) {
			runlock(&pg->ns);
			qunlock(&pg->nsh);
			nexterror();
		}
		nc = clone(c->mnt->to, 0);
		nc = clone(c->mnt->cmnt, 0);
		poperror();

		if(c->mountid != c->mnt->mountid) {
			pprint("unionread: changed underfoot?\n");
			runlock(&pg->ns);
			pprint("unionread: changed underfoot\n");
			qunlock(&pg->nsh);
			close(nc);
			return 0;
		}

		/* Error causes component of union to be skipped */
		/*
		 * Error causes component of union to be skipped
		 */
		if(waserror()) {	
			close(nc);
			goto next;


@@ 258,24 260,26 @@ unionread(Chan *c, void *va, long n)
		nc = (*devtab[nc->type].open)(nc, OREAD);
		nc->offset = c->offset;
		nr = (*devtab[nc->type].read)(nc, va, n, nc->offset);
		/* devdirread e.g. changes it */
		/*
		 * devdirread e.g. changes it
		 */
		c->offset = nc->offset;	
		poperror();

		close(nc);
		if(nr > 0) {
			runlock(&pg->ns);
			qunlock(&pg->nsh);
			return nr;
		}
		/* Advance to next element */
	next:
		c->mnt = c->mnt->next;
		c->mnt = c->mnt->mount;
		if(c->mnt == 0)
			break;
		c->mountid = c->mnt->mountid;
		c->offset = 0;
	}
	runlock(&pg->ns);
	qunlock(&pg->nsh);
	return 0;
}