: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 <dil...@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 majord...@freebsd.org with "unsubscribe freebsd-current" in the body of the message