diff options
| author | 2010-05-30 21:23:44 +0000 | |
|---|---|---|
| committer | 2010-05-30 21:23:44 +0000 | |
| commit | a9c1fe4f1fafbf60c639c9400e88b0d29e91c1c9 (patch) | |
| tree | 0b3b8b29117f423970dc18f11c9147ba0aac8df3 /sys/kern/kern_bufq.c | |
| parent | Fix ICE on hppa. Variant on minimal fix from GCC PR 34762. (diff) | |
| download | wireguard-openbsd-a9c1fe4f1fafbf60c639c9400e88b0d29e91c1c9.tar.xz wireguard-openbsd-a9c1fe4f1fafbf60c639c9400e88b0d29e91c1c9.zip | |
Tweak bufq code to handle corner cases. Makes upcoming cd(4)
conversion to bufq work. Taken from n2k10 scsi buf queueing code.
ok thib@
Diffstat (limited to 'sys/kern/kern_bufq.c')
| -rw-r--r-- | sys/kern/kern_bufq.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/kern/kern_bufq.c b/sys/kern/kern_bufq.c index 402ca4ec473..ac41ca803a8 100644 --- a/sys/kern/kern_bufq.c +++ b/sys/kern/kern_bufq.c @@ -143,6 +143,7 @@ bufq_disksort_requeue(struct bufq *bq, struct buf *bp) mtx_enter(&bq->bufq_mtx); bp->b_actf = bufq->b_actf; + bufq->b_actf = bp; if (bp->b_actf == NULL) bufq->b_actb = &bp->b_actf; mtx_leave(&bq->bufq_mtx); @@ -156,12 +157,12 @@ bufq_disksort_dequeue(struct bufq *bq, int peeking) mtx_enter(&bq->bufq_mtx); bufq = (struct buf *)bq->bufq_data; bp = bufq->b_actf; - if (bp == NULL) { - mtx_leave(&bq->bufq_mtx); - return (NULL); + if (!peeking) { + if (bp != NULL) + bufq->b_actf = bp->b_actf; + if (bufq->b_actf == NULL) + bufq->b_actb = &bufq->b_actf; } - if (!peeking) - bufq->b_actf = bp->b_actf; mtx_leave(&bq->bufq_mtx); DNPRINTF(BUFQDBG_DISKSORT, "%s: %s buf %p from bufq %p\n", __func__, |
