summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_bio.c72
1 files changed, 68 insertions, 4 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 97be296ac4d..27d8a10fd33 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_bio.c,v 1.45 2001/10/11 14:44:10 art Exp $ */
+/* $OpenBSD: vfs_bio.c,v 1.46 2001/10/28 00:42:43 art Exp $ */
/* $NetBSD: vfs_bio.c,v 1.44 1996/06/11 11:15:36 pk Exp $ */
/*-
@@ -524,6 +524,8 @@ brelse(bp)
/* Block disk interrupts. */
s = splbio();
+ KASSERT(ISSET(bp->b_flags, B_BUSY));
+
/*
* Determine which queue the buffer should be on, then put it there.
*/
@@ -757,6 +759,7 @@ allocbuf(bp, size)
if (bp->b_bufsize == desired_size)
goto out;
+ KASSERT(!ISSET(bp->b_flags, (B_CACHE|B_DONE|B_DELWRI)));
/*
* If the buffer is smaller than the desired size, we need to snarf
* it from other buffers. Get buffers (via getnewbuf()), and
@@ -797,7 +800,7 @@ allocbuf(bp, size)
*/
if (bp->b_bufsize > desired_size) {
s = splbio();
- if ((nbp = bufqueues[BQ_EMPTY].tqh_first) == NULL) {
+ if ((nbp = TAILQ_FIRST(&bufqueues[BQ_EMPTY])) == NULL) {
/* No free buffer head */
splx(s);
goto out;
@@ -873,6 +876,8 @@ start:
bremfree(bp);
+ KASSERT(!ISSET(bp->b_flags, B_BUSY));
+
/* Buffer is no longer on free lists. */
SET(bp->b_flags, B_BUSY);
@@ -1041,9 +1046,11 @@ biodone(bp)
CLR(bp->b_flags, B_CALL); /* but note callout done */
(*bp->b_iodone)(bp);
} else {
- if (ISSET(bp->b_flags, B_ASYNC)) {/* if async, release it */
+ if (ISSET(bp->b_flags, B_ASYNC)) {
+ /* if async, release it */
brelse(bp);
- } else { /* or just wakeup the buffer */
+ } else {
+ /* or just wakeup the buffer */
CLR(bp->b_flags, B_WANTED);
wakeup(bp);
}
@@ -1052,6 +1059,63 @@ biodone(bp)
#ifdef DEBUG
/*
+ * Print as much as possible about a buffer.
+ */
+void
+buf_print(struct buf *bp)
+{
+ int f = 1;
+
+#define FLAG(fl) if (bp->b_flags & (fl)) { if (!f) printf(", "); else f = 0; printf(#fl); }
+
+ printf("b_proc: %p\n", bp->b_proc);
+ printf("b_error: %d\n", bp->b_error);
+ printf("b_bufsize: %ld\n", bp->b_bufsize);
+ printf("b_bcount: %ld\n", bp->b_bcount);
+ printf("b_resid: %ld\n", (long)bp->b_resid);
+ printf("b_dev: (%d,%d)\n", minor(bp->b_dev), major(bp->b_dev));
+ printf("b_data: %p\n", bp->b_data);
+ printf("b_blkno: %ld\n", (long)bp->b_blkno);
+ printf("b_lblkno: %ld\n", (long)bp->b_lblkno);
+
+ printf("b_flags: ");
+
+ FLAG(B_AGE);
+ FLAG(B_NEEDCOMMIT);
+ FLAG(B_ASYNC);
+ FLAG(B_BAD);
+ FLAG(B_BUSY);
+ FLAG(B_CACHE);
+ FLAG(B_CALL);
+ FLAG(B_DELWRI);
+ FLAG(B_DIRTY);
+ FLAG(B_DONE);
+ FLAG(B_EINTR);
+ FLAG(B_ERROR);
+ FLAG(B_GATHERED);
+ FLAG(B_INVAL);
+ FLAG(B_LOCKED);
+ FLAG(B_NOCACHE);
+ FLAG(B_PAGET);
+ FLAG(B_PGIN);
+ FLAG(B_PHYS);
+ FLAG(B_RAW);
+ FLAG(B_READ);
+ FLAG(B_TAPE);
+ FLAG(B_UAREA);
+ FLAG(B_WANTED);
+ FLAG(B_WRITE);
+ FLAG(B_WRITEINPROG);
+ FLAG(B_XXX);
+ FLAG(B_DEFERRED);
+ FLAG(B_SCANNED);
+
+ printf("\n");
+
+#undef FLAG
+}
+
+/*
* Print out statistics on the current allocation of the buffer pool.
* Can be enabled to print out on every ``sync'' by setting "syncprt"
* in vfs_syscalls.c using sysctl.