- Make getiobuf() return buffers marked BUSY.

- Sprinkle more assertions.
This commit is contained in:
ad 2008-06-06 12:49:15 +00:00
parent a36c431c01
commit 6a33531fe1
1 changed files with 19 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_bio.c,v 1.201 2008/05/31 13:41:44 ad Exp $ */
/* $NetBSD: vfs_bio.c,v 1.202 2008/06/06 12:49:15 ad Exp $ */
/*-
* Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
@ -107,7 +107,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.201 2008/05/31 13:41:44 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.202 2008/06/06 12:49:15 ad Exp $");
#include "fs_ffs.h"
#include "opt_bufcache.h"
@ -968,7 +968,9 @@ brelsel(buf_t *bp, int set)
struct vnode *vp;
KASSERT(mutex_owned(&bufcache_lock));
KASSERT(!cv_has_waiters(&bp->b_done));
KASSERT(bp->b_refcnt > 0);
SET(bp->b_cflags, set);
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
@ -1296,10 +1298,6 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
if (bp != NULL) {
memset((char *)bp, 0, sizeof(*bp));
buf_init(bp);
bp->b_dev = NODEV;
bp->b_vnbufs.le_next = NOLIST;
bp->b_cflags = BC_BUSY;
bp->b_refcnt = 1;
mutex_enter(&bufcache_lock);
#if defined(DIAGNOSTIC)
bp->b_freelistindex = -1;
@ -1311,7 +1309,12 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
if ((bp = TAILQ_FIRST(&bufqueues[BQ_AGE].bq_queue)) != NULL ||
(bp = TAILQ_FIRST(&bufqueues[BQ_LRU].bq_queue)) != NULL) {
KASSERT(!cv_has_waiters(&bp->b_done));
KASSERT(!ISSET(bp->b_cflags, BC_BUSY));
bremfree(bp);
/* Buffer is no longer on free lists. */
SET(bp->b_cflags, BC_BUSY);
} else {
/*
* XXX: !from_bufq should be removed.
@ -1344,8 +1347,8 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq)
goto start;
}
/* Buffer is no longer on free lists. */
SET(bp->b_cflags, BC_BUSY);
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
KASSERT(bp->b_refcnt > 0);
/*
* If buffer was a delayed write, start it and return NULL
@ -1446,6 +1449,9 @@ int
biowait(buf_t *bp)
{
KASSERT(ISSET(bp->b_cflags, BC_BUSY));
KASSERT(bp->b_refcnt > 0);
mutex_enter(bp->b_objlock);
while (!ISSET(bp->b_oflags, BO_DONE | BO_DELWRI))
cv_wait(&bp->b_done, bp->b_objlock);
@ -2008,10 +2014,13 @@ buf_init(buf_t *bp)
bp->b_dev = NODEV;
bp->b_error = 0;
bp->b_flags = 0;
bp->b_cflags = 0;
bp->b_cflags = BC_BUSY;
bp->b_oflags = 0;
bp->b_objlock = &buffer_lock;
bp->b_iodone = NULL;
bp->b_refcnt = 1;
bp->b_dev = NODEV;
bp->b_vnbufs.le_next = NOLIST;
BIO_SETPRIO(bp, BPRIO_DEFAULT);
}