plan 9 kernel history: overview | file list | diff list

1990/1124/port/devmnt.c (diff list | history)

1990/1123/sys/src/9/port/devmnt.c:49,551990/1124/sys/src/9/port/devmnt.c:49,56 (short | long | prev | next)
1990/0227    
{ 
1990/1123    
	Mnthdr	*next;		/* in free list or writers list */ 
	Mnthdr	*prev;		/* in writers list only */ 
	int	writing;	/* flag: in writers list */ 
1990/1124    
	short	active; 
	short	flushing;	/* a Tflush has been sent */ 
1990/0227    
	Fcall	thdr; 
	Fcall	rhdr; 
1990/0604    
	Rendez	r; 
1990/1123/sys/src/9/port/devmnt.c:122,1271990/1124/sys/src/9/port/devmnt.c:123,129
1990/0227    
	lock(&mnthdralloc); 
	if(mh = mnthdralloc.free){		/* assign = */ 
		mnthdralloc.free = mh->next; 
1990/1124    
		mh->flushing = 0; 
1990/0227    
		unlock(&mnthdralloc); 
		return mh; 
	} 
1990/1123/sys/src/9/port/devmnt.c:138,1431990/1124/sys/src/9/port/devmnt.c:140,148
1990/0227    
void 
mhfree(Mnthdr *mh) 
{ 
1990/1124    
	if(mh->flushing) 
		return; 
	mh->active = 0; 
1990/0227    
	lock(&mnthdralloc); 
	mh->next = mnthdralloc.free; 
	mnthdralloc.free = mh; 
1990/1123/sys/src/9/port/devmnt.c:601,6221990/1124/sys/src/9/port/devmnt.c:606,654
1990/1123    
		if(q->writer) 
			q->writer->prev = 0; 
	} 
	w->writing = 0; 
} 
 
1990/1124    
/* 
 * m->q is unlocked.  Send Tflush message to flush omh->tag. 
 * Cut off all errors.   Caller will free omh 
 */ 
1990/1123    
void 
mnterrdequeue(MntQ *q, Mnthdr *mh)	/* queue is unlocked */ 
1990/1124    
mntflush(Mnt *m, Mnthdr *omh)	/* queue is unlocked */ 
1990/1123    
{ 
1990/1124    
	Mnthdr *mh; 
 
	if(omh->thdr.type == Tflush) 
		return; 
 
	mh = mhalloc(); 
	if(waserror()){ 
		omh->flushing = 0; 
		mhfree(mh); 
		return;		/* no more errors please */ 
	} 
	mh->thdr.type = Tflush; 
	mh->thdr.oldtag = omh->thdr.tag; 
	mntxmit(m, mh); 
	omh->flushing = 0; 
	mhfree(mh); 
	poperror(); 
} 
 
void 
mnterrdequeue(Mnt *m, Mnthdr *mh)	/* queue is unlocked */ 
{ 
1990/0604    
	Mnthdr *w; 
1990/1124    
	MntQ *q; 
1990/0604    
 
1990/1124    
	mh->flushing = 1; 
	q = m->q; 
1990/0604    
	qlock(q); 
	/* take self from queue if necessary */ 
	if(q->reader == u->p){	/* advance a writer to reader */ 
		w = q->writer; 
		if(w){ 
1990/1124    
			mntwunlink(q, w); 
1990/0604    
			q->reader = w->p; 
			q->writer = w->next; 
1990/1123    
			q->writer->prev = 0; 
1990/0604    
			wakeup(&w->r); 
		}else{ 
			q->reader = 0; 
1990/1123/sys/src/9/port/devmnt.c:625,6311990/1124/sys/src/9/port/devmnt.c:657,663
1990/1123    
	}else 
		mntwunlink(q, mh); 
1990/0604    
	qunlock(q); 
                 
1990/1124    
	mntflush(m, mh); 
1990/0604    
} 
1990/11211    
 
1990/0717    
int 
1990/1123/sys/src/9/port/devmnt.c:641,6511990/1124/sys/src/9/port/devmnt.c:673,683
1990/1123    
	Mntbuf *mbw, *t; 
1990/0604    
	Mnthdr *w, *ow; 
	MntQ *q; 
1990/1123    
	int qlocked, tag; 
1990/1124    
	int qlocked, tag, written; 
1990/0227    
 
1990/0619    
	mh->mbr = mballoc(); 
1990/0227    
	mbw = mballoc(); 
	if(waserror()){ 
1990/1124    
	if(waserror()){			/* 1 */ 
1990/0619    
		mbfree(mh->mbr); 
1990/0227    
		mbfree(mbw); 
		nexterror(); 
1990/1123/sys/src/9/port/devmnt.c:663,6691990/1124/sys/src/9/port/devmnt.c:695,701
1990/0511    
		goto Normal; 
1990/0604    
 
	incref(q); 
1990/0227    
	if(waserror()){ 
1990/1124    
	if(waserror()){		/* 2 */ 
1990/0604    
		mqfree(q); 
1990/0227    
		nexterror(); 
	} 
1990/1123/sys/src/9/port/devmnt.c:677,6831990/1124/sys/src/9/port/devmnt.c:709,715
1990/0227    
	 */ 
1990/0619    
	n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); 
1990/0604    
	mqfree(q); 
1990/0511    
	poperror(); 
1990/1124    
	poperror();		/* 2 */ 
1990/0511    
 
1990/0619    
	if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ 
1990/0604    
		print("format error in mntxmit\n"); 
1990/1123/sys/src/9/port/devmnt.c:712,7181990/1124/sys/src/9/port/devmnt.c:744,750
1990/0511    
		memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); 
1990/0619    
	mbfree(mh->mbr); 
1990/0511    
	mbfree(mbw); 
	poperror(); 
1990/1124    
	poperror();		/* 1 */ 
1990/0511    
	return; 
 
    Normal: 
1990/1123/sys/src/9/port/devmnt.c:720,7261990/1124/sys/src/9/port/devmnt.c:752,758
1990/0604    
	incref(q); 
	qlock(q); 
	qlocked = 1; 
1990/0511    
	if(waserror()){ 
1990/1124    
	if(waserror()){		/* 2 */ 
1990/0604    
		if(qlocked) 
			qunlock(q); 
		mqfree(q); 
1990/1123/sys/src/9/port/devmnt.c:727,7321990/1124/sys/src/9/port/devmnt.c:759,765
1990/0511    
		nexterror(); 
1990/03081    
	} 
1990/0717    
	mh->readreply = 0; 
1990/1124    
	mh->active = 1; 
1990/0604    
	if((*devtab[q->msg->type].write)(q->msg, mbw->buf, n) != n){ 
		print("short write in mntxmit\n"); 
1990/11211    
		error(Eshortmsg); 
1990/1123/sys/src/9/port/devmnt.c:736,7491990/1124/sys/src/9/port/devmnt.c:769,783
1990/0604    
    Read: 
		qunlock(q); 
		qlocked = 0; 
1990/0703    
		if(waserror()){ 
			mnterrdequeue(q, mh); 
1990/1124    
		if(waserror()){		/* 3 */ 
			mnterrdequeue(m, mh); 
1990/0703    
			nexterror(); 
		} 
1990/0619    
		n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); 
1990/0703    
		poperror(); 
1990/1124    
		poperror();		/* 3 */ 
1990/0619    
		if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ 
1990/0604    
			mnterrdequeue(q, mh); 
1990/1124    
			print("bad reply message\n"); 
			mnterrdequeue(m, mh); 
1990/11211    
			error(Ebadmsg); 
1990/0604    
		} 
		/* 
1990/1123/sys/src/9/port/devmnt.c:755,7671990/1124/sys/src/9/port/devmnt.c:789,800
1990/1123    
		if(tag == mh->thdr.tag){	/* it's mine */ 
1990/0604    
			q->reader = 0; 
			if(w = q->writer){	/* advance a writer to reader */ 
1990/1124    
				mntwunlink(q, w); 
1990/0604    
				q->reader = w->p; 
				q->writer = w->next; 
1990/1123    
				if(q->writer) 
					q->writer->prev = 0; 
1990/0717    
				w->readreply = 1; 
1990/0604    
				wakeup(&w->r); 
			} 
1990/1124    
			mh->active = 0; 
1990/0604    
			qunlock(q); 
			qlocked = 0; 
			goto Respond; 
1990/1123/sys/src/9/port/devmnt.c:774,7831990/1124/sys/src/9/port/devmnt.c:807,814
1990/1123    
			goto Read; 
		} 
		w = &mnthdralloc.arena[tag]; 
		if(!w->writing){ 
			print("reply not writing\n"); 
1990/1124    
		if(w->flushing || !w->active)	/* nothing to do; mntflush will clean up */ 
1990/1123    
			goto Read; 
		} 
		t = mh->mbr; 
		mh->mbr = w->mbr; 
		w->mbr = t; 
1990/1123/sys/src/9/port/devmnt.c:791,7971990/1124/sys/src/9/port/devmnt.c:822,827
1990/0604    
		/* put self in queue */ 
		mh->next = q->writer; 
1990/1123    
		mh->prev = 0; 
		mh->writing = 1; 
		if(q->writer) 
			q->writer->prev = mh; 
1990/0604    
		q->writer = mh; 
1990/1123/sys/src/9/port/devmnt.c:798,8041990/1124/sys/src/9/port/devmnt.c:828,834
1990/0604    
		qunlock(q); 
		qlocked = 0; 
		if(waserror()){		/* interrupted sleep */ 
			mnterrdequeue(q, mh); 
1990/1124    
			mnterrdequeue(m, mh); 
1990/0604    
			nexterror(); 
		} 
1990/0717    
		sleep(&mh->r, mntreadreply, mh); 
1990/1123/sys/src/9/port/devmnt.c:807,8121990/1124/sys/src/9/port/devmnt.c:837,843
1990/0604    
		qlocked = 1; 
		if(q->reader == u->p)	/* i got promoted */ 
			goto Read; 
1990/1124    
		mh->active = 0; 
1990/0604    
		qunlock(q); 
		qlocked = 0; 
		goto Respond; 
1990/1123/sys/src/9/port/devmnt.c:814,8241990/1124/sys/src/9/port/devmnt.c:845,858
1990/0227    
 
1990/0604    
    Respond: 
	mqfree(q); 
	poperror(); 
1990/1124    
	poperror();		/* 2 */ 
1990/11211    
	if(mh->rhdr.type == Rerror){ 
		if(m->mntpt) 
			errors(mh->rhdr.ename); 
		error(Eshutdown); 
1990/1124    
	}else if(mh->rhdr.type != mh->thdr.type+1){ 
		print("bad type %d not %d in mntxmit\n", mh->rhdr.type, mh->thdr.type+1); 
		error(Ebadmsg); 
1990/0227    
	} 
	/* 
	 * Copy out on read 
1990/1123/sys/src/9/port/devmnt.c:830,8361990/1124/sys/src/9/port/devmnt.c:864,870
1990/0703    
	} 
1990/0619    
	mbfree(mh->mbr); 
1990/0227    
	mbfree(mbw); 
	poperror(); 
1990/1124    
	poperror();		/* 1 */ 
1990/0717    
} 
 
mntdump() 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)