BBN-V6/diffbio

93,102c93
* 
* 	/*
* 	 * The following conditional has been changed to prevent breada's
* 	 * from being initiated if no buffers are available.  This should
* 	 * prevent a type of buffer deadlock.
* 	 */
* 
* 	if (rablkno && !incore(dev, rablkno) &&
* 	    (bfreelist.av_forw != &bfreelist)) {	/* 1Dec78, cdh BBN */
* 
---
. 	if (rablkno && !incore(dev, rablkno)) {
104a96
. #ifndef BUFMOD
105a98,101
. #endif
. #ifdef BUFMOD
. 			brelse(rabp,&bfreelist);
. #endif
128d123
* 
135a131
. #ifndef BUFMOD
136a133,136
. #endif
. #ifdef BUFMOD
. 		brelse(rbp,&bfreelist);
. #endif
163a164
. #ifndef BUFMOD
164a166,169
. #endif
. #ifdef BUFMOD
. 		brelse(rbp,&bfreelist);
. #endif
180a186
. #ifndef BUFMOD
216a223
. #endif
217a225
. #ifdef BUFMOD
218a227,263
.  * release the buffer, with no I/O implied.
.  */
. brelse(bp,freel)
. struct buf *bp,*freel;
. {
. 	register struct buf *rbp, **backp;
. 	register int sps;
. 
. 	rbp = bp;
. 	if (rbp->b_flags&B_WANTED)
. 		wakeup(rbp);
. 	if (freel->b_flags&B_WANTED) {
. 		freel->b_flags =& ~B_WANTED;
. 		wakeup(freel);
. 	}
. 	if (rbp->b_flags&B_ERROR)
. 		rbp->b_dev.d_minor = -1;  /* no assoc. on error */
. 	sps = PS->integ;
. 	spl6();
. 	if (rbp->b_flags & B_AGE) {
. 		backp = &freel->av_forw;
. 		(*backp)->av_back = rbp;
. 		rbp->av_forw = *backp;
. 		*backp = rbp;
. 		rbp->av_back = freel;
. 	} else {
. 		backp = &freel->av_back;
. 		(*backp)->av_forw = rbp;
. 		rbp->av_back = *backp;
. 		*backp = rbp;
. 		rbp->av_forw = freel;
. 	}
. 	rbp->b_flags =& ~(B_WANTED|B_BUSY|B_ASYNC|B_AGE);
. 	PS->integ = sps;
. }
. #endif
. /*
236,242d280
* 
* 
* 
* 
* 
* 
* 
249d286
* 
256,259c293,295
* 	if ( (nb = ip->i_addr[position] ) )
*   		if ( ( bp = incore(nd,nb) ) )
* 	 		if ( bp->b_flags & B_DELWRI )
* 				bp->b_flags =& ~( B_DELWRI );
---
. 	if ( (nb = ip->i_addr[position] ) &&  ( bp = incore(nd,nb) ) &&
. 	     ( bp->b_flags & B_DELWRI ))
. 			bp->b_flags =& ~( B_DELWRI );
264,268c300
* 
* 
* 
* 
* 
---
. #ifndef BUFMOD
315,322d346
* 
* 
* 	/* bbn:mek--- avoid choosing a delayed-write buffer if possible.
* 			(10/12/78) */
* 	for ( bp = bfreelist.av_forw; bp != &bfreelist; bp = bp->av_forw )
* 		if ( ! ( bp->b_flags & B_DELWRI ) ) break;
* 	if ( bp == &bfreelist )		/* no luck! take the next free buffer */
* 		bp = bfreelist.av_forw;
324,325c348
* 
* 	notavail(bp);
---
. 	notavail(bp = bfreelist.av_forw);
341a365
. #endif
342a367,443
. #ifdef BUFMOD
. 
. /* getblk and getsblk are different "entry points" to essentially the
.  * same routine. They differ only in that getblk gets a free buffer block
.  * from bfreelist whereas getsblk takes its from sbfreel.
.  */
. 
. getblk(dev, blkno)
. {
. 	gblk(&bfreelist,dev,blkno);
. }
. 
. getsblk(dev, blkno)
. {
. 	gblk(&sbfreel,dev,blkno);
. }
. 
. gblk(freel,dev, blkno)
. struct buf *freel;
. {
. 	register struct buf *bp;
. 	register struct devtab *dp;
. 	extern lbolt;
. 
. 	if(dev.d_major >= nblkdev)
. 		panic("blkdev");
. 
.     loop:
. 	if (dev < 0)
. 		dp = freel;
. 	else {
. 		dp = bdevsw[dev.d_major].d_tab;
. 		if(dp == NULL)
. 			panic("devtab");
. 		for (bp=dp->b_forw; bp != dp; bp = bp->b_forw) {
. 			if (bp->b_blkno!=blkno || bp->b_dev!=dev)
. 				continue;
. 			spl6();
. 			if (bp->b_flags&B_BUSY) {
. 				bp->b_flags =| B_WANTED;
. 				sleep(bp, PRIBIO+1);
. 				spl0();
. 				goto loop;
. 			}
. 			spl0();
. 			notavail(bp);
. 			return(bp);
. 		}
. 	}
. 	spl6();
. 	if (freel->av_forw == freel) {
. 		freel->b_flags =| B_WANTED;
. 		sleep(freel, PRIBIO+1);
. 		spl0();
. 		goto loop;
. 	}
. 	spl0();
. 	notavail(bp = freel->av_forw);
. 	if (bp->b_flags & B_DELWRI) {
. 		bp->b_flags =| B_ASYNC;
. 		bwrite(bp);
. 		goto loop;
. 	}
. 	bp->b_flags = B_BUSY;
. 	bp->b_back->b_forw = bp->b_forw;
. 	bp->b_forw->b_back = bp->b_back;
. 	bp->b_forw = dp->b_forw;
. 	bp->b_back = dp;
. 	dp->b_forw->b_back = bp;
. 	dp->b_forw = bp;
. 	bp->b_dev = dev;
. 	bp->b_blkno = blkno;
. 	return(bp);
. }
. 
. #endif
. 
392,397d492
* #ifdef PASYNC
* 	if (rbp -> b_flags & B_PASYNC) {/* jsq BBN 2-26-79 */
*                 rbp -> b_flags =& ~(B_BUSY|B_WANTED|B_PASYNC);
*                 wakeup(rbp);
*         } else
* #endif
398a494,497
. #ifdef BUFMOD
. 		brelse(rbp,&bfreelist);
. #endif
. #ifndef BUFMOD
399a499
. #endif
443a544,547
. #ifdef BUFMOD
. 		brelse(bp,&bfreelist);
. #endif
. #ifndef BUFMOD
444a549
. #endif
457a563,594
. #ifdef BUFMOD
. 	/* this routine initializes the control blocks of the system
. 	 * buffers which are in user space
. 	 */
. 
. bsinit(bufadr)
. {
. 	register struct buf *bp;
. 	register int i;
. 
. 	sbfreel.b_forw = sbfreel.b_back =
. 	    sbfreel.av_forw = sbfreel.av_back = &sbfreel;
. 	for (i=0; i<NSBUF; i++) {
. 		bp = &sbuf[i];
. 		bp->b_dev = -1;
. 		bp->b_paddr = bufadr;
. 		bp->b_addr = bufadr<<6;
. 		bp->b_xmem = bufadr>>(16-6);
. 		bufadr =+ (512>>6);
. 		bp->b_back = &sbfreel;
. 		bp->b_forw = sbfreel.b_forw;
. 		sbfreel.b_forw->b_back = bp;
. 		sbfreel.b_forw = bp;
. 		bp->b_flags = B_BUSY;
. 		brelse(bp,&sbfreel);
. 	}
. }
. 
. #endif
. 
. 
. #ifndef GATEWAY
516a654
. #endif
525a664
. #ifdef  CPU70
527c666
* 
---
. #endif
530a670
. #ifdef  CPU70
550a691
. #endif
556c697
* 
---
. #ifdef  CPU70
560a702
. #endif
626a769,770
. 
. #ifndef GATEWAY
635,637c779
* #ifdef PASYNC
* 	int async;      /* jsq BBN 2-26-79 */
* #endif
---
. 
640,643d781
* #ifdef PASYNC                           /* jsq BBN 2-26-79 */
* 	async = rw & B_PASYNC;          /* are we not sleeping? */
* 	if (async && (rw & B_READ)) goto bad;   /* can't read, then */
* #endif
645c783
* 	 * Check odd base, odd count:  address wraparound checked below
---
. 	 * Check odd base, odd count, and address wraparound
647c785
* 	if (base&01 || u.u_count&01)
---
. 	if (base&01 || u.u_count&01 || base>=base+u.u_count)
660d797
* 	 * Check for address wraparound.
663a801
. 	 * (remember wraparound was already checked).
665,667c803,804
* 	if ((base >= (base + u.u_count)) ||
* 	  ((((base+u.u_count)>>6)&01777) >= ts+u.u_dsize
* 	    && nb < 1024-u.u_ssize))
---
. 	if ((((base+u.u_count)>>6)&01777) >= ts+u.u_dsize
. 	    && nb < 1024-u.u_ssize)
680d816
* 		    if (u.u_lcbflg == 0) goto bad;
683,684c819,820
* 		    if (((u.u_lcbmd[ts] >> 8) & 127)    /* does area mapped */
* 			< (nb & 0177))     /* include base? */
---
. 		    if ((u.u_lcbmd[ts] & (127 << 8))    /* does area mapped */
. 			< (((nb & 0177) - 1) << 8))     /* include base? */
686,690c822
* 		    if ((rw & B_READ) && ((u.u_lcbmd[ts] & 07) != RW))
* 			    goto bad;   /* right access?*/
* 		    if ((u.u_lcbma[ts] +
* 		      (((u.u_count + 63) >> 6) & 01777))
* 			> lcba_size)    /* area to transfer too big? */
---
. 		    if (rw && ((u.u_lcbmd[ts] & 07) != RW)) /* right access?*/
691a824,826
. 		    if ((u.u_lcbma[ts] + ((u.u_count + 63 >> 6) & 01777))
. 			> lcba_size)    /* area to transfer too big? */
. 			    goto bad;
716,736c851,862
* #ifdef PASYNC
* 	if (!async) {           /* jsq BBN 2-26-79 */
* #endif
* 		u.u_procp->p_flag =| SLOCK;
* 		(*strat)(bp);
* 		spl6();
* 		while ((bp->b_flags&B_DONE) == 0)
* 			sleep(bp, PRIBIO);
* 		u.u_procp->p_flag =& ~SLOCK;
* 		if (bp->b_flags&B_WANTED)
* 			wakeup(bp);
* 		spl0();
* 		bp->b_flags =& ~(B_BUSY|B_WANTED);
* 		u.u_count = (-bp->b_resid)<<1;
* 		geterror(bp);
* #ifdef PASYNC
* 	} else {                /* jsq BBN 2-26-79 */
* 		(*strat)(bp);
* 		spl0();
* 	}
* #endif
---
. 	u.u_procp->p_flag =| SLOCK;
. 	(*strat)(bp);
. 	spl6();
. 	while ((bp->b_flags&B_DONE) == 0)
. 		sleep(bp, PRIBIO);
. 	u.u_procp->p_flag =& ~SLOCK;
. 	if (bp->b_flags&B_WANTED)
. 		wakeup(bp);
. 	spl0();
. 	bp->b_flags =& ~(B_BUSY|B_WANTED);
. 	u.u_count = (-bp->b_resid)<<1;
. 	geterror(bp);
740a867
. #endif