Date: Wed, 20 Jan 1999 12:23:59 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Bjoern Fischer <bfischer@TechFak.Uni-Bielefeld.DE>, current@FreeBSD.ORG Subject: Re: panic: vinvalbuf: dirty bufs (during reboot, several times) Message-ID: <199901202023.MAA06937@apollo.backplane.com> References: <19990120073445.A402@titan.klemm.gtn.com> <199901200700.XAA76802@apollo.backplane.com> <19990120132700.A15521@voliere.TechFak.Uni-Bielefeld.DE> <199901201923.LAA05838@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Try this. In nfs_bioread(), nfs/nfs_bio.c: Before, it was: if (getpages && !(bp->b_flags & B_VMIO)) { #ifdef DIAGNOSTIC printf("nfs_bioread: non vmio buf found, discarding\n"); Try changin the if() to this: if ( (getpages && !(bp->b_flags & B_VMIO)) || (bp->b_flags & (B_CACHE|B_DELWRI)) == B_DELWRI ) { #ifdef DIAGNOSTIC printf("nfs_bioread: non vmio buf found, discarding\n"); #endif I believe what is going on is that bioread() is misinterpreting B_CACHE to mean that it can discard the entire buffer. If B_DELWRI is set, however, it must sync the buffer first. What is occuring is that when a program write()'s non-contiguously and then lseek's back and read()'s again, B_CACHE is getting cleared and the buffer is being re-read from NFS without first being flushed to NFS, causing the written data to be overwritten by the read. I have NOT tested this well. It seems to solve the vi SEG fault problem. -Matt Matthew Dillon <dillon@backplane.com> 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?199901202023.MAA06937>