summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_disklabel.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2001-01-14 18:48:42 +0000
committerphk <phk@FreeBSD.org>2001-01-14 18:48:42 +0000
commit27cbeb032534a3edf670bf20992b62777127d3ec (patch)
tree776b4a69d3182f2e3a01133206b917cf54745574 /sys/kern/subr_disklabel.c
parent27c5605b6a929fa95f8bae642f16db7bc01f508f (diff)
downloadFreeBSD-src-27cbeb032534a3edf670bf20992b62777127d3ec.zip
FreeBSD-src-27cbeb032534a3edf670bf20992b62777127d3ec.tar.gz
A bit of sanity-checking in bioqdisksort(): panic if we recurse.
Diffstat (limited to 'sys/kern/subr_disklabel.c')
-rw-r--r--sys/kern/subr_disklabel.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/kern/subr_disklabel.c b/sys/kern/subr_disklabel.c
index 1b18c7d..6f948b0 100644
--- a/sys/kern/subr_disklabel.c
+++ b/sys/kern/subr_disklabel.c
@@ -47,6 +47,7 @@
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <sys/syslog.h>
+#include <machine/atomic.h>
/*
* Seek sort for disks.
@@ -72,6 +73,8 @@ bioqdisksort(bioq, bp)
struct bio *bn;
struct bio *be;
+ if (!atomic_cmpset_int(&bioq->busy, 0, 1))
+ panic("Recursing in bioqdisksort()");
be = TAILQ_LAST(&bioq->queue, bio_queue);
/*
* If the queue is empty or we are an
@@ -80,6 +83,7 @@ bioqdisksort(bioq, bp)
if ((bq = bioq_first(bioq)) == NULL
|| (bp->bio_flags & BIO_ORDERED) != 0) {
bioq_insert_tail(bioq, bp);
+ bioq->busy = 0;
return;
} else if (bioq->insert_point != NULL) {
@@ -108,6 +112,7 @@ bioqdisksort(bioq, bp)
if (bq == NULL) {
bioq->switch_point = bp;
bioq_insert_tail(bioq, bp);
+ bioq->busy = 0;
return;
}
/*
@@ -118,6 +123,7 @@ bioqdisksort(bioq, bp)
if (bp->bio_pblkno < bq->bio_pblkno) {
bioq->switch_point = bp;
TAILQ_INSERT_BEFORE(bq, bp, bio_queue);
+ bioq->busy = 0;
return;
}
} else {
@@ -130,6 +136,7 @@ bioqdisksort(bioq, bp)
*/
if (bp->bio_pblkno < bq->bio_pblkno) {
TAILQ_INSERT_BEFORE(bq, bp, bio_queue);
+ bioq->busy = 0;
return;
}
}
@@ -141,6 +148,7 @@ bioqdisksort(bioq, bp)
*/
if (bp->bio_pblkno > be->bio_pblkno) {
TAILQ_INSERT_AFTER(&bioq->queue, be, bp, bio_queue);
+ bioq->busy = 0;
return;
}
@@ -158,6 +166,7 @@ bioqdisksort(bioq, bp)
bq = bn;
}
TAILQ_INSERT_AFTER(&bioq->queue, bq, bp, bio_queue);
+ bioq->busy = 0;
}
OpenPOWER on IntegriCloud