diff options
author | phk <phk@FreeBSD.org> | 2001-01-14 18:48:42 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2001-01-14 18:48:42 +0000 |
commit | 27cbeb032534a3edf670bf20992b62777127d3ec (patch) | |
tree | 776b4a69d3182f2e3a01133206b917cf54745574 /sys/kern/subr_disklabel.c | |
parent | 27c5605b6a929fa95f8bae642f16db7bc01f508f (diff) | |
download | FreeBSD-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.c | 9 |
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; } |