Date: Wed, 20 Jan 1999 23:00:34 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Luoqi Chen <luoqi@watermarkgroup.com> Cc: current@FreeBSD.ORG Subject: Re: panic: vinvalbuf: dirty bufs (during reboot, several times) Message-ID: <199901210700.XAA10740@apollo.backplane.com> References: <199901210536.AAA08007@lor.watermarkgroup.com>
next in thread | previous in thread | raw e-mail | index | archive | help
:Sorry, Matt, the patch in my previous email was fatally flawed. Try this one
:below. The two printf() messages don't necessarily come out in pairs and
:it's not just NFS bufs' B_CACHE bits are cleared, so my comment about
:vm_page_is_valid() check in my previous message was wrong and the check is
:needed here.
:
:-lq
Ok, I understand what you've done... you are effectively bypassing
having to check for B_DELWRI in bread(), breadn(), and nfs_bioread()
by forcing getblk() to handle the B_DELWRI condition.
Cool. I'll replace my nfs_bioread() patch with this one and test it
before committing all this stuff to the -4.x branch ( which I will also
do sometime tonight ).
I am also CCing this to current so Greg and Andreas are kept abrest
of events. I think this will fix *both* of their reported panics.
-Matt
Matthew Dillon
<dillon@backplane.com>
:Index: vfs_bio.c
:===================================================================
:RCS file: /home/ncvs/src/sys/kern/vfs_bio.c,v
:retrieving revision 1.193
:diff -u -r1.193 vfs_bio.c
:--- vfs_bio.c 1999/01/19 08:00:51 1.193
:+++ vfs_bio.c 1999/01/21 05:26:10
:@@ -1437,6 +1437,11 @@
:
: if (bp->b_bcount != size) {
: if ((bp->b_flags & B_VMIO) && (size <= bp->b_kvasize)) {
:+printf("getblk: extending buf %ld->%d\n", bp->b_bcount, size);
:+ if (bp->b_flags & B_DELWRI) {
:+ VOP_BWRITE(bp);
:+ goto loop;
:+ }
: allocbuf(bp, size);
: } else {
: if (bp->b_flags & B_DELWRI) {
:@@ -1471,6 +1476,8 @@
: resid = (checksize > (PAGE_SIZE - poffset)) ?
: (PAGE_SIZE - poffset) : checksize;
: if (!vm_page_is_valid(bp->b_pages[i], poffset, resid)) {
:+printf("getblk: clear B_CACHE, bufsize %ld, page %d valid %02x dirty %02x\n",
:+ bp->b_bufsize, i, bp->b_pages[i]->valid, bp->b_pages[i]->dirty);
: bp->b_flags &= ~(B_CACHE | B_DONE);
: break;
: }
:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901210700.XAA10740>
