summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_bufq.c
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2010-05-30 21:23:44 +0000
committerkrw <krw@openbsd.org>2010-05-30 21:23:44 +0000
commita9c1fe4f1fafbf60c639c9400e88b0d29e91c1c9 (patch)
tree0b3b8b29117f423970dc18f11c9147ba0aac8df3 /sys/kern/kern_bufq.c
parentFix ICE on hppa. Variant on minimal fix from GCC PR 34762. (diff)
downloadwireguard-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.c11
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__,