: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

Reply via email to