1*16Sbill /*	ufs_disksubr.c	3.1	10/14/12	*/
2*16Sbill 
3*16Sbill /*
4*16Sbill  * generalized seek sort for disk
5*16Sbill  */
6*16Sbill 
7*16Sbill #include "../h/param.h"
8*16Sbill #include "../h/systm.h"
9*16Sbill #include "../h/buf.h"
10*16Sbill 
11*16Sbill #define	b_cylin	b_resid
12*16Sbill 
13*16Sbill disksort(dp, bp)
14*16Sbill register struct buf *dp, *bp;
15*16Sbill {
16*16Sbill 	register struct buf *ap;
17*16Sbill 	struct buf *tp;
18*16Sbill 
19*16Sbill 	ap = dp->b_actf;
20*16Sbill 	if(ap == NULL) {
21*16Sbill 		dp->b_actf = bp;
22*16Sbill 		dp->b_actl = bp;
23*16Sbill 		bp->av_forw = NULL;
24*16Sbill 		return;
25*16Sbill 	}
26*16Sbill 	tp = NULL;
27*16Sbill 	for(; ap != NULL; ap = ap->av_forw) {
28*16Sbill 		if ((bp->b_flags&B_READ) && (ap->b_flags&B_READ) == 0) {
29*16Sbill 			if (tp == NULL)
30*16Sbill 				tp = ap;
31*16Sbill 			break;
32*16Sbill 		}
33*16Sbill 		if ((bp->b_flags&B_READ) == 0 && (ap->b_flags&B_READ))
34*16Sbill 			continue;
35*16Sbill 		if(ap->b_cylin <= bp->b_cylin)
36*16Sbill 			if(tp == NULL || ap->b_cylin >= tp->b_cylin)
37*16Sbill 				tp = ap;
38*16Sbill 	}
39*16Sbill 	if(tp == NULL)
40*16Sbill 		tp = dp->b_actl;
41*16Sbill 	bp->av_forw = tp->av_forw;
42*16Sbill 	tp->av_forw = bp;
43*16Sbill 	if(tp == dp->b_actl)
44*16Sbill 		dp->b_actl = bp;
45*16Sbill }
46