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