struct sstf_queue { TAILQ_HEAD(sstfq, buf) queue; daddr_t lastpos; }; #define sstf_init(q) do { \ TAILQ_INIT(&(q)->queue); \ (q)->lastpos = 0; \ } while(0) #define sstf_enqueue(q,bp) TAILQ_INSERT_TAIL(&(q)->queue, (bp), b_act) #define sstf_dequeue(q,bp) do { \ TAILQ_REMOVE(&(q)->queue, (bp), b_act); \ (q)->lastpos = (bp)->b_pblkno; \ } while(0) #define sstf_iodone(q,bp) do { \ (q)->lastpos = (bp)->b_pblkno; \ } while(0) struct buf *sstf_select(struct sstf_queue *q) { struct buf *bp, *bq = 0; int t0 = INT_MAX; TAILQ_FOREACH(bp, &q->queue, b_act) { int t = (bp->b_pblkno - q->lastpos); if (t < 0) t = -t; if (!bq || t < t0) t0 = t, bq = bp; } return bq; } #define sstf_foreach(q,bp) TAILQ_FOREACH(bp, &(q)->queue, b_act)